CPU、DISK I/Oに制限がされてしまった

[更新:2022年08月31日]

VPSの利用中に、CPU、DISK I/Oに対する制限が実施された場合の確認方法を記載します。

該当する症状

  • ご利用中のVPSに対して、コントロールパネル上に「CPUの制限中」/「IOPS制限中」の表示がある(画面の確認は リソース制限 をご覧ください)

確認方法

Note

本文書に記載する内容はあくまでも調査のための一例であり、全ての調査方法を網羅しているものではありません。
基本的に導入のコマンドはRHEL系8以上を想定しています。そのためdnfコマンドがない場合は、yumやaptに読み替えていただきますよう、お願いいたします。
また対象のパッケージが存在しない場合は、RPM等を利用して個別に導入していただく、OSのアップグレードをご検討いただく等をお願いいたします。

CPU制限時に確認すべきこと

CPUリソースの制限は、主に以下の内容が確認された場合に自動的に実施されます。
  • ご利用VPSが収容されているホストサーバー上の負荷が上昇し

  • 監視確認時にご利用VPSのCPUリソースの割当量がしきい値を超過していた場合

また、以下の様な場合には弊社のオペレーションとして手動で制限を実施する可能性がございます。
手動での制限実施時は、制限実施後に対象のお客様へメールにてご連絡を差し上げております。
  • ホストサーバー上の負荷が上昇し、他収容中のVPSへの影響が出ていると判断された場合

  • 弊社へのパフォーマンスに関する問い合わせから、お客様のご利用VPSが起因となってパフォーマンス劣化が発生していると判断された場合

1. コントロールパネルから、該当VPSのCPU利用率を確認する

コントロールパネル上にてCPU制限の表示が確認できた場合、まずはCPUのリソース状況を確認します。
リソース表示には「日/週/月」の単位があり、下記の内容が視覚的に判断できるようになっています。
  • CPUリソースをどの程度利用しているのか

  • CPUリソースがいつ頃から大幅に利用され始めたのか

  • CPUリソースの制限がいつ頃から発生するようになったのか

制限状態の画面

Note

CPUリソースのグラフが表す縦軸の数値は、「ms(ミリ秒)」を表しています。
そのため、VPSに割当られた1コアが最大で利用可能な値は 1k(1秒) となります。
ご契約いただいたCPUコア数 x (1000ms = 1k) が縦軸の最大値になります。

警告

さくらのVPSは、ホストサーバーのリソースを共有して、各VPSに割り当てを行いサービスを提供しています。
ご利用VPS内部で「契約コア数が利用可能なCPUリソースを常に確保する」ような処理が行われた場合、ホストサーバーのCPUリソースを常に専有するようになります。
そのため、同ホストサーバーに収容中の別VPSに対してCPUリソースの割り当てを行いづらくなる = ホストサーバーの負荷が上昇する状況となります。
つまり、お客様にてご契約いただいたCPUコア数は、「常時利用可能なリソース」ではなく、 最大限利用可能なリソース とご理解いただければ幸いです。

以下に異常とみなされる可能性のあるグラフと、通常利用と判断されるグラフを記載します。

  • 異常なCPUリソースの利用イメージ

異常なCPUリソースの利用イメージ
  • 正常なCPUリソースの利用イメージ

正常なCPUリソースの利用イメージ

2. 何に起因してCPUリソースが上昇しているか推測する

リソースグラフ
リソースグラフには、CPUリソースの他に「DISK IO (bytes/s)」と、「Traffic (bps)」の2つのグラフが用意されています。
CPUリソースの上昇とともに、上記2つのグラフも上昇しているか? を確認することで、以下のような方針を立てることが可能です。
  • CPUリソースとTraffic(NW)の受信/送信グラフが同時期に上昇していた

    ・ Webサーバーへのアクセスが急激に上昇した可能性は無いか
    ・ 外部からの攻撃やアクセス試行による可能性は無いか
    ・ プログラムが暴走して外部へアクセスしている可能性は無いか
    ・ 不審なプログラムが設置されている可能性は無いか
  • CPUリソースとDISK IOの読み書きが同時期に上昇していた

    ・ データベースへのクエリによって、異常な DISK IO 及び CPU利用が発生している可能性は無いか。
    ・ メモリ不足もしくはメモリリーク等によって、頻繁なスワッピングや、ページのスラッシングが発生していないか。
    ・ バックアップ処理が重複していたり、バックアップ対象が再帰的になってしまう等で異常な DISK IO が発生していないか。
