サーバーが重い・応答が遅い

サーバー全体の反応が鈍い、コマンドの実行やページの表示が異常に遅い——という状況を、CPU・メモリ・ディスクI/Oのどこがボトルネックかという視点で切り分けていきます。

どんな症状か

コマンドを打ってから返ってくるまで数秒〜数十秒かかる、Webサイトの応答が遅い、SSH接続すら重く感じる、といった状況です。原因はCPU・メモリ・ディスクI/Oのいずれか(または複数)にあることがほとんどです。

原因を切り分ける

ステップ1:全体の負荷を俯瞰する

$ top
top - 21:04:11 up 3 days, load average: 8.42, 6.10, 3.95
%Cpu(s): 92.3 us,  4.1 sy,  0.0 ni,  1.2 id, ...

load average(直近1分・5分・15分の平均負荷)がCPUのコア数を大きく超えている場合、CPUが詰まっている可能性が高いです。nproc コマンドでコア数を確認し、比較します。

ステップ2:犯人プロセスを特定する

top はデフォルトでCPU使用率順に並ぶので、上位に表示されているプロセスを確認します。Shift+M キーでメモリ使用率順の表示に切り替えることもできます。

ステップ3:メモリ不足を疑う

$ free -h
              total    used    free  shared  buff/cache  available
Mem:           2.0Gi   1.9Gi    50Mi    10Mi      100Mi        60Mi
Swap:          1.0Gi   980Mi    20Mi

available(実質的な空き容量)が少なく、Swap の使用量(used)が多い場合、物理メモリが足りずディスク上のスワップ領域を使っていて、全体が遅くなっている可能性が高いです。

ステップ4:ディスクI/Oを疑う

$ vmstat 1 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free  buff  cache   si   so    bi    bo   in   cs us sy id wa
 3  2  10240  51200 20480 102400    0    0  8200     0  400  900 10  5  0 85

wa(I/O待ちの割合)が高い場合、ディスクの読み書きがボトルネックになっています。どのプロセスがディスクに負荷をかけているかは iotop コマンド(未導入の場合はパッケージ管理コマンドでインストール)で確認できます。

解決方法

  • CPUを食っているプロセスが原因の場合: そのプロセスを再起動する、あるいは不要であれば停止します。
  • メモリ不足が原因の場合: 不要なプロセスを止める、メモリを増設する、スワップサイズの設計を見直します。
  • ディスクI/Oが原因の場合: 大量のログ書き込みやバックアップ処理が重なっていないか確認し、実行時間帯をずらします。
  • 慢性的に不足している場合: 一時対応で終わらせず、サーバーのスペック自体の見直し(増強)を検討します。
関連する章: リソース監視の考え方は上級「キャパシティプランニングとリソース監視」で詳しく扱っています。