パフォーマンスモニターを使ってsshdプロセスの負荷を監視する
はじめに
Windowsパフォーマンスモニターを使ってsshdプロセスに関するテストを行いながら、実際にサーバーリソースの使用状況を観察してみます。
環境
Windows、Linuxの環境は以下の記事で作成した仮想環境を使用します。
パフォーマンスモニターのプロセスごとの設定手順は以下になります。
参考
手順
(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%くらい(高めかも)
- ネットワーク
- ネットワーク帯域の使用率は低く問題なさそう
- CPU
-
sshdプロセス
- メモリ
- ファイル転送時にメモリが大幅に増加(通常10MB→最大160MB)
- I/Oスループット
- ファイル転送時にI/Oスループットが最大140MB/s超に達する
- スレッド数・ハンドル数
- スレッド数とハンドル数がファイル転送時に大幅増加
- メモリ
-
転送完了後は正常値に戻っており、メモリリークなどの問題は見られない
-
転送完了後はハンドルやスレッドの適切な解放が確認できる
-
通常時のリソース使用率は安定している(CPU 5-10%、メモリ75-80%)
結果を受けてこれからどうするか
- 大容量ファイルの転送の際にはCPU使用率が100%に達するため、他プロセスが動いている時間を避ける(他のジョブやバックグラウンド処理が集中していないかを確認する)
-
sshd_config
にてMaxSessions
やMaxStartups
を適切に設定し、同時接続数を制限する - より効率的な転送方法の変更の検討
- ハードウェアのアップグレード など
おわりに
実際にテスト・またパフォーマンスモニターの結果の分析まで行うことで、より理解が深まった気がします。次はツールを使ってサーバのパフォーマンスの確認を行いたいです!
Discussion