
Ubuntu日本語フォーラム

ログインしていません。
こんにちは。
最近、Ubuntu12.04LTS(i386)をメインOSとして使い出したものですが、GE-NetなのにNautilus(gvfs)からの
smb(cifs)転送(ファイルコピー)が期待した速度が出なくて2、3日いろいろ調べた結果を掲載しておきます。
こちらの環境は、
[corei7機(Client)] <-(GE)-> [GE-HUB] <-(GE)-> [HP MicroServer機(Server)]
デュアルブート Ubuntu12.04LTS(adm64)
Windows7(エクスプローラのCIFS) samba-common (<= 2.0.5a-2)
Ubuntu12.04LTS(i386)(Nautilus(gvfs))
で得にパフォーマンスチューニング設定などは行っておらず、デフォルトインストールのまま、必要な設定を
行ったのみの構成としております。
※Diskアクセス速度を稼ぐために双方でmdadmによるRAID0構成を行っているぐらい。
GE(1000Mbps)でのファイルコピー時の期待転送速度はシステムモニタ上で125MB/sに近い
速度(各種オーバヘッド分理論値より下がると思われ)が出れば、有効活用していると
判断できると思われるので、Client側の両OSでファイル転送を確認した結果、
Windows7(エクスプローラのCIFS) -> Ubuntu12.04LTS(adm64)(samba) = 120MB/s 前後
Windows7(エクスプローラのCIFS) <- Ubuntu12.04LTS(adm64)(samba) = 120MB/s 前後
Ubuntu12.04LTS(i386)(Nautilus(gvfs)) -> Ubuntu12.04LTS(adm64)(samba) = 45MB/s 前後
Ubuntu12.04LTS(i386)(Nautilus(gvfs)) <- Ubuntu12.04LTS(adm64)(samba) = 45MB/s 前後
でした。(GE[1Gbps] = 1000Mbit/8bit(1byte) = 125MB/s)
*--------------------------------------------------------------------------*
[Client]
*--------------------------------------------------------------------------*
$ uname -a
Linux xxx-corei7 3.2.0-41-generic-pae #66-Ubuntu SMP Thu Apr 25 03:50:20 UTC 2013 i686 i686 i386 GNU/Linux
$ ifconfig
eth0 Link encap:イーサネット ハードウェアアドレス 80:ee:73:16:e2:6f
inetアドレス:192.168.1.140 ブロードキャスト:192.168.1.255 マスク:255.255.255.0
inet6アドレス: 2001:c90:8247:b95c:82ee:73ff:fe16:e26f/64 範囲:グローバル
inet6アドレス: fe80::82ee:73ff:fe16:e26f/64 範囲:リンク
inet6アドレス: 2001:c90:8247:b95c:b508:3de8:4f4c:1676/64 範囲:グローバル
UP BROADCAST RUNNING MULTICAST MTU:1500 メトリック:1
RXパケット:3832818 エラー:0 損失:0 オーバラン:0 フレーム:0
TXパケット:496151 エラー:0 損失:0 オーバラン:0 キャリア:0
衝突(Collisions):0 TXキュー長:1000
RXバイト:1366824272 (1.3 GB) TXバイト:36480752 (36.4 MB)
割り込み:57 ベースアドレス:0xa000
$ ethtool -k eth0
Offload parameters for eth0:
rx-checksumming: on
tx-checksumming: off
scatter-gather: off
tcp-segmentation-offload: off
udp-fragmentation-offload: off
generic-segmentation-offload: off
generic-receive-offload: on
large-receive-offload: off
rx-vlan-offload: on
tx-vlan-offload: on
ntuple-filters: off
receive-hashing: off
$ sudo sysctl -a | egrep "(r|w)mem"
error: permission denied on key 'vm.compact_memory'
vm.lowmem_reserve_ratio = 256 32 32
net.core.wmem_max = 131071
net.core.rmem_max = 131071
error: permission denied on key 'net.ipv4.route.flush'
net.core.wmem_default = 163840
net.core.rmem_default = 163840
net.ipv4.tcp_wmem = 4096 16384 905792
net.ipv4.tcp_rmem = 4096 87380 905792
net.ipv4.udp_rmem_min = 4096
net.ipv4.udp_wmem_min = 4096
error: permission denied on key 'net.ipv6.route.flush'
※/etc/samba/smb.conf は変更していない。
※/etc/modprobe.d/cifs.conf も追加設定していない。
*--------------------------------------------------------------------------*
*--------------------------------------------------------------------------*
[Server]
*--------------------------------------------------------------------------*
$ uname -a
Linux xxxx-msv 3.2.0-40-generic #64-Ubuntu SMP Mon Mar 25 21:22:10 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
$ ifconfig
eth0 Link encap:イーサネット ハードウェアアドレス a0:b3:cc:e3:fd:a1
inetアドレス:192.168.1.2 ブロードキャスト:192.168.1.255 マスク:255.255.255.0
inet6アドレス: 2001:c90:8247:b95c:75ee:3919:e4ae:2c89/64 範囲:グローバル
inet6アドレス: 2001:c90:8247:b95c:a2b3:ccff:fee3:fda1/64 範囲:グローバル
inet6アドレス: fe80::a2b3:ccff:fee3:fda1/64 範囲:リンク
inet6アドレス: 2001:c90:8247:b95c:70bb:9b51:8898:ccc5/64 範囲:グローバル
inet6アドレス: 2001:c90:8247:b95c:91a8:d7d4:d378:38cd/64 範囲:グローバル
inet6アドレス: 2001:c90:8247:b95c:c83a:aa8a:83c7:3923/64 範囲:グローバル
inet6アドレス: 2001:c90:8247:b95c:c860:42c:4da7:160d/64 範囲:グローバル
inet6アドレス: 2001:c90:8247:b95c:6594:f19e:8204:5f22/64 範囲:グローバル
inet6アドレス: 2001:c90:8247:b95c:3c44:41c6:522a:d759/64 範囲:グローバル
UP BROADCAST RUNNING MULTICAST MTU:1500 メトリック:1
RXパケット:361964898 エラー:0 損失:0 オーバラン:0 フレーム:9
TXパケット:218384750 エラー:0 損失:0 オーバラン:0 キャリア:0
衝突(Collisions):0 TXキュー長:1000
RXバイト:499866591416 (499.8 GB) TXバイト:215168743472 (215.1 GB)
割り込み:18
$ ethtool -k eth0
Offload parameters for eth0:
rx-checksumming: on
tx-checksumming: on
scatter-gather: on
tcp-segmentation-offload: on
udp-fragmentation-offload: off
generic-segmentation-offload: on
generic-receive-offload: on
large-receive-offload: off
rx-vlan-offload: on
tx-vlan-offload: on
ntuple-filters: off
receive-hashing: off
$ sudo sysctl -a | egrep "(r|w)mem"
error: permission denied on key 'vm.compact_memory'
vm.lowmem_reserve_ratio = 256 256 32
error: permission denied on key 'net.ipv4.route.flush'
net.core.wmem_max = 131071
net.core.rmem_max = 131071
net.core.wmem_default = 229376
net.core.rmem_default = 229376
net.ipv4.tcp_wmem = 4096 16384 4194304
net.ipv4.tcp_rmem = 4096 87380 6291456
net.ipv4.udp_rmem_min = 4096
net.ipv4.udp_wmem_min = 4096
error: permission denied on key 'net.ipv6.route.flush'
※/etc/samba/smb.conf は変更していない。
※/etc/modprobe.d/cifs.conf も追加設定していない。
*--------------------------------------------------------------------------*
問題の切り分けとして、「どこがボトルネックなのか」を絞り込む必要がありましたのでSambaサーバを
除外するため、Ubuntu12.04LTS ClientとSambaサーバ間で「iperf」を利用してネットワーク速度のみの
実測を行ったところ、
------------------------------------------------------------
Client connecting to 192.168.1.2, TCP port 5001
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.1.140 port 36915 connected with 192.168.1.2 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 1.09 GBytes 936 Mbits/sec
※システムモニタ上は120MB/s 手前でした。
の結果が得られたため、ネットワーク的には問題がないことを確認。
次に Ubuntu12.04LTS Client で、Nautilus(gvfs) 以外の検証として、 smbclient で
$ smbclient -N //192.168.1.2/zzzz
で接続を行い、get と put の双方で巨大ファイル転送を行ったところ、システムモニタ上では
120MB/s 手前でしたので、Nautilus(のgvfs)固有の問題でありそうなことを確認。
gvfsのsmbは、「/etc/samba/smb.conf」の設定影響を受けるようなので、以下の
3パターンを確認したところ、
(1) socket options = TCP_NODELAY SO_RCVBUF=131072 SO_SNDBUF=131072 => 結果:45MB/s 前後
(2) socket options = TCP_NODELAY SO_RCVBUF=65536 SO_SNDBUF=65536 => 結果:45MB/s 前後
(3) socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192 => 結果:18MB/s 前後
の結果となり、以上の結果から想定では、
「gvfs の ロジック内にバッファ上限を抑止するコードが記載されている?」
ように思われます。
(全然違う話ですが、英語サイトで testparm コマンド以外で smb client環境のパラメータを確認できるコマンドが
あったのですが、見失ってしまいました。。。どなたかご存知であればご教示いただけますと助かります。)
「gvfs slow smbclient fast」などでGoogle先生に聞くと、英語サイトが多くヒットして
似たような論議が行われているように見受けられ(英語はほぼできないので、機械翻訳で見てますが。。。)、
gvfs の根本解決は現時点ではできないのかもしれません。。。
ただ、代替策を考えねばなりませんので、試しにmount.cifsをインストールして
fstabに設定してファイル転送を行ったところ、
$ sudo apt-get install smbfs
$ sudo mkdir /mnt/xxx-msv_zzzz
$ sudo mount -t cifs -o guest,rw,directio //192.168.1.2/zzzz /mnt/xxxx-msv_zzzz
システムモニタ上では120MB/s手前まで出ていました。(ラッキー!)
巨大ファイルを扱う際はマウントシェルを準備しておいて、利用しようと思います。
※ちなみに「/etc/modprobe.d/cifs.conf (CIFSMaxBufSize)」をわざわざ用意
しなくても、120MB/s手前でした。
何かのご参考になれば幸いです。
どうぞよろしくお願いします。
オフライン
追伸。
mount コマンドでのマウントは、クライアントから、
クライアント <- サーバ のコピーは120MB/s手前
クライアント -> サーバ のコピーは12MB/s前後
で上りと下りに差が出てしまう。なぜ?
なので、smbmount コマンドを利用して試した結果、
#sudo mount -t cifs -o guest,rw,directio //192.168.1.2/zzzz /mnt/xxxx-msv_zzzz ↓ sudo smbmount //192.168.1.2/zzzz /mnt/xxxx-msv_share -o guest
上り方向でも下り方向でも120MB/s手前で利用できた。
smbfs パッケージのコマンドでないと、何かしらの制限に引っかかるようですね。
※ちなみにsambaサーバはguest ok としているのだが、mount/smbmountともに
クライアント上でノーマルユーザでノーチラスを2ウインドウ開いてコピーすると、
サーバ側のフォルダ権限で 777 とならず、フォルダ配下のファイルコピーでエラーとなる。
それを回避するためには、rootユーザでサーバ側のマウントフォルダをNautilusで開いて
コピーすると問題なくフォルダごとコピーできる。。。(なんか手探り三昧ですが。)
尚、Nautilus(gvfs)によるマウント/コピーではそれは発生しない。(が遅い。)
オフライン