复制大文件时如何减少资源使用?

复制大文件时如何减少资源使用?

我需要将一个大文件(损坏的 MySQL 表~40GB)移动到单独的服务器上以便修复它。(当我尝试在生产服务器上修复时,它很快就杀死了服务器)。

为了做到这一点,我想将 .frm、.MYI 和 .MYD 文件从生产服务器 rsync 到云服务器。

我正在将文件从 /var/lib/mysql/{database}/ 复制到 /home/{myuser},这样我就不需要为 rsync 命令启用 root 访问权限,并且 100% 确保数据库文件未被使用(它不应该被写入或读取,但显然我不想关闭我的生产数据库来确保这一点)。

我尝试复制的第一个文件大约 10GB。我正在将其从生产服务器的一部分传输到另一部分,即传输到同一磁盘阵列。

不幸的是,复制命令“cp filename newfilename”占用了太多资源,导致服务器陷入停滞。

将文件复制到其他目录时如何才能使用更少的资源?(花多长时间并不重要)。

假设我设法做到这一点,那么将文件 rsync 到云端时我可以预期使用哪些资源?

有人能建议一个更好的方法来做到这一点吗?我的磁盘空间很快就用完了,所以需要尽快修复和归档这个表。

答案1

您是否尝试过nice -n10在命令前加上前缀?

10是默认值。范围从-20(最高优先级)到19(最低优先级)。

答案2

除了 rsync 带宽限制之外,还有两个选择:

  • ionice -c 3 cp foo bar
  • buffer -u 150 -m 16m -s 100m -p 75 -i foo -o bar

ionice将与 I/O 调度程序交互。 buffer是一个循环缓冲区,旨在帮助字符设备提高效率,但-u 150写入之间会暂停 150 微秒,根据手册,这可能足以让磁盘有喘息的空间。

和都可在 Ubuntu 的原始版本中使用。如果你恰好在内核中配置了 CONFIG_TASK_DELAY_ACCT,ionice那么它会很方便,但我的 Ubuntu 机器没有配置,这严重限制了命令的可用性。我已经知道了bufferiotop哪个命令正在淹没我的硬盘,我只想给它一些喘息的空间。

此外,在复制过程中,请查看(通常在 sysstat 包中)的输出iostat -x 1,并查看设备的 %busy 字段在复制过程中是否为 90% 或更低。如果它处于 99-100%,则说明其他进程的 I/O 不足。

答案3

使用带有 --bwlimit=KBPS 开关的 rsync(限制 I/O 带宽;每秒千字节)。尝试使用较小的文件,并尝试找到传输速度和系统使用率之间的最佳组合。使用第二个 shell 进行监控“vmstat 1”

答案4

一个替代方案是:

scp -l ${KBPS} ${src} ${dest}

但如果 ${src} 是一个不断增长的文件,我认为它将不起作用......您能否建议一种复制并等待源关闭的方法......

相关内容