上記に例示したような予想から、ある程度の方針を決定してご利用VPSの内部を調査します。
大まかな調査方針は以下のようなフローにまとめられます。
  1. 負荷を上昇させているプログラムの特定

  2. プログラムが負荷を上昇させている原因の調査/特定

  3. プログラムや設定ファイルの修正

Note

コントロールパネルに表示されているリソースグラフは、弊社が標準で提供しているものとなり、複数VPSのデータを集約した上で表示させています。
その都合上、データを収集するタイミングが粗くなる、データを表示するタイミングが遅延する等の事象が発生する可能性がございます。
より正確なグラフを出力及び確認されたい場合は、お客様にて別途監視サーバーやグラフサーバーを構築いただきますよう、お願いいたします。

3. CPUリソースに影響するプログラム/動作を調査する

3-1. 現在の負荷状況と、対応するプロセスの確認
まずは下記のtopコマンドで、現在動作しているプロセスの状態を確認します。
# top -i -c
-i CPUリソースを利用していないプロセスの非表示
-c 実行されているプロセス名/コマンドラインを表示
topコマンドで出力される、重要な表示の内容は下記のとおりです。

項目

詳細

Top

Load Average

左から 1分/5分/15分の平均負荷を表示

%Cpu(s)

us

ユーザープロセスが利用しているCPUリソースの割合(user)

---

sys

OSシステム領域が利用しているCPUリソースの割合(system)

---

id

待機(アイドル)状態のCPUリソースの割合(idle)

---

wa

CPUがI/O処理の完了待ちをしている時間の割合(wait)

---

st

何かしらの理由により、ホストからCPU時間を即座に割り当てられずに待った時間の割合(steal)

プロセス

PID

プロセスID

---

VIRT

割り当てられた仮想メモリサイズ(KiB)

---

RES

実際に使用されている物理メモリサイズ(KiB)

---

SHR

RESで利用されているメモリ中の共有メモリサイズ(KiB)

---

S

プロセスのステータス(後述)

---

%CPU

プロセスにおけるCPUリソースの利用割合

---

%MEM

プロセスにおけるメモリリソースの利用割合

上記に記載したプロセスステータスの内容は以下となります。

ステータスコード

詳細

R

実行中もしくは実行可能状態

S

イベント完了待ち(割り込み可能)

D

イベント完了待ち(割り込み不可/ディスクへの書き込み等)

Z

ゾンビプロセス

基本的な参照の仕方としては、
  1. top行でload averageを確認して負荷の程度を確認する

  2. %Cpu(s)行から、CPUリソースの全体割合がプロセスに割り当てられているのか、システムなのか、他VPSの影響によるものかを参照する

  3. プロセス行から、実際にどんなプロセス/コマンドラインが影響を及ぼしているか確認する(特に%CPUで判断)

の順に見ていくと、全体から個別に対して視点が移っていくため問題の特定が行いやすいです。
なお、CPU制限時にはstが上昇します。
3-2. 過去の負荷状況の確認
topコマンドでは現在の負荷状況と、プロセス情報の確認をリアルタイムに行うことができました。
今度は逆に、過去の状況を確認する場合 sysstat というパッケージを利用して行います。
ただし、デフォルトでのデータ取得時間は10分毎となっているため、あくまでも情報の目安として後追いできるようにしておくという形になります。
有益な情報源となるため、セットアップ時にsysstatパッケージを導入しておくことをおすすめします。
# dnf install sysstat
# sar  ←  現在までのCPUリソース情報を10分おきに表示させる。
# sar -u ALL -P ALL 1  ← CPUコア毎に、現在の全てのリソース情報を1秒おきに表示させる。
# sar -f /var/log/sa/sa<指定日>  ← 過去日(ファイル名後半の数字が日を表す)の状況を表示する。
# sar -u ALL -P ALL -f /var/log/sa/sa<指定日>  ←  過去日のCPUリソースの統計情報を全て表示する。
上記のsarコマンドで、全体的なCPUリソースの利用状況の統計情報を確認します。
オプションの最後に数字を入力すれば現在の情報が、-f ファイルを指定すれば過去日の統計情報を参照することが可能です。
なおファイル名ですが、 saはコマンドで参照する情報を指定可能なバイナリファイル で、 sarは全ての情報を書き込んだテキストファイル となります。

