CPUが張り付くと、サイトが遅くなり、SSHの入力が引っかかり、cronジョブがタイムアウトします。原因は正常な成長かもしれませんし、暴走したプログラム、あるいはマイニング型トロイの木馬かもしれません。診断の順序を示します。
ステップ1:消費者を特定する
top(PキーでCPU順ソート)またはより見やすいhtopを実行し、上位のプロセス名とPIDを記録します。3つのシナリオがあります:
- 見覚えのある業務プロセス(mysql、php-fpm、node…)→ ステップ2へ;
- 見慣れない名前や偽装された名前(ランダムな文字列、kdevtmpfsi、xmrig…)→ マイニングトロイの可能性大、ステップ4へ;
- ユーザーCPUではなくiowaitが高い(topのwa値が大きい)→ 本当のボトルネックはディスク。ディスクIOを調査してください。
ステップ2:業務プロセスの一般的な原因
- MySQL:インデックス不足のスロークエリ。スロークエリログを有効化し、フルテーブルスキャンにインデックスを追加;
- PHP / Node:無限ループ、またはクローラーによる集中アクセス。アクセスログで異常な高頻度IPを確認し、レート制限やファイアウォールでの遮断を;
- cronジョブの積み重なり:前回の実行が終わる前に次が始まりタスクが積み上がる——スクリプトをロック(flock)で保護しましょう。
ステップ3:単にプランが小さすぎないか?
ピーク時のロードアベレージがコア数を上回り続けているのに各プロセスは正常なら、実トラフィックが構成を超えています。最適化の余地が少ないなら、CPUのアップグレードが経済的な解決策です。
ステップ4:マイニングトロイが疑われる場合の対処
症状:CPUが四六時中100%、奇妙なプロセス名、killしても復活するプロセス、crontabの見知らぬエントリ。対処の順序:怪しいプロセスをネットワークから遮断し、crontab -lと/etc/cron.*の異物を点検、~/.ssh/authorized_keysに公開鍵が注入されていないか確認。重要:トロイの完全除去は困難です。最も安全なのはデータをバックアップしてOSを再インストールすること。その後、セキュリティ記事に従いファイアウォールと鍵専用ログインの強化を。支援が必要なら00Sharkサポートまで。