web-dev-qa-db-ja.com

strace出力のbrk()に数秒かかるのはなぜですか?

Ubuntu Hardy、AMD64に移行すると、アプリケーションの1つが大幅に遅くなることに気づきました。 Debian Sargei386で完全に動作します。

(Apache 1.3)httpdプロセスに対して 'strace -r'を実行すると、次の問題のあるセクションが表示されます。

 0.000083 poll([{fd = 8、events = POLLIN | POLLERR、revents = POLLIN}]、1、-1)= 1 
 0.000026 recvfrom(8、 "_323-412D\0\0\0000\0\2\0\0\0\17recueil-cours "...、32727、0、NULL、NULL)= 8192 
 0.000061 poll([{fd = 8、events = POLLIN | POLLERR、revents = POLLIN}]、1、-1)= 1 
 0.000026 recvfrom(8、 "\ 0\0\0000\0\2\0\0\0\17recueil-courses\0\0\0\23er2 "...、32767、0、NULL、NULL)= 2369 
 0.117422 brk(0x397a000)= 0x397a000 
 0.140721 brk(0x399b000)= 0x399b000 
 4.457037 brk (0x39bc000)= 0x39bc000 
 0.078792 stat( "/ opt/semantico/slot/nijhoff/3/sitecode/live/public_home.html"、{st_mode = S_IFREG | 0644、st_size = 2194、...}) = 0 

最後の1行のbrkに注意してください。これは、brk(0x399b000)に4.45秒かかったことを意味します。

より大きなデータセグメント/ヒープを要求するために使用されていることを示すbrkのマニュアルページを確認しましたが、これほど時間がかかる理由はわかりません。

誰かアイデアがありますか?

5
Mike Pountney

この問題は、主にstrace-rの出力についての私の誤解によるものであることが判明しました。

'-r'オプションは時間(秒単位)を示します 以来 最後のシステムコールの実行にかかった時間ではなく、最後のシステムコール。

この例では、CPUは、brk()を処理するのではなく、何らかの計算を実行することをやめていました。

ここでの問題は解決されました-これはPerl5.8.9へのアップグレード(Perl 5.8.8から)が原因でした。 Perlのアップグレードを取り消しました。後で、Perl5.8.9の速度低下の原因を調査します。

8
Mike Pountney

brk()は、mallocが使用可能なメモリプールを拡張する方法です。これは、カーネルがメモリシェルゲームを交換またはプレイして、返すのに十分な大きさの新しいメモリセグメントを見つける可能性があることを意味します。したがって、パフォーマンスは予測できません。とは言うものの、メモリ割り当て戦略を変更するために、メモリ使用チューナブルのいくつかを調べたいと思うかもしれません(sysctl -a | grep ^ vmは探し始めるのに良い場所を提供するはずです)。

7
pjz