コマンドで出力される内容はtopコマンドで説明したものとほぼ同様ですが、以下に出力内容の項目を記載します。

項目

詳細

%irq

CPUがハードウェア割り込みを処理するのに費やした時間の割合

%soft

CPUがソフトウェア割り込みを処理するのに費やした時間の割合

3-3. ネットワーク負荷状況の確認
上記のsarコマンドの内容で、過去履歴におけるCPUリソースの負荷がどの程度であったか確認する方法を記載しました。
次に、CPUリソースが利用された原因の特定として、ネットワークに対するアクセス状況を確認していきます。
# sar -n DEV,EDEV 1  ← 各ネットワークデバイスの通信/エラー状況を1秒毎に表示する。
# sar -n DEV,EDEV -u ALL 1 ← CPUリソースの状況も追加して表示する。
# sar -n DEV -f /var/log/sa/sa<指定日> ← 10分単位での通信状況をログファイルから確認する。
# sar -n EDEV -f /var/log/sa/sa<指定日> ← 10分単位でのエラー状況をログファイルから確認する。
3-2に引き続き、sysstatを利用してネットワークの状況を確認することが可能です。
表示される項目の内容については以下となります。
※rがreceive(受信)、tがtransmit(送信)を表しています。

キーワード

項目

詳細

DEV

IFACE

ネットワークのデバイス名

---

(r|t)xpck/s

1秒あたりの送受信されたパケットの総数

---

(r|t)xkB/s

1秒あたりの送受信された総通信量(キロバイト単位)

---

rxmcst/s

1秒あたりの受信マルチキャストパケット数

EDEV

(r|t)xerr/s

1秒あたりの送受信されたエラーパケットの総数

---

(r|t)xdrop/s

1秒あたりの送受信されたドロップパケット総数


この出力結果から、どれだけのパケットがインターフェースを通じて出力されたのか、その際にエラーは発生していたのか等を知ることができます。
また上記のコマンドをsysstatのファイルを対象にして実行すると、過去履歴においてどの程度の負荷が発生していたのか、その時間帯はいつ頃だったのか、をある程度正確に把握することが可能です。

通信がどこから、どのポート(サービス)に対して発生しているのかをリアルタイムで確認する場合は、下記の iftop コマンドが便利です。
# dnf install iftop
# iftop -nPb -i ens3
-n 名前解決の停止
-P ポートの表示
-b グラフィカルバーの非表示
-i 実行インターフェースの指定
上記のようにiftopコマンドを実行すると、どのIPアドレスから、ご利用VPSのどのポート(サービス)に対してアクセスがあり、ご利用VPSからどのIPアドレスに対してどれだけの通信量を返しているか、視覚的に捉えられます。

-Nオプションを指定するとポートのサービス名変換を停止可能です。(閲覧中に Shift+N を押すことで切り替えも可能です。)

また、確認中に Shift+P を入力することで、表示を一時停止させることが可能です。出力結果を保持しておきたい場合に便利ですので、是非ご活用ください。

解除は同様にShift+Pを入力することでできます。

この結果から、対象のサービスが出力しているログを確認し、外部からもしくは、内部からどのようなアクセスが行われているのかを確認することが必要になります。

なおポートがウェルノウンポートではない、このポートを利用しているプロセスがわからない、等であれば、以下のようにポートを使用しているプロセスを特定することができます。
# dnf install lsof
# lsof -i:<対象のポート番号>
この実行結果から、ポートを使用しているユーザー、実行コマンド、PID等の情報が確認できます。

もし想定外のポート番号でLISTENしているプロセスが存在する場合や、外部の22番ポート(SSH)や25番ポート(SMTP)などに頻繁にアクセスしているプロセスが存在する場合、ご利用VPSが悪用されている可能性があります。

