むろっちのStacking

日々の中で学んだIT知識をメモして置く場所

Windows7環境下で共有フォルダアクセスが遅い場合のチューニング

共有フォルダアクセスが遅いときには様々な複合的要因が重なって発生しているケースが多い。 普段対応する際に考えているトラブルシュートをリストしてみた

  • ストレージのパフォーマンスが遅い
  • ネットワークのパフォーマンスが遅い
  • 2拠点間のレイテンシが大きい
  • 2拠点間の帯域が細い
  • SMBプロトコルの動作が悪い
  • SMBプロトコルが意図せず古いverを利用している
  • その他SMBパラメータのチューニング

ストレージのパフォーマンスが遅い


共有元、共有先のローカルディスクのRead,Write性能を確認することができる 簡単に使えるソフトとしてはCrystalDiskMarkが有名だ 起動して速度を図りたいドライブを指定する

上から順に以下のようなテスト意味合い

  • Seq Q32T1: マルチキュー&スレッドによるシーケンシャルリード/ライトテスト (Block Size=128KiB)
  • 4K Q8T8: マルチキュー&スレッドによるランダムリード/ライトテスト (Block Size=4KiB)
  • 4K Q32T1: マルチキュー&スレッドによるランダムリード/ライトテスト (Block Size=4KiB)
  • 4K Q1T1: マルチキュー&スレッドによるランダムリード/ライトテスト (Block Size=4KiB)

基本的にシーケンシャルが一番速度が出るので、このディスクの最大スループットはシーケンシャル程度と認識できる

注意

ただCrystalDiskMarkは厳密な速度測定には向かないかもしれない。速度を図る際にストレージコントローラ側の キャッシュに収まるサイズのデータしか指定しない場合はパフォーマンスが異常に高い数値がでるケースもある。あくまで ディスクパフォーマンスのブラックボックステストとして考えたほうがいいだろう
 

ベンチマーク時に同時に確認してほしい項目

タスクマネージャ > パフォーマンス > リソースモニター > ディスク のディスクキュー項である。ディスクにどの程度Read/Writeの命令が溜まっているかという指標である。 指標の数値が大きければ、命令に対してディスクの処理が追い付いていないということになる

この値は通常はRAID本数以下程度が望ましいとされている

ネットワークのパフォーマンスが悪い


ネットワークのパフォーマンスが共有アクセスに影響する要因としてはレイテンシと、帯域2つの観点がある SMBアクセスはTCPパケットにて動作しているため、レイテンシが大きい環境下ではTCPパケットの正常性確認パケット待ちのため 思ったようにパフォーマンスが出ないケースも多い

2拠点間のレイテンシが大きい

素直にPingで図ろう。時間のところを確認してもらえればいい

192.168.0.1 に ping を送信しています 32 バイトのデータ:
192.168.0.1 からの応答: バイト数 =32 時間 <1ms TTL=64
192.168.0.1 からの応答: バイト数 =32 時間 <1ms TTL=64
192.168.0.1 からの応答: バイト数 =32 時間 <1ms TTL=64
192.168.0.1 からの応答: バイト数 =32 時間 <1ms TTL=64
2拠点間の帯域が細い iperfというツールを使う

このツールはクライアント、サーバーの2つに分かれており クライアントがiperfサーバーに接続する形でパフォーマンスが確認できる。 以前はWindows版がなかったのだが、気づいたらWindows版が出ている模様 細かいオプションは多くあるが、一旦以下で測定できる

サーバー側

iperf -s

クライアント側

iperf -c server_ip

SMBプロトコルの動作が悪い

SMBプロトコルが意図せず古いverを利用している

Windows8以降であればPowerShellにて現在接続中のSMB情報が確認できる。 管理者権限でPowerShellを立ち上げたうえで

PS C:\WINDOWS\system32> Get-SMBConnection

ServerName ShareName UserName Credential Dialect NumOpens
---------- --------- -------- ---------- ------- --------
smb-sv share1 TEST\test TEST\test 3.0.2 3
smb-sv share2 TEST\test TEST\test 3.0.2 3
smb-sv share3 TEST\test TEST\test 3.0.2 3

これで確認すべきは Windows7系:SMB2系の表示であるか Windows8以降:SMB3系の表示であるか

それぞれのVerが各OSで利用できるSMBの最大Verのため、数値が異なる場合は何かしらの理由にて下位のSMBしか利用できない 状況になっている。

その他SMBパラメータのチューニング

Microsoftから以下のようなファイルが公開されている Performance Tuning Guidelines for previous versions of Windows Server

ざっくりな設定方針としてはSMBサーバー、クライアントのレジストリをいじってチューニングしてくださいとのこと

以下のガイドからチューニング例抜粋

ガイド記載のチューニング例

  • サーバー側
Parameter Value
NtfsDisable8dot3NameCreation 1
TreatHostAsStableStorage 1
AdditionalCriticalWorkerThreads 64
MaximumTunnelEntries 32
MaxThreadsPerQueue 64
RequireSecuritySignature 0
MaxMpxCt (not applicable with  SMB 2 clients) 32768

   

  • クライアント側
Parameter Value
DisableBandwidthThrottling 1
EnableWsd 0
RequireSecuritySignature 0
FileInfoCacheEntriesMax 32768
DirectoryCacheEntriesMax 4096
FileNotFoundCacheEntriesMax 32768
MaxCmds 32768
DormantFileLimit [Windows XP only] 32768
ScavengerTimeLimit [Windows XP only] 60
DisableByteRangeLockingOnReadOnlyFiles [Windows XP only] 1

 

細かいレジストリの場所はドキュメントで参照してほしい。キーがなければ作成等する必要がある

ただ、私の環境で実施したところWindows7クライアントとしては以下の値を変更するのが効果が大きかった。

  • DisableLargeMtu HKLM\system\CurrentControlSet\Services\LanmanWorkstation\Parameters (REG_DWORD)

この値は規定1なので0にするとLargeMtuが利用できる。大体2割程度のパフォーマンスが改善した