我遇到了Linux服务器的一个问题,那就是磁盘写入很多,因此IO响应时间很长,所以响应时间很慢。 我已经检查了磁盘的智能值,并确定。 这是在RAID1 softwareRaid,ext4文件系统中的两个磁盘设置。
由于目前我无法升级硬件,也无法摆脱激烈的I / O应用,因此我打算configurationLinux vm设置,以便轻松实现I / O等待时间。
我想在调整交换,但主要是dirty_background_ratio和dirty_ratio。
题:
我如何根据当前的系统负载和内存使用情况来估计这个值的调整?
你想要的东西很less 首先你想减lessswappiness
sysctl -w vm.swappiness = 10
这将节省一些磁盘IO; 因为最后一件事情是当内核尝试从mem中分出一些内容时,需要额外写入磁盘。 目标是调整事情,以便尽可能less的交换。 但是,不要将swappiness设置为0或禁用。 如果你观察dstat输出一段时间,你会注意到有多less数据实际上是从swap中读取和读取的。
现在有更新的内核(3.2+)称为写callback节机制 。 为了能够像你说的那样使用它,你需要调整脏比率。 检查更多细节这个链接 。 从那里引用你的兴趣是
Once dirty_ratio (resp. dirty_bytes) limit is hit then the process which writes gets throttled.
所以默认情况下,脏东西是相当高的,特别是如果你有很多的内存和较慢的磁盘子系统。 所以你需要调整它们; 尽可能低,不会影响正常使用*,但是在磁盘IO瓶颈情况开始发生时,在内核产生进程将其写入磁盘之前,数值将决定内存中的数据量。 在这一点上,你希望这个进程被限制,哪个内核通过注入睡眠。
*弄清什么是正常使用; 我build议安装在上面,观察那里正在发生的事情; 你想检查那里的dirty数字,并看到磁盘读/写跟踪的D概述。 有专栏WCANCL; 这些实际上是在内存中处理的写操作,从来不需要写入磁盘(脏页),而是用于临时数据。 Mysql有这些时,它做复杂的查询,编译时,使一堆小obj文件,这将不需要长期等…
除此之外,它可能有助于切换到截止date的磁盘调度程序,并调整读取与写入的亲和性,以更好地适应您的环境。 例如,如果您执行的读取次数多于您可能要设置的写入次数的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
如果写入数据繁重,则系统不能使用写入caching层。 两个磁盘和软件RAID使这很困难。 通常这是硬件RAID的一个特性。 你现在拥有的不是适合你工作负载的硬件configuration。
为了提供更好的答案,我们需要具体说明你的应用程序正在做什么,操作系统,你的文件系统是否启用了写障碍等等。
编辑:如果你的基础不好,你只能调整。 也许你应该考虑固态硬盘,而不是为此目的旋转磁盘。
我最近在博客中写了关于dirty_background_ratio和dirty_ratio等内容:
简短的版本是不使用* _ratiovariables,而是使用* _bytes版本,并通过带宽(或数据生成速率)估计字节数,并乘以最大的延迟,你愿意有大写之前开始打盘。
通过设置dirty_background_bytes值相对较低(在全数据接收/生成速率下小于1秒的延迟),您将确保缓冲区不会build立,而没有人做任何事情。 将dirty_bytes设置为2或3的倍数(至less可能高达10倍或更多,具体取决于RAM的数量)将确保突发进程不会受到限制。 您可以通过考虑数据生成速率和磁盘写入速度之间的差异来估计dirty_bytes值。 这是一个缓冲区填充率,然后可以在填充被限制之前乘以最大缓冲时间。 因此,例如,如果以Rg速率生成数据并以速率Rd写入磁盘,并且Rg大于Rd,则可以将dirty_background_bytes设置为Rg *(0.5秒),以便在开始closures数据后约0.5秒钟开始写入磁盘进入缓冲区,然后将dirty_bytes设置为max(2 * Rg * 0.5,(Rg-Rd)*(2秒))。 在缓冲区变得足够大以至于受到限制之前,突发进程将能够写入长达2秒的时间。