【问题标题】:Why linux disables disk write buffer when system ram is greater than 8GB?为什么当系统内存大于 8GB 时 linux 禁用磁盘写入缓冲区?
【发布时间】:2015-08-11 17:17:15
【问题描述】:

背景:

我试图在我的台式计算机上设置ubuntu 机器。整个过程花了一整天,包括安装操作系统和软件。不过我也没多想。

然后我尝试用新机器做我的工作,它比我的笔记本电脑慢很多,这很奇怪。

我做了iotop,发现解压包时磁盘流量在1-2MB/s左右,肯定不正常。

然后,经过数小时的研究,我发现this article 描述了完全相同的问题,并提供了一个丑陋的解决方案:

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

...

编辑:要解决这个问题,要么删除足够的 RAM,要么添加“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

所以,它基本上表明 当系统内存大于 8GB 时(在我的情况下为 32GB),无论vm.dirty_background_ratiovm.dirty_ratio 设置如何,(在我的情况下为 5% 和 10% ),实际脏阈值变为 0 并且写入缓冲区被禁用?

为什么会这样?

这是内核中的错误还是其他地方的错误?

除了拔掉 RAM 或使用“mem=8g”之外,还有其他解决方案吗?

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

【问题讨论】:

  • 当我运行上面的 cat/egrep 时,我看不到零。这是在 AMD FX8150 上运行 Ubuntu 14.04 和 16GB 内存

标签: linux linux-kernel disk


【解决方案1】:

如果您使用具有超过 2G RAM 的 32 位内核,则您运行在一个次优配置中,必须做出重大权衡。这是因为在这些配置中,内核不能再一次映射所有物理内存。

随着物理内存量的增加超过这一点,权衡变得越来越糟糕,因为用于管理所有物理内存的struct page数组必须始终保持映射,并且该数组随着物理内存的增长而增长.

内核不直接映射的物理内存称为“highmem”,默认情况下,写回代码将 highmem 视为不可脏。这就是导致脏阈值为零的原因。

您可以通过将 /proc/sys/vm/highmem_is_dirtyable 设置为 1 来更改此设置,但是如果您安装 64 位内核,那么您的内存会更好。

【讨论】:

  • 对于highmem_is_dirtyable==0,这些比率仍应基于“lowmem”计算并给出非零结果,不是吗?
  • @user3528438:我认为当你有超过 8GB 的​​内存时,你所有的空闲或可回收内存最终都在 highmem 中(部分原因是线性内核的页表使用了额外的 lowmem映射)。
【解决方案2】:

这是内核中的错误吗

根据您引用的文章,这是一个错误,在早期的内核中不存在,但在较新的内核中已修复。

请注意,此问题似乎已在以后的版本 (3.5.0+) 中得到修复,并且是一种回归(例如 2.6.32 不会发生)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 2019-10-26
    • 2014-03-11
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 2014-10-21
    相关资源
    最近更新 更多