2012-06-22 80 views
2

我編寫了一個應用程序,接受不同的遠程客戶端,並且基於select()將作業分配給不同的處理程序。我注意到在一個運行ARM926EJ-S和內核2.6.33-rc4的平臺上,應用程序使用了大量的CPU!以下是我可以通過我的運行與strace的30秒應用-c看到:select()系統調用是CPU消耗

% time  seconds usecs/call  calls errors syscall 
------ ----------- ----------- --------- --------- ---------------- 
98.47 3.680000  204444  18   select 
... 

但是,如果我從我的遠程客戶端不斷地發送數據到應用,CPU選擇使用少得多!

% time  seconds usecs/call  calls errors syscall 
------ ----------- ----------- --------- --------- ---------------- 
44.69 0.340278   175  1945   gettimeofday 
40.71 0.310000  25833  12   select 
    3.94 0.030000  30000   1   fsync 
... 

我想知道是否select()實施與繁忙的等待。然而,在一個運行MIPS處理器和2.6.30.10 Linux內核的舊版平臺上,儘管我應該交叉編譯strace以確認......,但這個問題並沒有出現。而且由於數據「很少」發送,所以我大部分情況都是最糟糕的!

我想知道問題出在哪裏! C庫? Linux內核?另一方面,由於pthread,臨界區......,我不確定寫多線程應用程序是否會帶來更好的性能?

我在網上看了兩個有趣的文章:

不幸的是,他們是很老的(從98年/ 99年),我想知道,如果有人遇到過這種問題,或者如果您有任何其他建議來改善性能或指出真正的問題?

編輯
我注意到,更多的客戶端連接更多的我的應用程序使用的CPU,這儘管客戶端不發送任何數據!由於大部分時間都花在select上,我通過選擇本身消耗更多的CPU! 我可以在ARM下使用哪些其他免費工具來分析我的應用程序並指出問題所在? Valgrind在ARM9上不工作(還)...

+1

是什麼讓你說選擇消耗大量的CPU時間?第一個痕跡清楚地表明,選擇花費了很多時間,是的,但這就是你期望看到的。呼叫會阻止,直到有數據可以採取行動。 –

回答

7

strace -c不測量CPU花費的時間,但在系統調用花費的總時間。請參閱其手冊頁:

計算每個系統調用的時間,調用和錯誤並報告程序退出時的摘要摘要 。

因此,如果您在低負載下不會有select的高百分比,實際上會很糟糕!

您可以使用perflinux-tools包在debian/ubuntu上)來測量整體性能,包括內核代碼。

+0

當然,但也許這個評論混淆了我的manpage,比你的引用稍微深一點:「在Linux上,它試圖顯示與掛鐘時間無關的系統時間(在內核中運行的CPU時間)。「 – morandg

+0

是的,但是因爲'select'是特殊的,所以它會阻塞,直到發生一些外部事件,但是」嘗試「可能會失敗,儘管我不熟悉strace的內部結構。它會在這種情況下測量CPU時間。 – mensi