我有一台安装了基本 Samba 的 CentOS 5.6 服务器。它有一个连接到 Areca 1880 的 8 驱动器 Raid 5,hdparm 测试返回 ~450MBps,我可以通过 dd 到 /dev/null 来确认接近这个速度。向网络提供文件的是 10gbe Myricom 卡,客户端都是 1gbe broadcom/intel/etc,位于同一交换机上。
我遇到的问题似乎始终相当一致,当文件尚未缓存到服务器内存中时,单流文件复制性能很差。如果我复制 1GB 文件,我指的是 9-12MB 文件,性能会非常高,通常在 1gbe 客户端上为 90% 以上。当我复制 9-12MB 文件(比如 100 个)时,它将获得大约 40-50% 的使用率,一旦它们缓存在服务器上,它在 1gbe 客户端 NIC 上的使用率可能会达到 55-65%,但不会更高。为什么?!?
我可以复制多个缓存的连续文件序列,并在客户端 NIC 上获得可能 85% 以上的使用率,为什么单个文件序列不能达到 95% 以上?所有客户端都设置为将 tx/rx 数据包卸载到适配器,不幸的是它们没有使用巨型帧,但我已在打开巨型帧的情况下进行了测试,仍然看到相同的性能。
答案1
大规模、顺序访问是最好的情况,正如你所说,在这种情况下,你的系统会使管道饱和。
许多小文件与一个大文件相比,会导致元数据和可能的锁定开销。我猜想使用多个流可以获得多个传输数据,并且在多核系统上它们可以并行执行,从而增加带宽。这种行为似乎表明,对于许多小文件,您受到单线程性能的限制。如果您可以使用 SSD 进行测试,您将知道性能问题是来自磁盘 I/O(锁定、修改访问时间、元数据)还是 CPU 限制(您还可以看到 samba 进程top
在传输数据时占用了整个核心,这将是一个很好的指标)。
您还可以使用 SystemTap 来查看内核在“大文件”和“许多小文件”场景中究竟花费了多少时间。