我有一个 cron,基本上在晚上执行一个简单的“tar zcf”。
服务器有:
- 8 核 - Intel(R) Xeon(R) CPU E5606 @ 2.13GHz
- 25GB 内存
- Ubuntu 12.04.2 LTS
- 硬件 RAID 1(LSI Logic / Symbios Logic MegaRAID SAS SMC2108),带两个 2.728TB 硬盘
正如你在监控屏幕上看到的:
在 tar 的几乎所有时间内,磁盘 I/O 都会达到 90% 以上,并导致所有其他应用程序(mysql、apache)的速度大大减慢。
2个问题:
- 备份期间磁盘 I/O 如此高是正常的吗?
- 有没有办法限制磁盘 I/O 以便其他应用程序可以继续正常工作?
谢谢你!
答案1
除了相当通用的方法之外,ionice
还有一个很好的设备映射器目标(ioband),它允许精确控制到(DM)块设备的带宽。不幸的是,它不是标准内核的一部分。
此外,你也许可以通过以下方式加速 tar
- 将文件名读入磁盘缓存:
find /source/path -printf ""
- 将 inode 读入磁盘缓存:
find /source/path -perm 777 -printf ""
- 通过使用带有 mbuffer 或 buffer 的管道(至少有 100 MiB 的 RAM),使 tar 从磁盘读取和写入更大的块:
tar ... | mbuffer -m 256M -P 100 -p 1 ...
答案2
备份期间预计会出现高 I/O,因为它们通常是在包含大文件的大型文件树上进行的。您可以使用ionice
类和级别对 Linux 中的 I/O 作业进行优先级排序。如果我没记错的话,类 2、级别 7 是最低的非饥饿级别,这将使其对其他 I/O 负载和用户几乎不可见。请参阅man ionice
使用方法和详细信息。
答案3
我建议放弃 tar,改用 rsync(正如 Dogsbody 所提到的)。我使用 BackupPC 备份 Windows 和 Linux 系统上的文件,它支持使用 tar 和 rsync,并自动为您处理硬链接,并提供一个不错的 Web 界面。
答案4
正如其他人所回复的,是的,这是正常的,并且ionice
是一种不让它影响系统的好通用方法。
但我见过很多人tar
在不需要的时候把事情搞砸。如果你复制的数据中有任何一部分自上次复制以来没有改变,那么我建议你试一试rsync
。
通过仅复制自上次复制以来发生变化的文件,这将减少 IO。您将无法将 IO 减少一半以上,因为仍然需要读取所有数据,但您将显著减少写入的数据量(这取决于您的硬件,也可能是一个较慢的操作)。
如果您希望每次运行时都有单独的副本/备份,那么最强大的选项是 –link-dest,它允许您将未更改的文件硬链接到以前的备份。这可以节省备份服务器上的大量空间。例如,我备份了一台机器(Fred),Fred 有 20GB 的硬盘,我备份/复制了整个驱动器,但 /proc 和 /dev 除外。我的备份服务器上现在有 20GB 的目录。第二天,我再次备份 Fred,并使用 –link-dest 链接到昨天的备份。Rsync 将远程文件与本地副本进行比较,如果完全相同,则不会传输它们,但会将新文件硬链接到昨天的文件。任何已更改的文件都会被重新复制(或使用昨天的备份进行部分复制,如果可能)。如果自昨天以来只有 100MB 的文件发生了变化,那么我现在有两个目录,每个目录都有 20GB 的文件,但只占用备份服务器上 20.1Gb 的空间!
我希望这能有所帮助并能回答您的问题。