我正在运行带有 Linux 软件 raid 10 的服务器。这是一个双 CPU 系统,具有 64GB 内存。每个 CPU 都配有 2x16GB 的 dimm。我想使用 dd 备份 kvm 虚拟机,但遇到了严重的 io 问题。起初我以为是与 raid 有关,但其实是 Linux 内存管理的问题。下面是一个例子:
- 记忆很好: https://i.stack.imgur.com/NbL60.jpg
- 我启动 dd: https://i.stack.imgur.com/kEPN2.jpg
- 您还会看到 nmon 显示磁盘访问: https://i.stack.imgur.com/Njcf5.jpg
- 过了一会儿,“缓冲区”变大,复制进程停止 https://i.stack.imgur.com/HCefI.jpg
- 这是 meminfo: https://i.stack.imgur.com/KR0CE.jpg
- 这里是 dd 输出: https://i.stack.imgur.com/BHjnR.jpg
- 我可以手动临时解决问题并强制删除缓存:“sync; echo 3 > /proc/sys/vm/drop_caches”
- 呼叫需要几秒钟,之后 dd 速度立即恢复正常水平。当然我可以每分钟执行一次 cronjob 或类似操作,但这不是真正的解决方案。 https://i.stack.imgur.com/zIDRz.jpg https://i.stack.imgur.com/fO8NV.jpg
有人有解决方案或配置提示吗? 这也是我的 sysctl,但所有值都是 centos 默认值: https://i.stack.imgur.com/ZQBNG.jpg
編輯1
我进行了另一个测试,并将 dd 操作改为执行到磁盘 /dev/null。这次也是在一个命令中,没有使用 pv。因此,它只有一个进程。dd if=/dev/vg_main_vms/AppServer_System of=AppServer_System bs=4M
- 它从读取开始,但不写入(目标不在同一磁盘上) https://i.stack.imgur.com/jJg5x.jpg
- 过了一会儿,写作开始,阅读速度减慢 https://i.stack.imgur.com/lcgW6.jpg
- 之后就是只写作的时间了: https://i.stack.imgur.com/5FhG4.jpg
- 现在开始主要问题。复制过程速度减慢到 1mbs 以下,并且什么也没发生: https://i.stack.imgur.com/YfCXc.jpg
- dd 进程现在需要 100% 的 CPU 时间(1 个核心) https://i.stack.imgur.com/IZn1N.jpg
- 并且我再次手动解决临时问题并强制删除缓存:
sync; echo 3 > /proc/sys/vm/drop_caches
。之后,同一款游戏再次开始......
編輯2
对于本地 dd,我可以使用参数 iflag=direct 和 oflag=direct 来解决问题。但这不是通用的解决方案,因为还有其他文件访问,例如从虚拟机将文件复制到本地 samba 共享,而我无法使用此类参数。必须对系统文件缓存规则进行调整,因为您无法复制大文件而不会出现此类问题,这很不正常。
答案1
只是猜测。您的问题可能是大量脏页刷新。尝试像这样设置 /etc/sysctl.conf:
# vm.dirty_background_ratio contains 10, which is a percentage of total system memory, the
# number of pages at which the pdflush background writeback daemon will start writing out
# dirty data. However, for fast RAID based disk system this may cause large flushes of dirty
# memory pages. If you increase this value from 10 to 20 (a large value) will result into
# less frequent flushes:
vm.dirty_background_ratio = 1
# The value 40 is a percentage of total system memory, the number of pages at which a process
# which is generating disk writes will itself start writing out dirty data. This is nothing
# but the ratio at which dirty pages created by application disk writes will be flushed out
# to disk. A value of 40 mean that data will be written into system memory until the file
# system cache has a size of 40% of the server's RAM. So if you've 12GB ram, data will be
# written into system memory until the file system cache has a size of 4.8G. You change the
# dirty ratio as follows:
vm.dirty_ratio = 1
然后sysctl -p
重新加载,再次删除缓存(echo 3 > /proc/sys/vm/drop_caches
)。