首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux虚拟内存调优以解决磁盘I/O问题

Linux虚拟内存调优以解决磁盘I/O问题
EN

Server Fault用户
提问于 2014-10-31 16:55:35
回答 3查看 3.9K关注 0票数 2

我在Linux服务器上遇到了问题,它正在写很多东西到磁盘,因此由于IO等待时间很长,所以我的响应时间很慢。我已经检查了磁盘的智能值,并且没有问题。这是RAID1 softwareRaid,ext4文件系统中的两个磁盘设置。

由于我暂时无法升级硬件,也无法摆脱密集的I/O应用程序,所以我计划配置Linux设置,以简化I/O等待时间。

我正在考虑调优交换,但主要是dirty_background_ratio和dirty_ratio。

问题:

如何根据当前系统负载和内存使用情况来估计此值的调优?

EN

回答 3

Server Fault用户

回答已采纳

发布于 2014-10-31 21:20:58

你想要的东西不多。首先,你想要减少交换

sysctl -w vm.swappiness=10

这将节省一些磁盘IO;因为当内核试图从mem中跳出一些内容时,您最不需要的是对磁盘的附加写入。目标是调整事情,这样就不需要什么交换了。但是,不要通过将其设置为0或禁用来关闭交换。我建议采取极端的措施,将swappiness设置为1。如果您观察dstat输出一段时间,您将很快注意到从交换区中实际写入和读取的数据的数量。

现在,在较新的内核(3.2+)中有了名为写回节流的机制。为了能像你说的那样使用它,你需要调整脏比。查看更多细节,此链接。从那里引用你感兴趣的话

代码语言:javascript
复制
Once dirty_ratio (resp. dirty_bytes) limit is hit then the process which 
writes gets throttled.

因此,默认情况下,脏值相当高,特别是当您有大量内存和慢磁盘子系统时。因此,您需要对它们进行调优;尽可能低,以免影响正常使用*然而,当您的磁盘IO瓶颈情况开始发生时,在内核生成进程将其写入磁盘之前,值将决定内存中存在的数据量。此时,您希望通过注入睡眠来控制进程,内核就是这样做的。

*找出什么是正常使用;我建议安装在上面并观察那里发生了什么;您希望检查dirty的数字,并查看跟踪磁盘读/写的D概述。有WCANCL列;这些实际上是在内存中处理的写操作,从来不需要写入磁盘(脏页),而是用于一些临时数据。Mysql有那些当它做复杂的查询,编译器当做一串小的obj文件,不会需要很长时间等等。

除此之外,它可能有助于切换到截止日期磁盘调度程序,并调整读和写的亲和力,以更好地适应您的环境。如果你比写多读10倍,你可能想要设置

/sys/block/<device>/queue/iosched/writes_starved

设置为5,而不是默认值2.设置更高的值

/sys/block/<device>/queue/iosched/write_expire

也会有帮助。此外,如果您减少了从128批量完成的请求数量,比如32,则会增加一些延迟。

/sys/block/<device>/queue/nr_requests

票数 3
EN

Server Fault用户

发布于 2014-10-31 17:01:31

如果您的写入量很大,系统将无法使用写缓存层,这将限制您的工作。两个磁盘和软件RAID使得这很困难。通常,这是硬件RAID的一个特性。您现在拥有的不是适合您的工作负载的硬件配置。

为了提供更好的答案,我们需要详细说明您的应用程序正在做什么、操作系统、是否在您的文件系统上启用了写屏障等等。

编辑:只有当你的基础不好的时候,你才能调整到目前为止。也许您应该考虑SSD,而不是为此目的旋转磁盘。

票数 2
EN

Server Fault用户

发布于 2016-10-11 15:37:28

我最近在我的博客上写了关于dirty_background_ratio和dirty_ratio等的文章:

http://models.street-artists.org/2016/10/09/nfs-syncasync-some-of-the-issue-solved-or-how-to-set-vm-dirty_字节和vm脏_背景_字节/

简短的版本是不使用*_ratio变量,而是使用*_bytes版本,并通过获取带宽(或数据生成速率)并乘以大写入开始到磁盘之前的最大延迟来估计字节数。

通过设置相对较低的dirty_background_bytes值(在完整的数据接收/生成速率下延迟不到一秒),您将确保缓冲区不会在没有人做任何事情的情况下建立起来。将dirty_bytes设置为2或3倍(至少,可能高达10倍或更高,取决于您的内存数量)将确保一个突发的进程不会被节流。您可以通过考虑数据生成速率和磁盘写入速度之间的差异来估计dirty_bytes值。这是一个缓冲区填充率,然后您可以乘以最大缓冲时间,然后填充被节流。因此,例如,如果以Rg速率生成数据并以Rd速率写入磁盘,并且Rg大于Rd,则可以将dirty_background_bytes设置为Rg*(0.5秒),以便磁盘在开始向缓冲区发送数据后大约0.5秒开始写入,然后将dirty_bytes设置为max(2*Rg* 0.5,(Rg)*(2秒))。突发的进程将能够写长达2秒,然后缓冲区变得足够大,他们被节流。

票数 0
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/641192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档