如何在备份期间限制磁盘 i/o?

ace*_*mtp 14 ubuntu backup performance hard-drive io

我有一个 cron 基本上在晚上做一个简单的“tar zcf”。

服务器有:

  • 8 核 - Intel(R) Xeon(R) CPU E5606 @ 2.13GHz
  • 25GB 内存
  • Ubuntu 12.04.2 LTS
  • 带有两个 2.728TB 硬盘的硬件 RAID 1(LSI Logic / Symbios Logic MegaRAID SAS SMC2108)

正如您在监控屏幕主机上看到的:

http://clip2net.com/s/57YRKP

在 tar 的几乎所有时间里,磁盘 I/O 都超过 90%,并使所有其他应用程序(mysql、apache)变慢很多。

2个问题:

  • 备份过程中出现如此高的磁盘 I/O 是否正常?
  • 有没有办法限制磁盘 I/O 以便其他应用程序可以继续正常工作?

谢谢!

bay*_*irh 13

预计在备份期间会出现高 I/O,因为它们通常是在包含大文件的大文件树上制作的。您可以使用ionice类和级别来确定 Linux 中 I/O 作业的优先级。IIRC,2 级,7 级是最低的非饥饿级别,这将使其对其他 I/O 负载和用户几乎不可见。有关man ionice用法和详细信息,请参阅。


Hau*_*ing 11

除了相当通用的方法之外,ionice还有一个很好的设备映射器目标(ioband),它允许精确控制(DM)块设备的带宽。不幸的是,它不是标准内核的一部分。

此外,您可能可以通过以下方式加速 tar

  1. 将文件名读入磁盘缓存: find /source/path -printf ""
  2. 将 inode 读入磁盘缓存: find /source/path -perm 777 -printf ""
  3. 通过例如使用带有 mbuffer 或 buffer(至少 100 MiB 的 RAM)的管道,使 tar 从磁盘读取和写入更大的块: tar ... | mbuffer -m 256M -P 100 -p 1 ...

  • @scai 这对 SSD 没有帮助;我的建议仅指旋转硬盘。用这些杀死性能的是头部运动。文件名存储在连续块中,inode 存储在连续块中,文件内容存储在连续块中。如果您以 tar 方式执行此操作,那么您将读取一个目录的文件(和子目录)名称,访问一个文件的 inode,然后是文件本身,然后是下一个文件的 inode,然后是下一个文件本身......导致比依次读取所有名称和索引节点更多的头部运动。 (3认同)