このトピックでは、Linuxシンプルアプリケーションサーバーにおける高いCPU使用率または高いCPU負荷のトラブルシューティング方法について説明します。このトピックでは、一般的なケースについても説明します。
シナリオ
シンプルアプリケーションサーバーのCPU使用率またはCPU負荷が常に高い場合は、次の手順を実行して問題をトラブルシューティングできます。
CPU使用率またはCPU負荷が高い原因となっているプロセスを見つけます。
CPU使用率またはCPU負荷が高い原因となっているプロセスが想定どおりに動作しているかどうかを確認し、トラブルシューティングのために考えられる原因を分類します。
プロセスが想定どおりに動作している場合は、アプリケーションを最適化するか、シンプルアプリケーションサーバーをアップグレードする必要があります。詳細については、シンプルアプリケーションサーバーのアップグレードを参照してください。
プロセスが想定どおりに動作していない場合は、プロセスを手動で確認して終了するか、サードパーティのセキュリティツールを使用してプロセスを確認して終了できます。
CPU負荷のクエリと分析
Linuxシステムでは、次のコマンドを実行してプロセスを表示できます。このトピックでは、vmstat(Virtual Memory Statisticsの略)コマンドとtopコマンドについてのみ説明します。
vmstat
top
ps -aux
ps -ef
vmstatコマンドの使用
vmstatコマンドを実行して、オペレーティングシステムの仮想メモリ、プロセス、およびCPUに関する全体的な統計を表示します。
コマンド構文
次のコードは、vmstatコマンドの構文を示しています。
vmstat [-n] [delay [count]]
[-n]: ヘッダーを1回だけ表示することを指定します。
[delay]: 更新間隔を指定します。このパラメーターを指定しない場合は、1つの結果のみが表示されます。
[count]: 更新回数を指定します。更新回数を指定せずに更新間隔を指定した場合、更新回数は無制限になります。
例
次のvmstatコマンドを実行して、各プロセスのCPU使用率に関する統計を1秒ごとに4回収集します。
vmstat -n 1 4
出力例:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 2684984 310452 2364304 0 0 5 17 19 35 4 2 94 0 0
0 0 0 2687504 310452 2362268 0 0 0 252 1942 4326 5 2 93 0 0
0 0 0 2687356 310460 2362252 0 0 0 68 1891 4449 3 2 95 0 0
0 0 0 2687252 310460 2362256 0 0 0 0 1906 4616 4 1 95 0 0
コマンド出力のフィールド:
r: CPUによる処理を待機しているスレッドの数を示します。CPUは一度に1つのスレッドしか処理できません。値が大きいほど、システムの実行速度が遅いことを示します。
us: ユーザーモードで消費されたCPU時間の割合を示します。値が大きいほど、ユーザープロセスによって消費されるCPU時間が長いことを示します。値が長期間にわたって50%を超える場合は、プログラムのアルゴリズムまたはコードを最適化する必要があります。
sy: カーネルモードで消費されたCPU時間の割合を示します。
wa: I/O操作の完了を待機していたCPU時間の割合を示します。値が高い場合、システムは重大なI/O待機を発生させています。これは、ディスクへの広範なランダムアクセスまたはディスクパフォーマンスのボトルネックが原因である可能性があります。
id: アイドル状態のCPU時間の割合を示します。このパラメーターの値が0のままで、syパラメーターの値がusパラメーターの値の2倍である場合、システムのCPUリソースが不足しています。
topコマンドの使用
topコマンドは、Linuxで一般的なパフォーマンス分析ツールです。このコマンドは、システム内の各プロセスのリソース使用量をリアルタイムで表示できます。
コマンド構文
top [-n] [-d]
[-n]: ヘッダーを1回だけ表示することを指定します。
[delay]: 更新間隔を指定します。このパラメーターを指定しない場合は、1つの結果のみが表示されます。
[count]: 更新回数を指定します。更新回数を指定せずに更新間隔を指定した場合、更新回数は無制限になります。
例
Linuxシンプルアプリケーションサーバーにリモート接続します。詳細については、Linuxサーバーへの接続を参照してください。
次のコマンドを実行して、システム内の各プロセスのリソース使用量を表示します。
このコマンドは、各プロセスのリソース使用量に関する統計を2秒ごとに5回収集します。
top -n 5 -d 2
出力例:
top - 17:27:13 up 27 days, 3:13, 1 user, load average: 0.02, 0.03, 0.05 Tasks: 94 total, 1 running, 93 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.3 us, 0.1 sy, 0.0 ni, 99.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.1 st KiB Mem: 1016656 total, 946628 used, 70028 free, 169536 buffers KiB Swap: 0 total, 0 used, 0 free. 448644 cached Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 41412 3824 2308 S 0.0 0.4 0:19.01 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.04 kthreadd
コマンド出力のフィールド:
CPU使用率とCPU負荷の問題については、コマンド出力の1行目と3行目にのみ注目する必要があります。
1行目には、
17:27:13 up 27 days, 3:13, 1 user, load average: 0.02, 0.03, 0.05
と表示されます。これは、現在のシステム時刻、システムの稼働時間、ログオンユーザーの数、およびシステム負荷を示します。3行目には、現在のCPUリソースの全体的な使用率が表示されます。各プロセスのリソース使用率は、この行の下に表示されます。
topコマンドの実行中に、次のキーを押してコマンド出力を調整できます。
Pキーを押すと、CPU使用率の高い順にプロセスがソートされます。これにより、システム内で大量のCPUリソースを消費しているプロセスをすばやく見つけることができます。
Mキーを押すと、メモリ使用量によってプロセスがソートされます。CPUに複数のコアがある場合は、1キーを押して各CPUコアの負荷状態を表示します。
ll /proc/PID/exe
コマンドを実行して、各プロセスID(PID)に対応するプログラムファイルを表示します。大量のCPUリソースを消費しているプロセスを終了します。
kと入力します。
終了するプロセスのPIDを入力し、Enterキーを押します。
デフォルトのPIDは、コマンド出力の最初のPIDです。PIDが23のプロセスを終了する場合は、次の図に示すように、23と入力してEnterキーを押します。
操作が完了すると、
Send pid 23 signal [15/sigterm]
のようなメッセージが表示されます。Enterキーを押して確認します。
CPU使用率が高い場合の一般的なケースの分析
ケース1: CPU使用率は低いですが、CPU負荷が高い
問題の説明
Linux ECSインスタンスでビジネプログラムが実行されていません。topコマンドは、CPU使用率は低いものの、CPU負荷(load average)が高いことを示しています(次の図を参照)。
原因
システムに多数のゾンビプロセスが存在します。
load averageは、CPU負荷を評価するために使用されます。値が高いほど、タスクキューが長く、実行を待機しているタスクが多いことを示します。
解決策
ps -axjf
コマンドを使用して、システムにD+状態(割り込み不可能なスリープ状態)のプロセスがあるかどうかを確認します。
この状態のプロセスは、終了することも自動的に終了することもできません。システムにD+状態のプロセスがあるという問題を解決するには、プロセスの依存リソースを復元するか、システムを再起動します。
ケース2: kswapd0プロセスが大量のCPUリソースを消費している
問題の説明
シンプルアプリケーションサーバーが途切れます。top
コマンドを実行すると、kswapd0プロセスがCPU負荷の99%を占めていることがわかります。
原因
システムによるページの変更が絶えず行われているため、大量のCPUリソースが消費されます。
Kswapd0は、仮想メモリ管理におけるページ変更プロセスです。サーバーのメモリが不足すると、kswapd0はページ変更操作を実行し、多くのCPUリソースを消費します。
解決策
vm.swappinessカーネルパラメーターを変更して、スワップ領域のサイズを制御します。
Linuxインスタンスに接続します。詳細については、Linuxサーバーへの接続を参照してください。
swappinessパラメーターを表示します。
cat /proc/sys/vm/swappiness
次の図のコマンド出力に類似したコマンド出力が返されます。この例では、戻り値は40です。これは、使用可能な物理メモ리가60%未満の場合にスワップ領域が使用されることを示します。
説明swappinessの値が小さいほど、カーネルはスワップ領域を少なく使用し、物理メモリを多く使用します。swappinessの値が大きいほど、カーネルはスワップ領域を多く使用し、物理メモリを少なく使用します。
ビジネス要件に基づいてswappinessパラメーターを変更します。
sysctl.confという名前のカーネルパラメーター構成ファイルを開きます。
vi /etc/sysctl.conf
ビジネス要件に基づいてswappinessパラメーターを変更します。
たとえば、sysctl.conf構成ファイルで
vm.swappiness = 10
と構成します。Esc
キーを押し、:wq
と入力して変更を保存し、ファイルを終了します。sysctl構成ファイルをリロードして、構成を有効にします。
sysctl -p
この問題が解決しない場合は、シンプルアプリケーションサーバーの仕様をアップグレードすることをお勧めします。詳細については、シンプルアプリケーションサーバーのアップグレードを参照してください。
ケース3: CPU使用率が100%になる問題のトラブルシューティング
問題の説明
シンプルアプリケーションサーバーを使用しているときにCPU使用率が100%に達し、topコマンドまたはhtopコマンドを使用してCPUリソースの大部分を消費している特定のプロセスをクエリできません。
原因
この問題は、ウイルスが原因である可能性があります。
解決策
シンプルアプリケーションサーバーのCPU使用率が100%に達した時刻を表示します。詳細については、シンプルアプリケーションサーバーの監視情報の表示を参照してください。
Linuxシンプルアプリケーションサーバーのコマンド変更レコードを表示します。
レスキュー機能を使用してLinuxシンプルアプリケーションサーバーにログオンします。詳細については、レスキュー機能を使用したシンプルアプリケーションサーバーへの接続を参照してください。
次のコマンドを実行して、Linuxシステムのコマンドが最近変更されたかどうかを確認します。
stat /usr/bin/top
次の図のコマンド出力に類似したコマンド出力が返された場合、システムには変更されたコマンドがあります。コマンドが変更された時点が、CPU使用率が100%になった時点と一致するかどうかを確認します。
次のコマンドを実行して、
ps
コマンドとtop
コマンドが変更されたかどうかを確認します。rpm -Vf /bin/ps rpm -Vf /usr/bin/top
インスタンスが想定どおりに実行されている場合、変更情報は返されません。
インスタンスで例外が発生した場合、次の図のコマンド出力に類似したコマンド出力が返される場合があります。コマンド出力は、
ps
コマンドとtop
コマンドが変更されたことを示しています。
次のコマンドを実行して、現在のインスタンスのIPアドレスが無効なドメイン名に解決されているかどうかを確認します。
iftop -i [$Device] -n -P
説明[$Device]を、現在のシステムで使用されているネットワークインターフェースコントローラー(NIC)(eth0など)に置き換えます。
次の出力が返されます。crypto-pool.frに接続していない場合、crypto-pool.frは無効です。
topコマンドまたはpsコマンドが変更され、現在のインスタンスのIPアドレスが無効なドメイン名に解決されている場合(これは、シンプルアプリケーションサーバーがウイルスに感染していることを意味します)、次の解決策を使用して問題をトラブルシューティングします。
シンプルアプリケーションサーバーのデータをバックアップします。詳細については、スナップショットの作成を参照してください。
システムディスクを再初期化し、セキュリティセンターを使用してシンプルアプリケーションサーバーのセキュリティ強化を実行します。詳細については、シンプルアプリケーションサーバーのリセットおよびセキュリティセンターとはを参照してください。