ネットワーク経由のデータ転送が突然低速 (1Gbps→100Mbps) になるのを改善

OpenMediaVault のNAS と Windows10 間のデータ転送を SMB を使って行っているが1Gbpsの回線であるにもかかわらず、突然 100Mbpsになってしまう。一旦、100Mbpsになると転送を終えるまで、そのまま固定されています。つぎに転送する時はまた1Gbps近くの速さで転送し始めるのですが、なにかの拍子に突然 100Mbpsになってしまいます。この原因がなんだか分からず、色々検討しました。結局正確な事は、まだ分かっていないのですが、取り合えず、今はなんとか収まっていますので、推定も含めてその原因らしき事を考え、対策を説明します。

PCシステムのネットワーク結線

私のPCシステムの結線と各ハブの設置に関して説明致します。赤い結線はギガイーサの結線で1000BASE-Tで繋がっています。物理的配線はCAT6のフラットケーブルです。茶色は100BASE-Tで繋がっており、物理的にはこれもCAT6のフラットケーブルです。WinPC0~WinPC3 はOSはWindows10 pro で LinuxPC は具体的にはDebian baseの Openmediavaul5 の NAS です。

こんな感じで、0 ~ 最大1000Mbps の間でデータ転送していたのが、突然 最大100Mbps に速度が固定されます。データ転送の様子を見ていると100Mbpsの低速になった時にはネット結線図の点線の回線のランプが黄色になって100Mbpsモードになっています。(緑=1000Mbps, 黄=100Mbps)スイッチングハブ①とスイッチングハブ③の結線は10mを使用しており、割と長いので最初はこの結線による減衰で低速化していると疑いました。ネットでググッてみると同じ様な現象(ハブのランプが緑→黄になる)に遭遇した方がいるみたいで、この人は物理的結線の劣化との結論の様です。実際、物理的結線を良い物に変えれば治ったみたいで、そういう結論になった様です。でも、なんとなく納得できないので、別の仮説を立ててみました。

低速化の原因の仮説 ・・MTU(Maximum Transfer Unit)の不整合

それが、MTU(Maximum Transfer Unit)の不整合です。MTUとはネットワーク機器(ホスト)が1度に送受信できる、IPヘッダを含めた最大サイズ(バイト数)で一度に送信可能なパケットのデータ量の事を言います。例えば受信側のMTUが送信側より小さくて、かつ送信側がMTUぎりぎりのサイズのデータを送るとフラグメントが発生して、再送になったり、場合によっては受信拒否されたりします。実際には片方向通信ではないので、送受信のMTUが合っている事が望ましいわけです。

そこで、低速化の原因ですが、なんらかのアルゴリズム(これが不明です)で、MTUの不整合が起こるタイミングがあり、これが低速化を起こす元となってデータ転送するPCが低速の回線と勘違いして、低速に切り替えてしまうという仮説を立てました。

各機器のMTU調査

そこで、各機器のMTUを調べてみました。ググッてみるとMTUについて非常に詳しく説明しているサイトがありました。

最適なMTU値を調べるサイトと設定を変更するコマンドでネットワークを高速化(Windows10)

詳しく、丁寧に書かれており、まったく納得してしまいました。また、なぜか一部のサイトだけ開けない! とか開けても表示が遅いとかがMTUの不整合で起こっているみたいなのです。(実際 私も一部のサイトが開けない経験をしています)そこで、私のシステムのMTUについて調べてみます。サイトに書かれている SG TCP/IP Analyzer にアクセスします。すると、表示された値は1454でした。具体的には

回線業者 MTU値
NURO光 1500
auひかり 1492
フレッツ光(v6プラス対応) 1460
フレッツ光 1454

この様になるらしく我が家がフレッツ光である事から附合するものです。Windows10のMTUは 1500 がデフォルトです。前述サイトの説明ではデフォルトのままではフレッツ光とは不整合を起こして速度低下を起こすみたいです。所で、Windows ↔ フレッツ光 の間では不整合を起こして速度低下するのは分かりましたが、なぜWindows ↔ Linux では転送速度低下を突然起こすのでしょうか。それは ・・分かりません(^0^)。 でも、この不整合が引き金となって起こりそうな気もします。もしそうならば、不整合を無くせば、突然の転送速度低化は止まるはずです。

各機器のMTUを同じ(MTU=1454)にする。(フレッツ光の場合)

フレッツ光のMTUは変更できないので、Win 10 も Linux(Openmediavautl) も すべて MTU = 1454に設定します。

まず、Linux(Openmediavaut)はOpenmediavaul で ネットワーク → インターフェース → デバイスを選んで → 編集 で MTUを設定できる様になります。通常はこの項目は空欄なのですが、今回は 1454 と記入します。

次にWindows 10 ですが、前述 のサイトにツール(バッチファイル)があります。このツールはパケットサイズを記入する(=通常は MTU – 28)ので、MTUを記入するよう少し行を追加した物を載せておきます。


@echo off  :STARTMENU
echo.
echo =================================
echo MTUの値の確認と設定変更をします。
echo =================================
echo [1] PINGでパケットの断片化が必要か確認する
echo [2] 現在のMTU値を確認する
echo [3] MTUの値を変更する
echo.

set /p MODE="モードを選択してください:"

if %MODE% == 1 (
goto PING
)else if %MODE% == 2 (
goto SHOWMTU
)else if %MODE% == 3 (
goto SETMTU
)
cls
goto STARTMENU

:PING
:: PINGコマンドでMTU設定値が有効かどうか確認
echo.
set /p PACKETSIZE="MTU設定値を指定してください(例)1500:"
@set /a PACKETSIZE-=28
echo パケットサイズ MTU設定値 - 28:%PACKETSIZE%
echo.
echo on
ping -f -l %PACKETSIZE% www.yahoo.co.jp
@echo off
echo.
goto STARTMENU

:SHOWMTU
:: 現在のMTU設定値を確認する
echo.
echo on
netsh interface ipv4 show interface
@echo off
echo.
goto STARTMENU

:SETMTU
:: MTUの値を変更
echo.
set /p IDX="Idxを指定してください:"
echo.
set /p MTUSIZE="MTUサイズを指定してください(例)1200:"
echo.
echo on
netsh interface ipv4 set interface %IDX% mtu=%MTUSIZE%
@echo off
echo.
goto SHOWMTU

exit 

これをWindows10のメモ帳にコピぺして、ツールを作るのですが、”名前を付けて保存” 時に文字コードをANSI にして下さい。名前は MTUset.bat とでもして下さい。.bat ファイルなので、UTF8 ではなく ANSIにしないと漢字が文字化けしてしまいます。前述のサイト をお読み頂ければ、説明も不要とは思いますが、ここでは実際にこのツールを使った結果をコメント付きで表示して置きます。このツールは管理者として実行して下さい。すでに最適 MTU=1454 が分かっていますので・・・

MTU変更後は、突然の低速化は起こっていません。完全に起こらない証明は、所謂悪魔の証明なのでできませんが、実用的にはもう少し様子をみて、低速化が起こらないなら治ったと見て良いかと思います。その時は逆に元の MTU=1500 に戻して、突然の低速化が起こるかどうか確認してみようと思っています。

タイトルとURLをコピーしました