web-dev-qa-db-ja.com

ApacheプロセスはCPUを消費しすぎます

Phpを実行しているubuntuApache/phpサーバーでappx100 hits/secを実行し、バックグラウンドでPHP cronを実行しています。

トラフィックやcronアクティビティに関係なく、高いままであるApacheプロセスの1つでCPU負荷が高くなることがあります。それはある種のループか何かで立ち往生しているように私には思えます。

以下に、topとstraceの情報を示します。

悪いコードがどこにあり、何が原因であるかをどのように見つけることができますか?

top - 14:45:24 up 3 days,  3:38,  1 user,  load average: 5.10, 5.88, 5.85
Tasks: 163 total,   5 running, 158 sleeping,   0 stopped,   0 zombie
Cpu(s): 47.8%us, 18.5%sy,  0.0%ni, 10.2%id,  0.0%wa,  0.0%hi,  1.8%si, 21.6%st
Mem:   7885012k total,  3858484k used,  4026528k free,   177444k buffers
Swap:        0k total,        0k used,        0k free,  1037868k cached
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
10736 www-data  20   0  769m 559m 478m R   69  7.3  29:08.30 Apache2
10844 www-data  20   0  824m 601m 492m S   17  7.8   4:37.90 Apache2
 1016 root      20   0  242m  25m 4628 S    6  0.3 162:07.93 scalarizr
 9030 www-data  20   0  879m 619m 492m S    4  8.0   5:06.82 Apache2
20216 www-data  20   0  747m 228m 170m S    4  3.0   0:01.94 Apache2
10807 www-data  20   0  814m 584m 492m S    3  7.6   4:54.10 Apache2
10455 www-data  20   0  831m 574m 492m S    3  7.5   4:32.65 Apache2
10495 www-data  20   0  849m 592m 492m S    3  7.7   4:41.10 Apache2
10884 www-data  20   0  840m 581m 492m S    3  7.6   4:25.06 Apache2




^CProcess 10736 detached
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 74.55    0.148052           1    109755           gettimeofday
 25.36    0.050370           0    164634           clock_gettime
  0.09    0.000178           0     54878           poll
------ ----------- ----------- --------- --------- ----------------
100.00    0.198600                329267           total
root@ec2-67-202-54-36:~# ^C
3
Niro

Apacheを有効にすることをお勧めします mod_status そしてExtendedStatusをオンにします。 Slicehostには、これを実現する方法について 優れた記事 があります(「elinks」パッケージと「lynx」を使用しますが、これは個人的な好みです)。 ApacheサーバーステータスURLを表示すると、PID、VHost、およびRequest列が表示されます。これらは、実行されている特定のコードまでさかのぼって使用できる、呼び出されているURIを特定するのに大いに役立つはずです。 。

Mod_statusを有効にするためにカスタマイズされたSlicehostの記事を次に示します。

Sudo apt-get install elinks
Sudo /usr/sbin/a2enmod status
Sudo sh -c "echo 'ExtendedStatus On' > /etc/Apache2/conf.d/extendedstatus"
Sudo vi /etc/Apache2/sites-available/server-status

<Location /server-status>
    SetHandler server-status
    Order deny,allow
    Deny from all
    Allow from localhost
</Location>

Sudo /usr/sbin/a2ensite server-status
Sudo apachectl configtest
Sudo service Apache2 reload

次に、サーバーステータスを表示するには:

elinks -dump -dump-width 256 http://localhost/server-status
5
dialt0ne

ホーリーマホニー!あなたのApacheはあまりにも多くのメモリを消費しているようです。一体何を実行しているのですか?たくさんのApacheモジュールがロードされていますか?あまりメモリに優しいルールを使用していないmod_securityはありますか?あなたのサイトはマゼンタのような地獄から何かを実行していますか?また、何かが本当にあなたのPHPスクリプトを現在の時刻について本当に興味深くさせます。:D

とにかく、PHPプロファイリングにはXDebugを使用でき、結果を分析するには、たとえばKCacheGrindを使用すると、結果がグラフィカルに簡単に表示されます。 -フォームを読む。

リアルタイムのパフォーマンス分析の場合、最新のLinuxディストリビューションにはperfコマンドがあり、従来のtopと似ていますが、単一のプロセスにドリルダウンできます。何が起こっているかをアセンブリレベルで確認できます。

1

プログラムをウォークスルーして無限ループを見つけるには、たとえば xdebug などのデバッガーを使用する必要があります。

0
Stone

問題を切り分けるために使用できるいくつかのオプションがあります。

明らかに、ログをチェックして、報告されている問題があるかどうかを確認する必要があります。

/var/log/access_log 
/var/log/php_error
/var/log/error_log

Topの実行中にCを押すと、このような高いCPUで実行されているプロセスに関する追加データも表示されます。

DialtOneが述べたように、mod_statusをインストールして、追加の詳細を取得することもできます。

Phpをどのように使用しているかはわかりませんが、memcacheとAPCをマシンにインストールすると、リソースをさらに節約できます。 memcacheを使用する場合は、最初にデータベースルックアップのためにキャッシュを参照するようにコードを構成する必要があります。これにより、頻繁にデータベースを検索するアクセスの多いサイトでのオーバーヘッドを大幅に節約できます。

Phpのメモリ設定やデータベースが使用するものを調整することも、負荷の制御に役立ちます。

これは、php.iniおよびデータベース構成ファイルにあります。

データベース呼び出しを使用している場合は、遅いクエリを探すことができます。

他のオプションは、子プロセスと子あたりのプロセス数を拡張することです。これは、httpd.confで構成できます。

プロセッサの数にもよりますが、5の負荷は最悪ではありません。私が以前に非常に高い負荷を見たことがあり、サイトはまだ正常に配信されている、より大きなWebサーバーのいくつか。それは本当にあなたがサイトを微調整するのにどれだけのエネルギーを費やしたいかです。

頑張ってください!

0
J Baron