现在有一台 nfs 服务器,挂载到一台业务服务器,有海量的小文件需要拷贝到 nfs 服务器上,经过测试发现:单个大文件传输速度很快,但是海量的小文件传输就很慢了。添加挂载参数 rsize=8192,wsize=8192,发现效率还是很慢;这个问题如何优化?
![]() | 1 Osk 2021-01-13 12:34:49 +08:00 via Android 小文件估计无解,nfs smb 9p 等似乎都快不起来 |
![]() | 2 matrix67 2021-01-13 12:37:23 +08:00 小文件,tcp 的慢启动,再加上创建文件啥的都需要网路 io 。 tar 打包压缩,传了再解压。 |
![]() | 3 reus 2021-01-13 12:37:47 +08:00 开多线程并发传 |
5 Jirajine 2021-01-13 12:45:04 +08:00 via Android ![]() tar 打包,输出到 stdout,走管道。 另一端 tar 从 stdin 解包,释放到文件系统。 中间可以通过 ssh 、netcat 等方式连接。 |
![]() | 6 d0m2o08 2021-01-13 12:49:40 +08:00 换对象存储 |
![]() | 7 Songxwn 2021-01-13 12:56:02 +08:00 全闪存 |
8 MasterMonkey 2021-01-13 13:00:47 +08:00 via iPhone @Jirajine 赞同 |
9 nightwitch 2021-01-13 13:29:29 +08:00 tar 呗,不能 tar 总得有个原因吧。 |
11 CallMeReznov 2021-01-13 13:48:31 +08:00 对象存储 |
![]() | 12 zent00 2021-01-13 13:49:55 +08:00 via iPhone tar cvf - src_path | tar xvf - -C nfs_path |
![]() | 13 zent00 2021-01-13 14:07:04 +08:00 ![]() 抱歉,刚才路上手机匆忙回复,没有细想,上一条给出的方法还是走 NFS 进行写入操作,没有意义。 如果你走 SSH 的话,这样操作: tar cvf - src_path | ssh user@dst_host "tar xvf - -C dst_path" |
15 dorothyREN 2021-01-13 15:23:24 +08:00 基本上 无解 |
![]() | 16 willis 2021-01-13 15:46:51 +08:00 如果只是一次性传输,用 rsync 传吧,支持断点续传 |
17 zk8802 2021-01-13 16:12:44 +08:00 有两个点可以注意一下: - 存储服务器不要用 ZFS 。NFS on ZFS 存储小文件时很慢。 - 用 nfsstat 和 nfsiostat 看看有没有性能上的问题。有时候瓶颈是网络 IO,有时候瓶颈是存储服务器的性能。 - 试试 pNFS 。 但是归根结底,在 NFS 上存储小文件性能低的根源是 NFS 的设计本身。如果 NFS RPC 可以全部并行的话,存储小文件的性能会提高很多。 |
18 mrsupns OP 不只是传输的问题,我们程序有依赖,需要 find 某目录下的文件并循环文件名,然后做处理。因为是在 nfs 服务器上,所以循环的时候特别慢 |
19 zlowly 2021-01-13 17:27:35 +08:00 如果你的 nfs 可以用 v3 协议的话可以打开 async,不过看你 size 只设到 8k,是不是只能用 v2 协议? 另外对本身存放海量文件的服务器还可以调整一下文件系统参数例如 ext4 里设置 noatime 等。 |
![]() | 21 felixcode 2021-01-13 18:21:12 +08:00 |
![]() | 23 snip 2021-01-15 09:21:12 +08:00 用 rsync 试试呢? |
![]() | 25 xcstream 2021-01-20 05:28:11 +08:00 iscsi 会比 nfs 好一些么 |