Skip to content

Instantly share code, notes, and snippets.

@kitak
Last active October 18, 2023 09:57
Show Gist options
  • Save kitak/6349463 to your computer and use it in GitHub Desktop.
Save kitak/6349463 to your computer and use it in GitHub Desktop.
コマンドによる「負荷」の原因切り分け

コマンドによる「負荷」の原因切り分け

この文章では、Linuxコマンド、sar, top, psを使って、一般的に負荷といわれるものの原因を切り分けることを目的とする。

そもそも負荷とは

「複数のタスクによるサーバリソースの奪い合いの結果に生じる待ち時間」を一言で表した言葉。OSのチューニングとは負荷の原因を知り、それを取り除くことにほかならない。

ボトルネックの見極め作業の大まかな流れ

  • ロードアベレージ(処理を実行したくても、実行できなくて待たされているプロセス(CPUの実行権限が与えられるのを待っている、またはディスクI/Oが完了するのを待っている)の数)を見る
  • CPU, I/Oのいずれがボトルネックかを探る

ロードアベレージの調べ方

  • top, uptimeコマンドで見る
  • ロードアベレージは負荷の指標であって、それだけでどこがボトルネックの原因か判断することはできない。
  • ロードアベレージが低いのにスループットが上がらない場合はソフトウェアの設定、不具合、ネットワーク、リモートホストに原因があるかもしれない。

CPU, I/Oのいずれがボトルネックかを探る

sar や vmstat で時間経過にともなうCPU使用率やI/O待ち率の推移が確認できる

CPU負荷が高い場合
  • ユーザプログラム、システムプログラムのどちらがボトルネックかtop, sarで確認する(大抵の場合はユーザープログラム)
  • psで見えるプロセスの状態やCPU使用時間を見ながら原因のプロセスを特定
  • プロセスの特定からさらに詳細を詰める場合は、straceでトレースしたり、oprofileでプロファイリングをするなりしてボトルネック箇所を絞り込む(プログラムのどこ)
I/O負荷が高い場合
  • プログラムからの入出力が多い
  • スワップが発生してディスクアクセスが発生している
    ↑のふたつがほとんど
    ロードアベレージが高く、かつsarの%iowaitが高い場合は負荷の原因はI/Oであるといえる。
スワップの場合

特定のプロセスが極端にメモリを消費していないかをpsで確認できる

プログラムの不具合でメモリを使いすぎている場合は、プログラムを改善する
or
搭載メモリが不足している場合はメモリ増設で対応する。増設できない場合は分散を検討する

スワップが発生していないのに、ディスクへの入出力が頻繁に発生している

キャッシュ(ページキャッシュ)に必要なメモリが不足している

  • メモリ増設でキャッシュ領域を拡大させられる場合は、メモリを増設する
  • メモリ増設で対応しきれない場合は、データの分散やキャッシュサーバの導入を検討する

負荷の説明

CPU負荷

  • 大規模な科学計算を行うようなプログラム。処理速度がCPUの計算速度に依存しているため「CPUバウンドなプログラム」と呼ばれる。

I/O負荷

  • ディスクに保存された大量のデータから任意のドキュメントを探し出すプログラム。ディスクの読み出し速度に依存するため「I/Oバウンドなプログラム」と呼ばれる。

sarコマンドの使い方あれこれ

過去のデータを調べる

/var/log/sa に格納されており、ファイル名末の数字二桁が日付を指している。時間の範囲を指定することも可能。

sar -f /var/log/sa/sa04 -s 22:00:00 -e 23:00:00

現在のデータを調べる

1秒おきに3回調べる

sar 1 3

sar -u

CPU使用率をみる

sar -q

ロードアベレージをみる
ランキューに溜まっているプロセスの数、システム上のプロセスサイズも参照できる。 値の推移を時間とともに追える点が他のコマンドと違う。

sar -r

メモリの利用状況を見る

  • kbmemfree: 物理メモリの空き容量
  • kbmemused: 使用中の物理メモリ
  • memused: 物理メモリ使用率
  • kbbuffers: カーネル内のバッファとして使用されている物理メモリの容量
  • kbcached: カーネル内でキャッシュ(ページキャッシュ)用メモリとして使用されている物理メモリの容量
  • kbswpfree: スワップ領域の空き容量
  • kbswpused: 使用中のスワップ領域の容量

時間推移とともにメモリがどの程度どの用途に使われているかを把握できる。sar -Wと組み合わせるとスワップが発生したときにその時間帯のメモリ使用状況がどうであったかを知ることができる。

sar -W

スワップの発生状況を確認。

  • pswpin/s 1秒間にスワップインしているページ数
  • pswpout/s 1秒間にスワップアウトしているページ数

スワップが発生するとサーバーのスループットは極端に落ちてしまう。メモリ不足でスワップが発生しているか否か疑わしいときはsar -Wでその時間にスワップが発生していたかどうかで確認できる。

sar -p ALL

マルチCPUで各CPUの状況を調べるとき。

参考文献

  • サーバ/インフラを支える技術
  • 大規模サービス技術入門
  • Linux PROGRAMMER'S TOOLBOX
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment