お知らせ

  • 利用規約を守って投稿してください。また、よくある質問および投稿の手引きも参照してください。
  • メッセージの投稿にはアカウントが必要です。未登録の方は、ユーザ登録ページからアカウントを作成することができます。

#1 2013-05-13 18:51:35

powtok
新しいメンバ
登録日: 2010-06-12

Ubuntu12.04LTS(i386) での Nautilus(gvfs) によるファイルコピーが遅い件について(備忘録です。)

こんにちは。

最近、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手前でした。

何かのご参考になれば幸いです。
どうぞよろしくお願いします。

オフライン

 

#2 2013-05-16 23:05:38

powtok
新しいメンバ
登録日: 2010-06-12

Re: Ubuntu12.04LTS(i386) での Nautilus(gvfs) によるファイルコピーが遅い件について(備忘録です。)

追伸。

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)によるマウント/コピーではそれは発生しない。(が遅い。)

オフライン

 

Board footer

Powered by FluxBB