很多使用者都用UnixBench做性能測試,并做廠商之間的對比,那UnixBench到底做了哪些性能測試,本篇從代碼層面闡述UnixBench做了哪些測試。
在細說UnixBench的實作之前,先放一個總結果
UnixBench算分介紹 有類似結果,然後一個個解釋。 從結果可以看出,結果分為兩塊,一塊為單程序,一塊為多程序,多程序數目預設取決于CPU數目,多程序的測試僅僅是增加了程序數目,記憶體其實跟單程序一模一樣,是以下面的描述都是針對單程序的。Dhrystone 2 using register variables
這裡有比較詳細的
dhrystone介紹,這個主要是測整數性能,對應的浮點數測試是:Double-Precision Whetstone。
恕我眼拙,那一坨運算實在不知所雲,于是上網搜了一堆文章,大意是可以通過編譯優化提高性能,不能真實反映CPU性能。這篇文章比較有典型意義:
Benchmarking in context: Dhrystone。
那繞開裡面一坨計算,說下輸出:預設就是在10秒内,那一坨計算能計算次數,算出分數後,參考前面篇
,算出Index分數。
Double-Precision Whetstone
既然有整數運算的CPU性能,那麼浮點數運算性能也希望有,于是就有了:whets.c 它的代碼品質就高多了,我終于讀懂了。
- 它需要得到一個合适的參數. 怎麼得出這個運算呢:有坨運算,随着傳入參數(xtra)變大,耗時會逐漸增減,當耗時增加到超過2秒時,參數停止變大。
UnixBench的實作介紹 - 如果跑10秒大概的參數會是怎樣呢:
625*10/1.238352=5047
- 根據輸入參數,去計算結果,之前一直沒有說,那一坨計算是什麼,總共分為8步,英文解釋還是比較清楚的,采納了其中的浮點數分數,不過它的時間怎麼把其他計算的時間也算在裡面了,既然隻關心浮點數運算,為什麼還要加入N3,N4,N5,N7,N8這幾步,後續計算參考前面算法規則
UnixBench的實作介紹
Execl Throughput
除了前面介紹的那兩個比較複雜,UnixBench其他的運算都比較簡單,Execl它的實際就是遞歸調用,它主要利用的是execl函數。本身execl.c編譯出來後的執行檔案是execl的二進制檔案,execl函數執行的時候記錄參數:開始時間,執行次數,耗時(一般都是10秒)。當本次總執行時間耗時超過10秒時,輸出執行次數,然後根據算分規則算分,這個思想還是很巧妙的。
File Copy
這個主要是測試的write和read兩個函數,測試30秒。實作很簡單,先寫入一個檔案2秒(循環寫入),再讀2秒,然後從剛剛寫入的檔案讀取資料,寫入到另一個檔案,循環寫入,在30秒的讀寫次數。 不同的參數測試測的是不同塊大小,不同塊數的性能,如果測試磁盤建議用FIO測試。
Pipe Throughput
打開一個管道,往管道寫入512個bytes,再讀出來,測試10秒,總共讀寫次數
Pipe-based Context Switching
打開兩個管道,開啟兩個程序,其中一個程序往管道1寫,往管道2讀,另一個程序往管道2寫,往管道2讀,一個程序完成一次讀寫,計數+1。其中一個很有意思的事情:如果這兩個程序在同一個CPU和不同的CPU有完全不同的性能,在同一個CPU下性能會好很多。這裡有篇很細緻的分析,值得大家評閱:
Unixbench 測試套件缺陷深度分析Process Creation
就是不停調用fork函數,建立程序,并立馬退出,成功一次計數+1。
Shell Scripts
通過fork函數,建立程序,不停地執行一個腳本, 執行成功一次+1. 所謂Shell Scripts (1 concurrent) 一個并發是指傳遞給腳本:pgms/multi.sh 參數是1,同樣Shell Scripts (8 concurrent) ,傳遞給腳本的參數是8,同時8個子任務并發執行。
System Call Overhead
本意是想計算進入離開作業系統的開銷,進入離開一次計數+1,在10秒内的執行次數. 實際執行的效果是fork子程序,waitpid函數後退出,計數+1
上述把UnixBench的預設實作都介紹了下,很簡單,但很有意思!