このトピックでは、Linux ECS (Elastic Compute Service) インスタンスで発生する高CPU使用率または高CPU負荷の問題の一般的なケースについて説明し、問題のトラブルシューティングと解決方法について説明します。
トラブルシューティングの手順
Linux ECSインスタンスを使用すると、インスタンスのCPU使用率またはCPU負荷が高いままになることがあります。 問題をトラブルシューティングして解決するには、次の手順を実行します。
高いCPU使用率または高いCPU負荷を引き起こすプロセスを見つけます。
CPU使用率またはCPU負荷が高いプロセスが期待どおりに実行されているかどうかを確認し、プロセスのステータスに基づいて問題を処理します。
プロセスが期待どおりに実行されている場合は、対応するプログラムを最適化するか、インスタンスタイプをアップグレードできます。 詳細については、「サブスクリプションインスタンスのインスタンスタイプのアップグレード」または「従量課金インスタンスのインスタンスタイプの変更」をご参照ください。
プロセスが期待どおりに実行されていない場合は、手動でプロセスを確認して終了できます。 サードパーティのセキュリティツールを使用して、プロセスをチェックして終了することもできます。
CPUロードのクエリと分析
Linuxシステムでは、次のコマンドを実行してプロセスを表示できます。 このトピックでは、vmstat (VirtualMeomoryStatisticsの略) およびtopコマンドについてのみ説明します。
vmstat
top
ps -aux
ps -ef
vmstatコマンドを実行してCPU負荷を照会および分析します
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コマンドを実行してCPUロードを照会および分析します
topコマンドは、Linuxの一般的なパフォーマンス分析ツールです。 このコマンドは、システム内の各プロセスのリソース使用量をリアルタイムで表示できます。
コマンド構文
top [-n] [-d]
[-n]: リフレッシュの回数を指定します。 リフレッシュ回数を指定せずにリフレッシュ間隔を指定した場合、リフレッシュ回数は無制限です。
[-d]: リフレッシュ間隔を指定します。
例:
Linux ECSインスタンスに接続します。
詳細については、「接続方法の概要」をご参照ください。
次のコマンドを実行して、システム内の各プロセスのリソース使用量を表示します。
このコマンドは、各プロセスのリソース使用量に関する統計を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行目にのみ注目する必要があります。
最初の行には、
17:24:13 up 27日、3:13、1ユーザー、負荷平均: 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負荷 (負荷平均) が高いことを示しています。
原因
システムには多数のゾンビプロセスが存在します。
負荷平均は、CPU負荷を評価するために使用される。 値が大きいほど、タスクキューが長く、実行待ちのタスクが多いことを示します。
解決策
ps -axjf
コマンドを使用して、中断できないスリープ状態であるD + 状態のプロセスがあるかどうかを確認します。
この状態のプロセスは終了または自動的に終了できません。 システムにD + 状態のプロセスがあるという問題を解決するには、プロセスの依存関係リソースを復元するか、システムを再起動します。
ケース2: kswapd0プロセスは大量のCPUリソースを消費します
問題の説明
Linux ECSインスタンスが期待どおりに動作していません。 一番上
のコマンドは、kswapd0プロセスがCPUリソースの99% を消費することを示しています。
原因
システムによる一定のページスワッピングは、大量のCPUリソースの消費を引き起こす。
kswapd0プロセスは、ページスワッピングを担当する仮想メモリ管理プロセスです。 ECSインスタンスの物理メモリが不足している場合、kswapd0プロセスはページスワッピング操作を実行します。 この操作は、大量のCPUリソースを消費します。
解決策
vm.swappinessカーネルパラメーターを変更して、スワップスペースのサイズを制御します。
Linux ECSインスタンスにログインします。
詳細については、「接続方法の概要」をご参照ください。
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.conf設定ファイルをリロードします。
sysctl -p
問題が解決しない場合は、ECSインスタンスのインスタンスタイプをアップグレードすることを推奨します。 詳細については、「サブスクリプションインスタンスのインスタンスタイプのアップグレード」または「従量課金インスタンスのインスタンスタイプの変更」をご参照ください。
ケース3: CPU使用率が100%
問題の説明
Linux ECSインスタンスのCPU使用率が100% に達しました。 topやhtopなどのコマンドを実行して、CPUリソースを消費するプロセスを照会することはできません。
原因
問題はウイルスによって引き起こされる可能性があります。
解決策
CloudMonitorコンソールでモニタリングデータを表示します。
CloudMonitor コンソールにログインします。
左側のナビゲーションウィンドウで、[ECS モニタリング] をクリックします。
問題が発生したECSインスタンスを見つけ、[操作] 列の [モニタリングチャート] をクリックします。
[OSモニタリング] タブで、各時点のECSインスタンスのCPU使用率を表示および記録します。
Linux ECSインスタンスのコマンド変更レコードを表示します。
Linux ECSインスタンスにログインします。
詳細については、「接続方法の概要」をご参照ください。
次のコマンドを実行して、Linuxシステムのコマンドが最近変更されたかどうかを確認します。
stat /usr/bin/top
次の図のコマンド出力と同様のコマンド出力が返された場合、システムには変更されたコマンドがあります。 コマンドが変更された時点が、CPU使用率が100% された時点と一致しているかどうかを確認します。
次のコマンドを実行して、
ps
コマンドとtop
コマンドが変更されたかどうかを確認します。rpm -Vf /bin/ps rpm -Vf /usr/bin/top
インスタンスが期待どおりに実行された場合、変更情報は返されません。
インスタンスで例外が発生した場合、次の図のコマンド出力と同様のコマンド出力が返される場合があります。 コマンド出力は、
ps
およびtop
コマンドが変更されたことを示します。
次のコマンドを実行して、インスタンスが無効なドメイン名に接続されているかどうかを確認します。
iftop -i [$Device] -n -P
説明[$Device] 変数を、eth0などの現在のシステムで使用されているネットワークインターフェイスコントローラー (NIC) に置き換えます。
次の図のコマンド出力と同様のコマンド出力が返されます。 crypto-pool.frに接続しなかった場合、crypto-pool.frは無効なドメイン名です。
上記の手順の結果に基づいて、ECSインスタンスがウイルスに感染しているかどうかを確認します。 topコマンドとpsコマンドが変更され、ECSインスタンスが無効なドメイン名に接続されている場合、インスタンスはウイルスに感染しています。 この問題を解決するには、次の手順を実行します。
ECSインスタンスのデータをバックアップします。 詳細については、「ディスクのスナップショットの作成」をご参照ください。
ECSインスタンスのシステムディスクを再初期化し、Security Centerを使用してECSインスタンスのセキュリティを強化します。 詳細については、「システムディスクの再初期化」および「セキュリティセンターの概要」をご参照ください。