为什么当系统内存大于8GB时,Linux会禁用磁盘写缓冲区?

4

背景:

我尝试在桌面电脑上安装 ubuntu 系统。整个过程花费了一整天,包括安装操作系统和软件。当时我没有太在意。

然后我尝试使用这台新机器工作,但它比我的笔记本电脑慢得多,这非常奇怪。

我使用 iotop 命令发现,在解压缩包时磁盘流量只有1-2MB/s,这绝对是异常的。

经过数小时的研究,我找到了这篇文章,描述了完全相同的问题,并提供了一个不太优美的解决方案:

我们最近在某些系统上遇到了严重的性能问题,其中磁盘写入速度极慢(~1 MB/s - 正常性能应为150+MB/s)。

...

编辑:要解决此问题,请删除足够的内存或将“mem=8G”添加为内核启动参数(例如,在Ubuntu的 /etc/default/grub 中 - 不要忘记运行 update-grub!)

我还看了这篇文章:

https://lonesysadmin.net/2013/12/22/better-linux-disk-caching-performance-vm-dirty_ratio/

并执行了相应的操作。

cat /proc/vmstat | egrep "dirty|writeback"

输出结果为:

nr_dirty 10
nr_writeback 0
nr_writeback_temp 0  
nr_dirty_threshold 0  // and here
nr_dirty_background_threshold 0 // here

当设置mem=8g时,这些值分别是82234111

所以,基本上它显示了这样一种情况:当系统内存大于8 GB(在我的情况下为32 GB),无论vm.dirty_background_ratiovm.dirty_ratio设置为什么(在我的情况下为5%和10%),实际脏阈值将变为0并且禁用写缓冲区

这是为什么呢?

这是内核或其他地方的错误吗?

是否有解决方案,而不是拔掉内存条或使用“mem=8g”?

更新:我正在运行带有Ubuntu 12.04 32位的3.13.0-53-generic内核,因此这可能只发生在32位系统上。


1
当我运行上述的cat/egrep命令时,我没有看到任何零。这是在一台AMD FX8150运行Ubuntu 14.04,拥有16GB内存的计算机上进行的。 - Paul
2个回答

9
如果你在使用超过2G内存的32位内核,则在进行重要权衡的子优配置下运行。这是因为在这些配置中,内核无法一次映射所有物理内存。
随着物理内存量增加到此点以外,权衡变得越来越糟糕,因为用于管理所有物理内存的“struct page”数组必须始终保持映射,并且该数组会随物理内存而增长。
内核未直接映射的物理内存称为“highmem”,默认情况下,回写代码将highmem视为不可清除。这就导致了脏阈值为零。
您可以通过将“/proc/sys/vm/highmem_is_dirtyable”设置为1来更改此项,但如果您安装64位内核,则会更好地使用那么多内存。

highmem_is_dirtyable==0的情况下,这些比率仍然应该基于“lowmem”进行计算,并且应该给出非零的结果,不是吗? - user3528438
我猜想当你拥有超过8GB的内存时,所有可用或可回收的内存最终都会在highmem中(部分原因是由于页面表为线性内核映射使用的额外lowmem)。 - caf

0
这是内核中的一个错误吗?
根据您引用的文章,这是一个错误,在早期的内核版本中不存在,并在更近期的内核版本中得到了修复。
请注意,此问题似乎已在较新的版本(3.5.0+)中得到解决,并且是一种回归(例如,在2.6.32上不会发生)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接