🕌

パフォーマンスモニターを使ってsshdプロセスの負荷を監視する

に公開

はじめに

Windowsパフォーマンスモニターを使ってsshdプロセスに関するテストを行いながら、実際にサーバーリソースの使用状況を観察してみます。

環境

Windows、Linuxの環境は以下の記事で作成した仮想環境を使用します。
https://zenn.dev/marogram/articles/58163a05b3461d
https://zenn.dev/marogram/articles/d7244dc3192d7f

パフォーマンスモニターのプロセスごとの設定手順は以下になります。
https://zenn.dev/marogram/articles/95eb25b809c8ab

参考

https://azuread.net/archives/3207

手順

(Windows)パフォーマンスモニターの設定・開始

今回は、以下のカウンターで設定します。
パフォーマンス > データコレクターセット > ユーザー定義 > 新規作成

  • CPU
Processor
% Processor Time → _Total
% User Time → _Total
% Privileged Time → _Total

System
Processor Queue Length
  • メモリ
Memory
Available MBytes
Committed Bytes
Page Faults/sec

Paging File
% Usage → _Total
  • ディスク
PhysicalDisk
% Disk Time → _Total
Disk Read Bytes/sec → _Total
Disk Write Bytes/sec → _Total
Current Disk Queue Length → _Total
  • ネットワーク
Network Interface
Bytes Total/sec → <接続アダプター>
Bytes Received/sec → <接続アダプター>
Bytes Sent/sec → <接続アダプター>
Packets/sec → <接続アダプター>
  • プロセス(sshd)
Process
% Processor Time → sshd
Working Set → sshd
Private Bytes → sshd
IO Data Bytes/sec → sshd
Handle Count → sshd
Thread Count → sshd

設定した後、手動で開始します。
パフォーマンス > データコレクターセット > ユーザー定義 > 右クリック > 開始

(Linux)バイナリファイルを作成し、WindowsへSFTP送受信を行う

以下のコマンドを実行し、サイズが"4KB" "64KB" "512KB" "2MB" "8MB" "32MB" "128MB" "256MB" "512MB" "1GB" "2GB"のバイナリファイルを作成します。

sizes=(4 64 512 2048 8192 32768 131072 262144 524288 1048576 2097152)
labels=("4KB" "64KB" "512KB" "2MB" "8MB" "32MB" "128MB" "256MB" "512MB" "1GB" "2GB")

for i in {0..10}; do
size=${sizes[$i]}
label=${labels[$i]}
echo "生成中: file$i ($label)"
if [ $size -lt 1024 ]; then
dd if=/dev/urandom of="file$i.bin" bs=1024 count=$size 2>/dev/null
else
dd if=/dev/urandom of="file$i.bin" bs=1M count=$((size/1024)) 2>/dev/null
fi
done

その後、Windowsに向けて先ほど作成したファイルの送受信を行います。

find . -maxdepth 1 -type f -name "*.bin" | \
xargs -P 11 -I {} sh -c '
filename=$(basename "{}")
echo "Processing: $filename"
sftp -i ~/.ssh/id_rsa winuser@winip << EOF
put {} /C:/Users/winuser/test/$filename
get /C:/Users/winuser/test/$filename ../received/$filename
bye
EOF'

(Windows)パフォーマンスモニターの停止

ファイルの送受信処理が完了したら、パフォーマンスモニターの停止を行います。
パフォーマンス > データコレクターセット > ユーザー定義 > 右クリック > 停止

レポートを出力し、実際のデータを確認してみます。
パフォーマンス > レポート > ユーザー定義 >データコレクターセット名 > 右クリック > 表示 > パフォーマンスモニター
グラフ上にて右クリック > データ保存 > CSVファイルにて保存

テスト結果の分析

実際のデータをグラフ化して分析してみます。(無料のオンライン版のExcelなので、できるところまでやってみます)

  • テストスケジュールのおさらい
22:03 パフォーマンスモニター開始
22:20 sftpファイル送受信処理開始〜処理が終わらないため、一時中断
22:28 再度開始
22:29 終了
22:33 パフォーマンスモニター停止

CPU使用率

計算式:100% - \\WINDOWS_11\Processor(_Total)\% Processor Time

メモリ使用率

計算式:4GB(実装RAM) - (\\WINDOWS_11\Memory\Available MBytes) / 4GB * 100%

ディスク(I/Oスループット)

  • \\WINDOWS_11\PhysicalDisk(_Total)\Disk Read Bytes/sec
  • \\WINDOWS_11\PhysicalDisk(_Total)\Disk Write Bytes/sec

ネットワーク

計算式:(\\WINDOWS_11\Network Interface(vmxnet3 イーサネット アダプタ)\Bytes Total/sec / 1024 / 1024) / 2,500MB

今の環境が集計リンク速度 (送受信): 10/10 (Gbps)のため、Gbps(ギガビット)をMB/sec(メガバイト毎秒)に変換します。
10Gbps × 2(送信+受信) = 20Gbps
20Gbps ÷ 8 = 2,500MB/sec

sshdプロセス

CPU使用率

計算式:\\WINDOWS_11\Process(sshd)\% Processor Timeの合計

メモリ使用量

計算式:\\WINDOWS_11\Process(sshd)\Working Setの合計、\\WINDOWS_11\Process(sshd)\Private Bytesの合計

ディスク(I/Oスループット)

  • \\WINDOWS_11\Process(sshd)\IO Write Bytes/secの合計
  • \\WINDOWS_11\Process(sshd)\IO Read Bytes/secの合計

スレッド数(並行処理能力と負荷分散)

  • \\WINDOWS_11\Process(sshd#)\Thread Countの合計

ハンドル数(接続数とファイル操作の状況)

  • \\WINDOWS_11\Process(sshd)\Handle Countの合計

結果

  • テストを行った22:20頃と22:30頃に、CPU・メモリ・ディスクともに高負荷になっている

  • システム全体

    • CPU
      • ファイル転送時にCPU使用率が急激に上昇(最大100%近く)
    • メモリ
      • 使用率75〜80%くらい(高めかも)
    • ネットワーク
      • ネットワーク帯域の使用率は低く問題なさそう
  • sshdプロセス

    • メモリ
      • ファイル転送時にメモリが大幅に増加(通常10MB→最大160MB)
    • I/Oスループット
      • ファイル転送時にI/Oスループットが最大140MB/s超に達する
    • スレッド数・ハンドル数
      • スレッド数とハンドル数がファイル転送時に大幅増加
  • 転送完了後は正常値に戻っており、メモリリークなどの問題は見られない

  • 転送完了後はハンドルやスレッドの適切な解放が確認できる

  • 通常時のリソース使用率は安定している(CPU 5-10%、メモリ75-80%)

結果を受けてこれからどうするか

  • 大容量ファイルの転送の際にはCPU使用率が100%に達するため、他プロセスが動いている時間を避ける(他のジョブやバックグラウンド処理が集中していないかを確認する)
  • sshd_configにてMaxSessionsMaxStartupsを適切に設定し、同時接続数を制限する
  • より効率的な転送方法の変更の検討
  • ハードウェアのアップグレード など

おわりに

実際にテスト・またパフォーマンスモニターの結果の分析まで行うことで、より理解が深まった気がします。次はツールを使ってサーバのパフォーマンスの確認を行いたいです!

Discussion