为什么linux在系统内存大于8GB时禁用磁盘写缓冲区?

时间:2015-05-29 00:50:04

标签: linux linux-kernel disk

背景

我正在尝试在台式计算机上设置iotop计算机。整个过程耗费了一整天,包括安装操作系统和软件。不过,我对此并没有太多考虑。

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

我做了cat /proc/vmstat | egrep "dirty|writeback" 并发现解压缩包时的磁盘流量大约是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/

并且做了

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

输出是:

8223

设置4111时,这些值为mem=8gvm.dirty_background_ratio

因此,它基本上显示当系统内存大于8GB 时(在我的情况下为32GB),无论vm.dirty_ratiopublic class ReaderPreferences extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preference); } @Override public void onStart() { super.onStart(); View v = getView(); v.setBackgroundColor(getActivity().getResources.getColor(R.color.my_color)); } 设置如何,(5%和10在我的情况下%,实际脏阈值变为0 并且写缓冲区被禁用?

为什么会这样?

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

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

UPDATE:我正在使用32位的ubuntu 12.04运行3.13.0-53通用内核,所以这可能只发生在32位系统上。

2 个答案:

答案 0 :(得分:7)

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

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

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

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

答案 1 :(得分:0)

  

这是内核中的错误

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

  

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