记一次服务器IO过高处理过程
记一次服务器IO过高处理过程
一、背景
在一次上线升级后,发现两台tomcat服务器的IOwait一直超过100ms,高峰时甚至超过300ms,检查服务器发现CPU负载,内存的使用率都不高。问题可能出现在硬盘读写,而且那块硬盘除了写日志外,没有其他的IO操作。最后发现是应用打印的日志信息太多,导致磁盘IO负载过高。
二、寻求解决过程
通过查找资料发现,Linux是用pdflush进程把数据从缓存页写入硬盘的,那么通过修改pdflush的一些参数应该可以改善IO负载问题。
pdflush的行为受/proc/sys/vm中的参数的控制
pdflush写入硬盘看两个参数:
1 数据在页缓存中是否超出30秒,如果是,标记为脏页缓存,写入磁盘;
2 脏页缓存是否达到工作内存的10%;
pdflush的第一件事是读取
/proc/sys/vm/dirty_expire_centiseconds(default 3000)
声明Linux内核写缓冲区里面的数据多“旧”了之后,pdflush进程就开始考虑写到磁盘中去。单位是 1/100秒。缺省是 30000,也就是 30 秒的数据就算旧了,将会刷新磁盘。对于特别重载的写操作来说,这个值适当缩小也是好的,但也不能缩小太多,因为缩小太多也会导致IO提高太快。
当然,如果你的系统内存比较大,并且写入模式是间歇式的,并且每次写入的数据不大(比如几十M),那么这个值还是大些的好。
第二件事是判断内存是否到了要写入硬盘的限额,由参数决定:
/proc/sys/vm/dirty_ratio (default 20)
控制文件系统的写缓冲区的大小,单位是百分比,表示占系统内存的百分比,表示当写缓冲使用到系统内存多少的时候,开始向磁盘写出数据。增大之会使用更多系统内存用于磁盘写缓冲,也可以极大提高系统的写性能。但是,当你需要持续、恒定的写入场合时,应该降低其数值。
/proc/sys/vm/dirty_background_ratio(default 10)
控制文件系统的pdflush进程,在何时刷新磁盘。单位是百分比,表示系统内存的百分比,保留过期页缓存(脏页缓存)的最大值。是以MmeFree+Cached-Mapped的值为基准的,当超过最大值则缓存页写入磁盘。pdflush用于将内存中的内容和文件系统进行同步,比如说,当一个文件在内存中进行修改,pdflush负责将它写回硬盘。每当内存中的垃圾页(dirty page)超过10%的时候,pdflush就会将这些页面备份回硬盘。增大之会使用更多系统内存用于磁盘写缓冲,也可以极大提高系统的写性能。但是,当你需要持续、恒定的写入场合时,应该降低其数值:
/proc/sys/vm/dirty_writeback_centisecs(default 500)
控制内核的脏数据刷新进程pdflush的运行间隔。单位是 1/100 秒。缺省数值是500,也就是 5 秒。如果你的系统是持续地写入动作,那么实际上还是降低这个数值比较好,这样可以把尖峰的写操作削平成多次写操作。
对于有高度写入操作的系统
dirty_background_ratio: 主要调整参数。如果需要把缓存持续的而不是一下子大量的写入硬盘,降低这个值。
dirty_ratio: 第二调整参数。
如果有大量的写操作,为避免I/O的长时间等待,可以设置:
$ echo 5 >/proc/sys/vm/dirty_background_ratio $ echo 10 > /proc/sys/vm/dirty_ratio
另外文件系统数据缓冲需要频繁的内存分配。加大保留内存的值能提升系统速度和稳定。小于8G的内存,保留内存为64M,大于8G的设置为256M
$ echo 65536 >/proc/sys/vm/min_free_kbytes
三、最终解决方案
修改后效果明显的参数:/proc/sys/vm/dirty_expire_centiseconds (default 3000)
默认是30秒,时间有点长,我把它改成10秒
echo 1000 >/proc/sys/vm/dirty_expire_centisecs
修改完后,IOwait时间立马下降,平均40ms~50ms,是原来的1/3~1/4
困扰已久的IO问题得以解决!
以下是我的修改参数完整列表:
echo 5 > /proc/sys/vm/dirty_ratio echo 2 >/proc/sys/vm/dirty_background_ratio echo 100 >/proc/sys/vm/dirty_writeback_centisecs echo 262144 >/proc/sys/vm/min_free_kbytes echo 1000 >/proc/sys/vm/dirty_expire_centisecs

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
vsphere数据中心网络规划实践
使用vsphere也有几年时间了,基本保持每年一次大版本升级,从5.0版升级到5.5、6.0,最近开始部署6.5,最头疼的问题就是网络规划,这也是vsphere部署的重点。 从传统数据中心转型时,只有4台HP机架式服务器,压根没考虑过网络规划的事,跟原来的服务器混用一个vlan,一个C类地址。这也就造成了以后的各种麻烦,随着服务器的增加,IP不够用,安全性没有保障。 虽然数据中心可以正常运转,但是不合理,趁着规模小,又赶上升级6.5,正好重新规划一下网络。 根据最佳实践做法,Management、vMotion、vSphereFT、iSCSI等的网络相互隔离,从而提高安全性和性能。同时每个网络建议配置2块物理网卡用作冗余和负载均衡,根据最佳实践可能至少需要6块网卡,多则十几块网卡,这对标配4块网卡的机架式服务器是不现实的。 我的标准配置是4块网卡,vMotion、Management和vSphereFT网络共用2块网卡,生产网络用2块网卡。vSwitch使用access端口,vSphere Distributed Switch使用trunk模式。 vlan20 172.20.2...
- 下一篇
如何实时查看mysql当前连接数?
如何实时查看mysql当前连接数? 1、查看当前所有连接的详细资料: ./mysqladmin-uadmin-p-h10.140.1.1processlist2、只查看当前连接数(Threads就是连接数.): ./mysqladmin-uadmin-p-h10.140.1.1status 、查看当前所有连接的详细资料: mysqladmin-uroot-prootprocesslist D:\MySQL\bin>mysqladmin-uroot-prootprocesslist+-----+------+----------------+---------+---------+------+-------+------------------+ |Id|User|Host|db|Command|Time|State|Info| +-----+------+----------------+---------+---------+------+-------+------------------+ |591|root|localhost:3544|bbs|Sleep|25||| ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS8编译安装MySQL8.0.19
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS8安装Docker,最新的服务器搭配容器使用
- Linux系统CentOS6、CentOS7手动修改IP地址
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库