与多核服务器的rsync应该比它走得更快。 我错了吗?

我正在两台服务器之间启动一个rsync简单命令。 两台服务器在绑定时都有两个eth接口。 当我用rsync从一台服务器发送一个大文件到另一台时,我的传输速率达到了130M / s。

但是,这就是问题所在,当我发送一个有很多小文件的目录时,最好的传输速度是1M / s。

我已经检查了两个cpu负载(8cpu i7),他们在10%的最大值。

知道是什么让所有的传输速度变慢是文件的打开/closures,这个“理论上”在CPU上,我知道这可以很容易地调整。 但我不知道如何调整。

任何提示如何使rsync使用所有的CPU?

你的问题没有(几乎)与CPU有关。

传输大文件通常很快,因为可以通过顺序I / O来完成。

传输大量小文件需要大量的存储function,因为它需要随机的I / O。 低寻道时间,快速的硬盘驱动器,大量的caching和一个为数量庞大的文件devise的文件系统是必须的。 CPU没有帮助,至less不是很多,就像你正在观察的那样。 CPU和操作系统正在等待磁盘I / O完成。

所有更快的CPU /更多的核心可以做,他们可以最终等待更快的I / O。 🙂

许多小型随机IO操作的延迟加起来就是:

  • 访问和查找文件系统和硬盘的次数
  • rsync的比较时间

根据我的经验,rsync是一个非常好的工具,可以让事物保持同步,但不是一个非常好的工具,可以尽快提交所有数据。 带宽或存储容量不要离开其他选项时使用它。 如果你能负担所有的文件,并在一个blob中传输,如果有足够的文件,你可以期望提高性能(用于完成操作的整个挂钟时间)。

使用rsync处理大量小文件时,networking/磁盘的开销很大。 对于足够小的文件,加速因子可能小于1。

使用-v注意加速因子。 如果你的加速因子低于1,即使你知道你已经同步了,那么你正在经历相当多的开销。 CPU不是瓶颈。

Janne说:你是IO绑定,而不是CPU绑定。 启动top(或者更好,atop / htop),注意在传输小文件时实际使用的CPU是多less。 还要注意你的进程处于“D”状态,等待数据被提供给他们。

另外,我不相信rsync是针对多核心进行优化的; 它所做的大部分工作是顺序的,而且在这方面需要非常聪明的工作才能使其更快。

但是,如果您使用ssh作为传输方式,它可能会利用多达2个内核。 它将作为一个独立的进程产生,并将在主rsync进程的一个单独的线程中完成所有的encryption和可能的压缩工作。 这个过程有一些CPU密集型的任务:CRC计算和MD5哈希(我相信这就是它使用的)。