Windowsからの転送が遅い問題
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
http://www.jp.freebsd.org/QandA/HTML/1926.html
Q. LAN 経由での Windows から FreeBSD へのデータ転送が、...
圧倒的に遅いです。Windows 同士だとこのような現象は起り...
A. 最大の理由は「Winsock2 は 2 packet 送信すると ack を...
Windows の TCP/IP 層はデフォルトでは 2 packet 送信する...
てしまいます。unix は TCP Window size にゆとりがある場...
向うはまだ送ってくるだろうから」と安心して piggy bag ...
がないか調べるために、10msec ほど沈黙します。当然一方...
とか) の場合 piggy bag などできるパケットが存在しませ...
10msec の間、全くデータが転送されることがなくなります。
Windows 同士の場合、受け側も「2packet 受け取ったら速攻...
ねばならぬ」と思い込んでいるので、この「待ち」がほとん...
FreeBSD でこの問題を解決するには、sysctl で
# sysctl -w net.inet.tcp.delayed_ack=0
(デフォルトでは、net.inet.tcp.delayed_ack: 1)
とすることです。こうすれば piggy bag できるかどうか悩...
FreeBSD は ack を即座に返すようになります。
ただし、この設定は「特定のコネクション相手」単位では設...
全体に有効になってしまいます。で、他の unix マシンと通...
これは ack を投げすぎることになるので、逆にパフォーマ...
性が高いです。
なお、この現象は [管理番号 1582] に似ていますが、異な...
しかし、Winsock2 に起因するところは同じです。ただし、W...
(と多分 Windows Me) の Winsock2 では発生しないようです。
http://www.jp.freebsd.org/QandA/HTML/1582.html
Q. LAN 経由での FreeBSD から Windows へのデータ転送が、...
Windows 同士だとこのような現象は起りません。
A. 一般的な解は、一般的な要因に依存するため、何とも判り...
のような場合が Winsock2 の場合にあり得ることは判ってい...
一部の NIC では、NIC のせいなのか NIC Driver のせいな...
すが、Windows で使った場合に、時々 packet の取りこぼし...
これは、NIC が用意している Recieve Buffer の大きさが、...
Recieve Buffer よりも小さい場合、Winsock2 が NIC から ...
吸い出す前に NIC の Recieve Buffer が溢れてしまうため...
ないか、と推測されます。
Winsock2 の挙動を tcpdump などで見ると判るのですが、Wi...
通信において、Winsock は送信において次のようなルールに...
うに見えます(これは、そう「見える」と言っているだけで...
「なっている」という意味で言っているのではありません。...
実装がどうなっているのかは、そのソースコードを見ること...
上、全く不明です)。
I) 2つのマシン A,B があって、A->B というデータ転送し...
A というマシンは
Send, Send, Ack 待ち
というパターンを忠実に守っているように見える。
II) 2つのマシン A,B があって、双方向に転送すべきデー...
A というマシンは
Send(これには直前の Send に対する Ack を含んでい...
Data 待ち(これには直前の Send に対する Ack が含ま...
を繰り返す、というパターンを忠実に守っているよう...
III) I と II を切り替える際には 0.1 sec の wait が入る。
もし、Windows 側の NIC のせいでこの現象が起っている場...
Windows->FreeBSD 方向の通信には、この障害は出ていない...
(別の障害は出ているかも知れませんが :)
さて、問題の解決方法ですが、ようするに上記の動きを Fre...
似てやれば問題は解決します。具体的には TCP/IP の Send ...
をどうにかして「IP Packet 2つ分」まで減らしてやれば、...
るはずなのです。そうすれば Winsock2 がそれを全て取り込...
してくるまで先には進めません。
「IP Packet 2つ分」が何バイトなのかを知るには、基本的...
を使うのが手だと思います。tcpdump は root であれば Fre...
ことができますし、
WinDump <URL:http://windump.polito.it/>
を使えば Windows 側で tcpdump を取ることもできます。こ...
mss の値を獲得します。これが「IP Packet 1つ分」の大き...
ください。これを2倍すれば目的の値になります。
あるいは、ethernet を使っている場合は、mss は大抵、536...
1460byte のどちらかです。ですので、その丁度2倍 1072byt...
2920byte が「IP Packet 2つ分だ」という事ができます。で...
2920 を使ってみて、駄目だったら 1072 を使ってみる、と...
ます。
で、ここから先は FreeBSD の管理戦略にかなり依存します。
1) システム全体を特定の Windows マシンに合わせる、とい...
この場合、 sysctl コマンドを使うと良いでしょう。roo...
$ sysctl -w net.inet.tcp.sendspace=xxxx
(#デフォルトは net.inet.tcp.sendspace: ...
(xxxx は上記の「IP Packet 2つ分」の大きさ) を設定し...
多分これでパフォーマンスは向上するはずです。
ちなみに、
$ sysctl -w net.inet.tcp.delayed_ack=0
を設定すると Windows -> FreeBSD 方向の通信も改善さ...
という話があるそうです。
2) Windows マシン毎に設定を変える場合:
残念ながらマシン毎に FreeBSD の設定を変える場合、1 ...
汎用的戦略はありません。各アプリケーションが、それ...
している相手を認識し、その適切な値をどこかのテーブ...
なくてはいけませんが、そのようなサポートのないソフ...
もし、Samba に関して、というのであれば、smb.conf の...
[global] section の最後に
include = /usr/local/etc/smb.conf.global.%m
のような1行を加えておき、
/usr/local/etc/smb.conf.global.<その問題の Window...
というファイル中で
socket options = SO_SNDBUF=xxxx TCP_NODELAY
(xxxx は上記の「IP Packet 2つ分」の大きさ)
を設定するとよいでしょう。上記の include 文は失敗し...
起動に影響はありません。従って、特に特別な設定をす...
target に対しては
/usr/local/etc/smb.conf.global.<その問題の Window...
というファイルを作成する必要はありません。このあた...
<URL:http://www.dd.iij4u.or.jp/~okuyamak/Document...
を参考にして下さい。
この方法は Winsock2 についてしかチェックできていま...
Winsock1.1 の場合、あるいは将来できるであろう、Wins...
Winsock3) でうまく行くのかどうかは判りません。
もし、現在すでにある程度パフォーマンスが良い場合、S...
mss の整数倍にすることで、効率が向上する可能性があ...
パフォーマンスを重視するマシンに対しては、そのマシ...
/usr/local/etc/smb.conf.global.<その問題の Window...
ファイルを作った方がいいかも知れません。
smb.conf には %a(Architecture) というオプションがあ...
ブートマシンがある場合は smb.conf を
include = /usr/local/etc/smb.conf.global.%m
include = /usr/local/etc/smb.conf.global.%a.%M
のように変更して、%a と %M で Client OS と Machine ...
やると各 OS ごとの設定も可能になります。
終了行:
http://www.jp.freebsd.org/QandA/HTML/1926.html
Q. LAN 経由での Windows から FreeBSD へのデータ転送が、...
圧倒的に遅いです。Windows 同士だとこのような現象は起り...
A. 最大の理由は「Winsock2 は 2 packet 送信すると ack を...
Windows の TCP/IP 層はデフォルトでは 2 packet 送信する...
てしまいます。unix は TCP Window size にゆとりがある場...
向うはまだ送ってくるだろうから」と安心して piggy bag ...
がないか調べるために、10msec ほど沈黙します。当然一方...
とか) の場合 piggy bag などできるパケットが存在しませ...
10msec の間、全くデータが転送されることがなくなります。
Windows 同士の場合、受け側も「2packet 受け取ったら速攻...
ねばならぬ」と思い込んでいるので、この「待ち」がほとん...
FreeBSD でこの問題を解決するには、sysctl で
# sysctl -w net.inet.tcp.delayed_ack=0
(デフォルトでは、net.inet.tcp.delayed_ack: 1)
とすることです。こうすれば piggy bag できるかどうか悩...
FreeBSD は ack を即座に返すようになります。
ただし、この設定は「特定のコネクション相手」単位では設...
全体に有効になってしまいます。で、他の unix マシンと通...
これは ack を投げすぎることになるので、逆にパフォーマ...
性が高いです。
なお、この現象は [管理番号 1582] に似ていますが、異な...
しかし、Winsock2 に起因するところは同じです。ただし、W...
(と多分 Windows Me) の Winsock2 では発生しないようです。
http://www.jp.freebsd.org/QandA/HTML/1582.html
Q. LAN 経由での FreeBSD から Windows へのデータ転送が、...
Windows 同士だとこのような現象は起りません。
A. 一般的な解は、一般的な要因に依存するため、何とも判り...
のような場合が Winsock2 の場合にあり得ることは判ってい...
一部の NIC では、NIC のせいなのか NIC Driver のせいな...
すが、Windows で使った場合に、時々 packet の取りこぼし...
これは、NIC が用意している Recieve Buffer の大きさが、...
Recieve Buffer よりも小さい場合、Winsock2 が NIC から ...
吸い出す前に NIC の Recieve Buffer が溢れてしまうため...
ないか、と推測されます。
Winsock2 の挙動を tcpdump などで見ると判るのですが、Wi...
通信において、Winsock は送信において次のようなルールに...
うに見えます(これは、そう「見える」と言っているだけで...
「なっている」という意味で言っているのではありません。...
実装がどうなっているのかは、そのソースコードを見ること...
上、全く不明です)。
I) 2つのマシン A,B があって、A->B というデータ転送し...
A というマシンは
Send, Send, Ack 待ち
というパターンを忠実に守っているように見える。
II) 2つのマシン A,B があって、双方向に転送すべきデー...
A というマシンは
Send(これには直前の Send に対する Ack を含んでい...
Data 待ち(これには直前の Send に対する Ack が含ま...
を繰り返す、というパターンを忠実に守っているよう...
III) I と II を切り替える際には 0.1 sec の wait が入る。
もし、Windows 側の NIC のせいでこの現象が起っている場...
Windows->FreeBSD 方向の通信には、この障害は出ていない...
(別の障害は出ているかも知れませんが :)
さて、問題の解決方法ですが、ようするに上記の動きを Fre...
似てやれば問題は解決します。具体的には TCP/IP の Send ...
をどうにかして「IP Packet 2つ分」まで減らしてやれば、...
るはずなのです。そうすれば Winsock2 がそれを全て取り込...
してくるまで先には進めません。
「IP Packet 2つ分」が何バイトなのかを知るには、基本的...
を使うのが手だと思います。tcpdump は root であれば Fre...
ことができますし、
WinDump <URL:http://windump.polito.it/>
を使えば Windows 側で tcpdump を取ることもできます。こ...
mss の値を獲得します。これが「IP Packet 1つ分」の大き...
ください。これを2倍すれば目的の値になります。
あるいは、ethernet を使っている場合は、mss は大抵、536...
1460byte のどちらかです。ですので、その丁度2倍 1072byt...
2920byte が「IP Packet 2つ分だ」という事ができます。で...
2920 を使ってみて、駄目だったら 1072 を使ってみる、と...
ます。
で、ここから先は FreeBSD の管理戦略にかなり依存します。
1) システム全体を特定の Windows マシンに合わせる、とい...
この場合、 sysctl コマンドを使うと良いでしょう。roo...
$ sysctl -w net.inet.tcp.sendspace=xxxx
(#デフォルトは net.inet.tcp.sendspace: ...
(xxxx は上記の「IP Packet 2つ分」の大きさ) を設定し...
多分これでパフォーマンスは向上するはずです。
ちなみに、
$ sysctl -w net.inet.tcp.delayed_ack=0
を設定すると Windows -> FreeBSD 方向の通信も改善さ...
という話があるそうです。
2) Windows マシン毎に設定を変える場合:
残念ながらマシン毎に FreeBSD の設定を変える場合、1 ...
汎用的戦略はありません。各アプリケーションが、それ...
している相手を認識し、その適切な値をどこかのテーブ...
なくてはいけませんが、そのようなサポートのないソフ...
もし、Samba に関して、というのであれば、smb.conf の...
[global] section の最後に
include = /usr/local/etc/smb.conf.global.%m
のような1行を加えておき、
/usr/local/etc/smb.conf.global.<その問題の Window...
というファイル中で
socket options = SO_SNDBUF=xxxx TCP_NODELAY
(xxxx は上記の「IP Packet 2つ分」の大きさ)
を設定するとよいでしょう。上記の include 文は失敗し...
起動に影響はありません。従って、特に特別な設定をす...
target に対しては
/usr/local/etc/smb.conf.global.<その問題の Window...
というファイルを作成する必要はありません。このあた...
<URL:http://www.dd.iij4u.or.jp/~okuyamak/Document...
を参考にして下さい。
この方法は Winsock2 についてしかチェックできていま...
Winsock1.1 の場合、あるいは将来できるであろう、Wins...
Winsock3) でうまく行くのかどうかは判りません。
もし、現在すでにある程度パフォーマンスが良い場合、S...
mss の整数倍にすることで、効率が向上する可能性があ...
パフォーマンスを重視するマシンに対しては、そのマシ...
/usr/local/etc/smb.conf.global.<その問題の Window...
ファイルを作った方がいいかも知れません。
smb.conf には %a(Architecture) というオプションがあ...
ブートマシンがある場合は smb.conf を
include = /usr/local/etc/smb.conf.global.%m
include = /usr/local/etc/smb.conf.global.%a.%M
のように変更して、%a と %M で Client OS と Machine ...
やると各 OS ごとの設定も可能になります。
ページ名: