我編寫了一個應用程序,接受不同的遠程客戶端,並且基於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
,臨界區......,我不確定寫多線程應用程序是否會帶來更好的性能?
我在網上看了兩個有趣的文章:
- "Scalable kernel performance for Internet servers under realistic loads"
- "A scalable and explicit event delivery mechanism for UNIX"
不幸的是,他們是很老的(從98年/ 99年),我想知道,如果有人遇到過這種問題,或者如果您有任何其他建議來改善性能或指出真正的問題?
編輯:
我注意到,更多的客戶端連接更多的我的應用程序使用的CPU,這儘管客戶端不發送任何數據!由於大部分時間都花在select上,我通過選擇本身消耗更多的CPU! 我可以在ARM下使用哪些其他免費工具來分析我的應用程序並指出問題所在? Valgrind在ARM9上不工作(還)...
是什麼讓你說選擇消耗大量的CPU時間?第一個痕跡清楚地表明,選擇花費了很多時間,是的,但這就是你期望看到的。呼叫會阻止,直到有數據可以採取行動。 –