さまざまなリモート クライアントを受け入れ、select()
さまざまなハンドラーにジョブを分散するためのアプリケーションを作成しました。ARM926EJ-S とカーネル 2.6.33-rc4 を実行している 1 つのプラットフォームで、アプリケーションが大量の CPU を使用していることに気付きました! strace -cを使用してアプリケーションを 30 秒間実行すると、次のようになります。
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
98.47 3.680000 204444 18 select
...
ただし、リモート クライアントからアプリケーションに継続的にデータを送信すると、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
、クリティカル セクションが原因でパフォーマンスが向上するかどうかはわかりません。
インターネットで興味深い記事を 2 つ読みました。
残念ながら、それらはかなり古いものです ('98/'99 以降) 他の誰かがそのような問題に直面したかどうか、またはパフォーマンスを改善するための提案や実際の問題を指摘する他の提案があったかどうかを知りたいですか?
編集:
クライアントがデータを送信しないにもかかわらず、より多くのクライアントが接続され、アプリケーションが CPU を使用していることに気付きました! ほとんどの時間が選択に費やされるため、選択自体がより多くの CPU を消費すると思いました。アプリケーションをプロファイリングして問題を指摘するために、ARM の下で使用できる他の無料ツールは何ですか? Valgrind は (まだ) ARM9 では動作しません ...