その場合はどのシステムを改ざんされているか等の判別が困難であるため、OS再インストールを実施いただき、利用環境の初期化を実施いただくよう、お願いいたします。
OSの再インストールに関しては OS再インストール をご参照ください。
3-4. ディスク負荷状況の確認
次にディスクの負荷状況の確認方法について記載します。
現在のディスクアクセス状況を確認する場合には、 iostat コマンドを利用します。このコマンドはsysstatパッケージに同梱しているため、インストールしていない場合はインストールをお願いいたします。
# dnf install sysstat
# iostat -dmxzN 1 ← 1秒毎にデバイスの活動情報を出力する。
-d デバイス状態のレポートのみ行う(デフォルトはCPU状況も含む)
-m 出力される単位をメガバイトへ変換
-x 出力項目の拡張を行う
-z ディスクアクセスが行われているデバイスのみ表示する
-N デバイス番号ではなく、マッピングされた名前を表示する(LVMを利用している場合に有効)
このコマンドから、どのデバイスに対してどれだけのアクセス処理が発生しているのかを把握することが可能です。
また引数にデバイス名(/dev/vdaや、/dev/vda2等)を指定すれば、特定のデバイスに対する状態を確認することができます。
以下に出力された項目の内容をまとめます。

項目

詳細

Device

対象のデバイス名(表示項目をiostatの引数で指定することが可能)

(r|w)/s

読み込みor書き込みリクエストの回数

(r|w)MB/s

1秒あたりの読み込みor書き込みセクタ数(メガバイト単位、オプションで指定)

(r|w)_await

読み込みor書き込み要求が処理されるまでの平均時間

(r|w)areq-sz

読み込みor書き込み要求の平均サイズ (キロバイト単位)

%util

デバイスに発行された経過時間の割合 (デバイス利用率)

過去の負荷状況を確認する場合には、sysstatパッケージに入っているsarコマンドを以下のように利用し、10分ごとの統計情報を参照します。
# sar -d -j PATH -f /var/log/sa/sa<指定日>
出力内容の項目は、iostatで出力された内容とほぼ同じものになります。(出力されるrkB/s等のみ、キロバイト換算されていることにご注意ください。)

なお、これまでの対応方法ではIOのアクセス量からどのデバイスに対してのアクセスが多いか、という分析を行ってきました。
ですので次のステップとして、そのIOアクセスが何によって生み出されているのかを、 iotop コマンドを利用して特定します。(sar、iostatのみでおおよそ予測がつく場合もあります。)
# dnf install iotop
# iotop -Po
-P PID(プロセスID)の表示
-o 現時点でデバイスへのIOアクセスを行っているプロセスのみを表示
このコマンドでは、プロセスのPID/1秒あたりのREAD(WRITE)バイト数/それを発生させているプロセスの順に出力されます。
アクセス量の単位については、自動でキロ、メガ、ギガにスケーリングされます。
iotopには通常のtopコマンド同様に、-bによるバッチモードがあるため、定期的に発生する負荷要因の特定を行いたい場合等は、バッチモードで結果をログとして出力させ、事象発生時に確認する、という調査も可能です。

4. プログラムの修正を行う

これまでの確認から、以下について把握が進んだものと思います。
  • グラフからCPUリソースの利用はいつからいつまで行われているのかの把握

  • CPUリソースは、ネットワークやディスクIOの影響によって発生したのかをグラフから予想すること

  • CPUリソース利用率の高いプロセスの確認方法

  • 高CPUリソース利用がネットワークに起因する場合の、詳細特定方法

  • 高CPUリソース利用がディスクIOに起因する場合の、詳細特定方法

以上の内容から、高CPUリソース利用にあたって実行されているプロセス/サービスを特定し、その抑制方法を検討していきます。

修正方法については、さくらのVPSではroot権限をお渡ししている関係上、弊社ではご案内することはいたしかねますため、お客様にて調査及び改善をお願いいたします。

Note

topコマンドにおいてのst、sarコマンドにおける%stealの値が増大している場合、お客様ご利用VPSと同じホストに多数のVPSが収容されている可能性がございます。
通常の提供レベルの範囲内である可能性もございますが、他収容VPSが暴走している可能性もございますので、負荷が高すぎると思われる場合は、弊社サポートまでご連絡ください。

IOPS制限時に確認すべきこと

