2

さまざまなリモート クライアントを受け入れ、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 では動作しません ...

4

1 に答える 1

7

strace -c費やされたCPU時間ではなく、syscallで費やされた全体的な時間を測定します。そのマンページを参照してください:

各システムコールの時間、呼び出し、およびエラーをカウントし、プログラムの終了時に要約を報告します。

selectしたがって、低負荷で高い割合を使用しないと、実際には悪い結果になります。

perflinux-toolsdebian / ubuntuのパッケージ)を使用して、カーネルコードを含む全体的なパフォーマンスを測定できます。

于 2012-06-22T12:16:40.743 に答える