前回は、sar コマンドでサーバ全体の負荷状況の把握とボトルネックの洗い出し方法について解説いたしました。今回は、CPUの負荷と動作しているプロセスの状況を同時に把握できる top コマンドの確認すべき点と対応方法について解説します。
topコマンド
topコマンドは、サーバの負荷とプロセスの状況を把握するためのコマンドです。コマンドを打つと一定時間ごとに表示が刷新されるのでリアルタイムでの状況と推移を把握するのに適したコマンドです。
top - 15:13:32 up 163 days, 20:34, 3 users, load average: 0.97, 0.61, 0.41
Tasks: 187 total, 1 running, 185 sleeping, 0 stopped, 1 zombie
%Cpu(s): 49.7 us, 11.9 sy, 0.0 ni, 36.5 id, 0.5 wa, 0.7 hi, 0.7 si, 0.0 st
MiB Mem : 7955.8 total, 2774.2 free, 2516.5 used, 2665.1 buff/cache
MiB Swap: 4096.0 total, 3511.4 free, 584.6 used. 4611.6 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
866731 root 20 0 32.7g 430660 147476 S 16.9 5.3 0:57.39 chrome
768157 httpd 20 0 1565996 417804 347308 S 12.0 5.1 1:40.59 php-fpm
868855 httpd 20 0 1561068 379240 314008 S 11.6 4.7 0:04.57 php-fpm
871942 httpd 20 0 1188120 240580 184896 S 8.3 3.0 0:01.02 php-fpm
767751 httpd 20 0 1560572 414344 349528 S 6.6 5.1 1:39.92 php-fpm
860809 httpd 20 0 1192512 356496 295948 S 6.6 4.4 0:11.03 php-fpm
865149 httpd 20 0 1184496 344548 292084 S 6.6 4.2 0:06.89 php-fpm
621352 root 20 0 11.0g 206136 42448 S 6.0 2.5 28:08.36 node /usr/lib/w
643287 mysql 20 0 3284700 399868 10788 S 4.7 4.9 102:04.48 mariadbd
621509 httpd 20 0 465496 89972 26716 S 3.3 1.1 23:26.63 nginx
確認すべき点と対処
topコマンドで注目してほしいのは、load average とプロセスの%CPU値です。load average は、3つの数値が表示されており、右から直近の5分間、10分間、15分間のプロセス待ちの平均数を表しています。load average値が大きいほど負荷が大きいということになりますが、CPUのコア数が多ければその分処理可能なプロセスも増えますので、指標としては、load average値 / CPUコア数の値が1を超える場合、要求が処理能力を上回っていると言えます。このような状況が継続し、なおかつload average値が上昇傾向にある(表示が更新される度に数値が上がっていく)場合は、負荷を低減させるための対処を図る必要があります。
デフォルトでは、%CPU(CPU占有率)の多い順にプロセスが表示されているので、上に表示されているプロセスを削減または低減できれば、それだけリソースの余裕が生まれやすいことになります。
具体的には、以下の優先度に従って対処を模索することが望ましいです。
- アクセスログのユーザーエージェント、アクセス元IPを確認し不要なアクセス(Botやスクレイピングツールによるもの)が多くを占める場合は、それらのアクセス制限。
- データベース負荷が大きい(プロセスのリストにmariadbdがあり%CPU値が100を超える)場合、データの削減、クエリ・インデックスの最適化の実施。
- キャッシュの有効化、最適化。
- サーバリソースの増強(スケールアップ、スケールアウト)
サーバのリソース増強は、お手軽な対処方法ではありますが、それだと運用上不要な処理やボトルネックが残ったままになってしまったり、当然ながら増強した分のサーバ費用はかかってきますので、最終手段にすべきです。
ただし、データベースやキャッシュの最適化はすぐに対処できるとは限りませんので、サーバリソースの増強で暫定的な対処を行い、データベース、キャッシュの最適化で負荷を下げられた段階で、サーバリソースを元に戻すことは1つの手段といえます。
メモリ状況の確認
topコマンドでメモリの状況も確認することができます。コマンド実行結果の中の「MiB Mem」から始まる2行の部分がメモリの状況に関する数値です。この中で重要なのはavail Memの数値で、これが割当可能なメモリ領域を表しています。この数値が枯渇するとSwapが発生し、動作が劇的に遅くなるので注意が必要です。
このような場合には、以下の優先度で対処検討すると良いでしょう。
- PHPやDBのメモリ設定が過剰となっていないか確認する。
- PHPの起動プロセス数で余剰なものがないか確認する。
- サーバのスケールアップを行いメモリ搭載量を増やす。
なお、topコマンドでは、メモリの占有率を表す%MEMの降順にソートすることが可能です。%MEM順の表示に切り替えるには、topコマンドを実行した後、Shift + mキーで%MEM順でのソート、Shift + pキーで%CPU順の元に戻すことができるようになっています。