IOPSリソースの制限は、主に以下の内容が確認された場合に自動的に実施されます。
  • ご利用VPSが収容されているホストサーバー上の負荷が上昇し

  • 監視確認時にご利用VPSのIOPSリソースの割当量がしきい値を超過していた場合

また、以下の様な場合には弊社のオペレーションとして手動で制限を実施する可能性がございます。
手動での制限実施時は、制限実施後に対象のお客様へ、メールにてご連絡を差し上げております。
  • ホストサーバー上の負荷が上昇し、他収容中のVPSへの影響が出ていると判断された場合

  • 弊社へのパフォーマンスに関する問い合わせから、お客様のご利用VPSが起因となってパフォーマンス劣化が発生していると判断された場合

5. コントロールパネルから、該当VPSのディスク利用率を確認する

コントロールパネル上にてIOPS制限の表示が確認できた場合、まずはDISK IOのリソース状況を確認します。
リソース表示には「日/週/月」の単位があり、下記の内容が視覚的に判断できるようになっています。
  • DISK IOリソースをどの程度利用しているのか

  • DISK IOリソースがいつ頃から大幅に利用され始めたのか

  • DISK IOリソースの制限がいつ頃から発生するようになったのか

ディスク利用率の確認

Note

DISK IOリソースのグラフが表す縦軸の数値は、 「Bytes per Second(Byte毎秒)」 を表しています。
この項目は 読み書きされたデータ容量の総和を、時間単位で割った値 をグラフに出力させています。

6. IOPS制限とは具体的に何を制限しているのか

IOPSとは、具体的にはデバイスに対して読み込みや書き込み(IO)を行うための要求数、つまり リクエスト数 を表します。
グラフ上には読み書きされるデータ容量の総和を表示していますが、それを算出する式を以下に記します。

読み書きされるデータ長 x IOのリクエスト数(IOPS) = 読み書きされるデータ容量の総和(データ転送帯域)

上記の式からお分かりいただけると思いますが、結論としてIOPS制限とはIOのリクエスト数を減少させるものであり、それを制限することによってデータ容量の総和を制限する、という仕様になっています。
なお、ご利用VPS上で標準的に利用可能なしきい値は、リソース制限 の、「IOPSとデータ転送帯域について」部分に記載されています。

実際にしきい値の確認をコマンド上で確認されたい場合は、以下のようにしてみると実感できると考えられます。(テストで10G程度のファイルを作成しようとしているため、容量の余白にご注意ください)
  • 端末Aで実行

# dd if=/dev/zero of=/var/tmp/test oflag=direct count=20971520
※/var/tmp/testに 512byte x 20971520 = 10GBのファイルを作成します。(ddコマンドのbs値を設定しない場合、デフォルトの512byteとなります)

# dd if=/dev/zero ibs=64 of=/var/tmp/test oflag=direct count=671088640
※/var/tmp/testに 64byte x 671088640 = 10GBのファイルを作成します。(非常に遅いので、途中でCtrl+Cを入力してください)
  • 端末Bで実行

# iostat -dmxzN 1
上記を実行してiostatの様子を見ていると、count=20971520を指定した方は、(おそらく)vdaのデバイスのwMB/s項目が200近辺まで上昇し、それ以上は増加しないと考えられます。
これは標準的に利用可能なデータ転送帯域、200MB/sのしきい値の利用上限にぶつかっていることを示しています。

一方でibs=64を指定した方は、w/s(書き込みリクエスト数)が2000もしくは1500近辺まで上昇し、それ以上は増加しないと考えれられます。
この内容から、細かくて小さいファイルを大量に送信しようとするとIOPSに抵触しやすく、大容量のデータを操作するとデータ転送帯域に抵触しやすくなる、という状況が確認できます。

7. IOPSの制限が行われた際の、VPS内部確認方法

こちらは 「3-4. ディスク負荷状況の確認」 に記載した内容と同様に、iostat、sar、iotopなどを利用して、負荷状況をご確認ください。
その結果から、ディスクへのアクセスがデータ転送帯域の上限にぶつかっているのか、IOPSの上限にぶつかっているのか等を見ていただいた上で、それらがどのプロセス/サービスによって行われているかを確認し、改修のご検討をいただくよう、お願いいたします。