Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么linux在系统ram大于8GB时禁用磁盘写入缓冲区?_Linux_Linux Kernel_Disk - Fatal编程技术网

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

为什么linux在系统ram大于8GB时禁用磁盘写入缓冲区?,linux,linux-kernel,disk,Linux,Linux Kernel,Disk,背景: 我试图在我的桌面电脑上安装一台ubuntu机器。整个过程花了一整天,包括安装操作系统和软件。不过我没怎么想 然后我试着用这台新机器做我的工作,它比我的笔记本电脑慢很多,这很奇怪 我做了iotop,发现解压缩包时的磁盘流量约为1-2MB/s,这肯定是不正常的 然后,经过数小时的研究,我发现它描述了完全相同的问题,并提供了一个丑陋的解决方案: 我们最近在一些系统上遇到了一个主要的性能问题,在这些系统中,磁盘写入速度非常慢(~1 MB/s—正常性能) 大于150 MB/s)。 编辑:要解决这

背景:

我试图在我的桌面电脑上安装一台
ubuntu
机器。整个过程花了一整天,包括安装操作系统和软件。不过我没怎么想

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

我做了
iotop
,发现解压缩包时的磁盘流量约为1-2MB/s,这肯定是不正常的

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

我们最近在一些系统上遇到了一个主要的性能问题,在这些系统中,磁盘写入速度非常慢(~1 MB/s—正常性能) 大于150 MB/s)。

编辑:要解决这个问题,要么删除足够的RAM,要么添加“mem=8G”作为内核启动参数(例如Ubuntu上的/etc/default/grub中-不要 忘记运行更新grub!)

我也看了这个帖子

而且

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
时,这些值分别为
8223
4111

因此,它基本上显示了当系统内存大于8GB时(在我的情况下为32GB),不管
vm.dirty\u background\u ratio
vm.dirty\u ratio
设置如何,(在我的情况下为5%和10%),实际的脏阈值变为0
并且写缓冲区被禁用

为什么会这样

这是内核中的bug还是其他地方的bug

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


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

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

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

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

您可以通过将
/proc/sys/vm/highmem\u is\u dirtyable
设置为1来改变这一点,但是如果您安装一个64位内核,那么有了这么多内存,情况会好得多

这是内核中的错误吗

根据你引用的文章,这是一个bug,在早期的内核中不存在,在最近的内核中已经修复

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


当我运行上面的cat/egrep时,我看不到零。这是在一个运行Ubuntu14.04的AMD FX8150上,16GB内存,highmem_is_dirtyable==0,这些比率仍然应该基于“lowmem”进行计算,并给出一个非零的结果,不是吗?@user3528438:我假设当你有超过8GB的内存时,你所有的空闲或可回收内存最终都在highmem中(部分原因是页面表为线性内核映射使用了额外的lowmem)。