CentOSでストレージサーバ(RAID5)を組んでみる – その4(不具合解析とその後の処理編)

移転前のサイトからの転記です。日付は当時のものを使用しています。文言などは若干修正を入れています(7年前なので表現が若くて恥ずかしい)。


前回までの記事でファイルサーバに必要な一通りの設定が完了しました。実際にファイル転送させてみたところ想定よりも速度が遅かったため原因を追います。結論として、全て有線接続にして運用することにしました。

ホストPC -> ストレージサーバへの転送速度が遅い (6MB/s)

難関かなと思っていたSambaの設定が無事終了し、無線環境でホストPC (win10) からストレージサーバにファイル転送してみたところエクスプローラの表示でAve.6MB/s 程度しか出てませんでした。Ave.100MB/s 程度は欲しいため想定よりも大分遅い結果となります。そこでサーバの適当なディレクトリをネットワークドライブとして設定してCrystalDiskMarkで詳細な転送速度を計測しました。結果、5.6MB/s となっておりエクスプローラ表示と同等の結果でした。

接続構成図としては [ホストPC] <-> [外付けWi-Fiアダプタ] <-> [AP] <-> [オンボードWi-Fiアダプタ] <-> [ソフトウェアRAIDコントローラ] <-> [RAIDディスク] となります。Wi-Fi通信規格は全てIEEE 802.11.ac接続です。また双方のWi-Fiアダプタはアンテナ有りモデルで、APにはビームフォーミング機能も搭載されており無線環境としては申し分ないです。また半径3m以内に全てのデバイスを置いて計測しており感度は良好です。ここからボトルネックを探してみます。

ボトルネックを探す

ストレージサーバ内の書き込み速度計測

ストレージサーバのハード単体の書き込み速度を測ります。RAID5は書き込み時にパリティ計算を必要とします。今回はこのように負荷の大きいRAID5をハードウェアRAIDではなくソフトウェアRAIDで組んでおり書き込み速度がCPU性能に依存します。CPU性能が要求スペックを満たしていない場合、ソフトウェアRAIDコントローラからRAIDディスクへの書き込みがボトルネックになっていることは十分考えられます。

ただし、今回のサーバに使ったパーツは標準使用のPCパーツを寄せ集めたものです。例えばCPUはストレージサーバとしてはオーバースペック気味なIntel i3-4160を使っており、ここがボトルネックになっているとは考えにくいかなとは思っています。

Linuxシステムでの書き込み速度計測方法にはいくつかの手段がありますが、ddコマンドでディスクの書き込み性能を簡易測定するhdparmコマンドとddコマンドでハードディスクの簡易ベンチマークをするを参考にしてddコマンドで実施することにしました。

結果は以下の通り237MB/s出ていたため、ストレージサーバのハード自身がボトルネックになっていることは無さそうです。ホストPC -> AP、AP -> サーバ間のネットワークパフォーマンスに原因が有りそうなため、続けてその視点で確認します。

$ dd if=/dev/zero of=/tmp/testing bs=1M count=1024
1024+0 レコード入力
1024+0 レコード出力
1073741824 バイト (1.1 GB) コピーされました、 4.52573 秒、 237 MB/秒

全て無線環境でのネットワークパフォーマンス計測

一般に、Linuxシステムでのネットワークパフォーマンス計測にはiPerfというツールが使われるようです。iPerfはTCP(UDP)データ ストリームを作成して、それらを運んでいるネットワークのスループットを測定することができます。導入を試みましたがポート設定やファイアウォール設定を見直してもエラーが発生して詰まってしまったため、今回はpingでざっくり計測することにしました(今回はそこまで詳細な計測を必要としないため代用できると判断しました)。備忘録として、ファイアウォール設定は以下の通りでした。

# firewall-cmd --list-all
# firewall-cmd --zone=public --add-port=5001/tcp
# firewall-cmd -reload

CrystalDiskMarkによる転送速度とpingの計測値です。pingのラウンドトリップタイム (RTT) とは往復レイテンシのことで、通信相手にデータを発信してから応答が帰ってくるまでにかかる時間を指します。データサイズは60000バイト、試行回数は30回としました。結果はAve.120msという結果になっており、目安としてはかなり遅いです。ネットワーク環境自体に問題がありそうなことが分かりました。

・CrystalDiskMark

・pingログ

C:\Users\xfire>ping -l 60000 -n 30 ***.***.***.***
***.***.***.*** に ping を送信しています 60000 バイトのデータ:
***.***.***.*** からの応答: バイト数 =60000 時間 =113ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =118ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =122ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =117ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =117ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =115ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =120ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =118ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =114ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =116ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =117ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =118ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =108ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =110ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =122ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =124ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =129ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =128ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =119ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =116ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =157ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =117ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =124ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =114ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =184ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =114ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =113ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =107ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =109ms TTL=64

***.***.***.*** の ping 統計:
    パケット数: 送信 = 30、受信 = 29、損失 = 1 (3% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 107ms、最大 = 184ms、平均 = 120ms

サーバ側のみ無線環境でのネットワークパフォーマンス計測

ホストPC -> AP間は有線接続にし、AP -> サーバ間は無線接続のままとしました。pingのラウンドトリップタイム (RTT) はAve.7msとなり、全て無線環境のときと比較して10%以下になりました。ただしディスクの書き込み時間は20MB/sに留まっており、ネットワーク以外の部分にも原因がありそうなことが分かりました。取り急ぎAP -> サーバ間も有線接続にして計測します。

・CrystalDiskMark

・pingログ

C:\Users\xfire>ping -l 60000 -n 30 ***.***.***.***
***.***.***.*** に ping を送信しています 60000 バイトのデータ:
***.***.***.*** からの応答: バイト数 =60000 時間 =7ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =8ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =7ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =7ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =7ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =9ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =7ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =7ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =7ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =7ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =7ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =7ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =8ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =8ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =8ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =7ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =7ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =8ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =7ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =6ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =8ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =7ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =7ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =7ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =7ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =7ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =7ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =7ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =7ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =7ms TTL=64

***.***.***.*** の ping 統計:
    パケット数: 送信 = 30、受信 = 30、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 6ms、最大 = 9ms、平均 = 7ms

全て有線環境でのネットワークパフォーマンス計測

pingのラウンドトリップタイム (RTT) はAve.2msとなり申し分ない結果となりました。またディスクの書き込み時間も想定していた100MB/sに到達しました。AP -> サーバ間が無線接続の場合に書き込み時間が上がらなかった理由は不明ですが、しばらくは全て有線接続で運用しようと思います。

・CrystalDiskMark

・pingログ

C:\Users\xfire>ping -l 60000 -n 30 ***.***.***.***
***.***.***.*** に ping を送信しています 60000 バイトのデータ:
***.***.***.*** からの応答: バイト数 =60000 時間 =2ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =2ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =2ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =2ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =2ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =2ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =2ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =2ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =2ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =2ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =2ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =2ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =2ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =2ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =2ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =2ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =2ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =2ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =2ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =2ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =2ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =2ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =2ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =2ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =2ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =2ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =2ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =2ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =2ms TTL=64
***.***.***.*** からの応答: バイト数 =60000 時間 =2ms TTL=64

***.***.***.*** の ping 統計:
    パケット数: 送信 = 30、受信 = 30、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 2ms、最大 = 2ms、平均 = 2ms

全て有線接続にするために以下のイーサネットケーブル (10m) を購入しました。

以上です。