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
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
ホーリーマホニー!あなたのApacheはあまりにも多くのメモリを消費しているようです。一体何を実行しているのですか?たくさんのApacheモジュールがロードされていますか?あまりメモリに優しいルールを使用していないmod_securityはありますか?あなたのサイトはマゼンタのような地獄から何かを実行していますか?また、何かが本当にあなたのPHPスクリプトを現在の時刻について本当に興味深くさせます。:D
とにかく、PHPプロファイリングにはXDebugを使用でき、結果を分析するには、たとえばKCacheGrindを使用すると、結果がグラフィカルに簡単に表示されます。 -フォームを読む。
リアルタイムのパフォーマンス分析の場合、最新のLinuxディストリビューションにはperfコマンドがあり、従来のtopと似ていますが、単一のプロセスにドリルダウンできます。何が起こっているかをアセンブリレベルで確認できます。
プログラムをウォークスルーして無限ループを見つけるには、たとえば xdebug などのデバッガーを使用する必要があります。
問題を切り分けるために使用できるいくつかのオプションがあります。
明らかに、ログをチェックして、報告されている問題があるかどうかを確認する必要があります。
/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サーバーのいくつか。それは本当にあなたがサイトを微調整するのにどれだけのエネルギーを費やしたいかです。
頑張ってください!