在早期的2.6.X
内核中,被使用,如果所有当前线程都忙一秒钟pdflush
,它将产生更多线程(从pdflush
pdflush
Linux 页面缓存和 pdflush)。
自2.6.32
内核以来,pdflush
已被命名为每个支持设备线程所取代flush-MAJOR
(从Linux 2 6 32 - Linux 内核新手)。
有没有办法flush-MAJOR
为单个支持设备生成多个线程?
我目前正在将大量数据写入磁盘,在发生这种情况时,我看到该[flush-8:32]
进程的 cpu 利用率几乎为 100% top
。我想知道是否有一种方法可以flush-MAJOR
为 I/O 负载较重的特定设备生成更多线程。我不知道它是否会对性能有所帮助,但我想看看它的作用。
我看到有证据表明每个设备应该支持多个冲洗器线程冲洗掉 pdflush:
在审查第一次尝试后,Jens 根据 Andrew Morton 的建议添加了每个设备具有多个冲洗器线程的功能。
但我不知道如何实现这一点,或者它是否自动发生,而我错过了它。
我正在运行带有 2.6.32-358.el6.x86_64 内核的 RHEL 6.4。
答案1
你不能。曾经有一个 bdi_add_flusher_task() 在 2009 年 iirc 左右被删除。而且它最初是用于文件系统的,但我不认为你正在编写文件系统:-)
但是..我不明白为什么你会拥有 100% 的 cpu,这没有意义 - 除非你对一些价值 100,000 美元的数组进行 10+ GB/s 的写入。 RAM 比磁盘快得多,因此您应该具有较高的 iowait,但不应该具有较高的 cpu。
运行 atop 并查看 cpu 实际使用的位置,并将其分解为系统、用户、irq 和 wait %。
还要检查其他数字是否变高或达到警告或严重状态,例如页面扫描等。
如果 iowait % 很高,那么这是预期的,您的磁盘正在尽其所能,无法更快地运行,系统只是在等待它们读取或写入块。
编辑
我差点忘了按照凯文的要求添加这条注释。我又看了一遍,但没有找到任何文档说明为什么我记得 bdi_add_flusher_task() 被删除。
但在扫描 Linux 3.2.0-67 源代码时,该程序不存在,因此它显然一定已被丢弃在某个地方,尽管我很容易弄错:-)
答案2
Jens 最初想添加一个 bdi_add_flusher_task() 函数来支持每个设备的多个刷新器线程,但在邮件列表中与 Christoph Hellwig 讨论后被中止,从以下链接查看详细信息: https://lore.kernel.org/patchwork/patch/169137/ 因此,单个设备的多个刷新器线程从未合并到主线中。