每当我运行时du -sh
,rsync
我的磁盘利用率就会达到 100%。这会导致出现 mysql 慢查询,这通常会导致我的网站瘫痪。
有没有什么技巧或窍门可以以某种方式运行这些命令,以便磁盘访问的优先级保持在 Mysql 和其他核心服务上?
答案1
是的,有ionice
:
ionice -c 3 <pid>
其中<pid>
是要减慢的进程的进程 ID。这会将此程序的 I/O 类设置为idle
,这意味着当没有其他程序要求时,它将获得 IO 时间。
答案2
您可以使用ionice -c3
作为命令的前缀,这样这些命令将在idle
I/O 类中运行,这意味着它们只有在没有其他进程需要时才会获得 I/O 时间。不过,这要求您的系统使用 CFQ I/O 调度程序。如今,它是大多数 Linux 发行版中的默认 I/O 调度程序。
但是,这种行为通常是其他问题的征兆。您的磁盘快满了吗?这会导致有大量写入操作的系统速度变慢,因为所有内容都容易变得碎片化。或者您周围有数千万个小文件?
答案3
您的内核是否已启用 PREEMPT?有多种内核 PREEMPT 设置可以启用,以避免死机,例如在磁盘负载过重时(可能以牺牲服务器应用程序的性能为代价)。默认情况下启用多少取决于您的发行版。
在 Debian 反向移植中,现在有例如 linux-image-rt-amd64,它包含 PREEMPT_RT 实时补丁集。这个补丁集可能会提供更多帮助,但它可能有自己的问题……
运行如下命令来查看设置了什么:
# grep PREEMPT /boot/config-2.6.32-5-amd64 <-- in case of a Debian stable amd64 kernel
结果:
# CONFIG_TREE_PREEMPT_RCU is not set
CONFIG_PREEMPT_NOTIFIERS=y
# CONFIG_PREEMPT_NONE is not set
CONFIG_PREEMPT_VOLUNTARY=y
# CONFIG_PREEMPT is not set
您可能希望将其设置为更激进的设置。查看内核源附带的内核文档,看看哪种方法适合您。并检查您的发行版提供的哪些内核可能具有更激进的 PREEMPT 设置。这些可能适用于桌面使用和/或实时使用。但这并不意味着它不能在服务器上工作。只要它们是标准发行版的一部分,它们应该会得到通常的安全修复。
答案4
此外ionice(1)rsync 可能会将 mysql 所需的块从磁盘缓存中推出。您可以使用以下方法修补 rsyncfadvise 支持以避免将 rsync 读取的内容放入缓存中。