io等待或者iowait,wait,wa,%iowait,或者wait%通常可以通过linux系统监控工具查看。例如命令行工具top、sar、atop等。
就其本身而言,它是众多性能统计数据之一,可让我们深入了解linux系统性能。当cpu负载峰值为60到80时。i/o等待会导致页面加载缓慢、超时和间歇性中断。
io等待是cpu或多个cpu空闲的时间百分比,在此期间系统有等待的磁盘i/o请求,i/o等待适用于unix/linux系统,包括macos、freebsd、solaris。
iostat 命令查找高io等待的磁盘linux有很多可用的工具可以用来发现与排错,有些工具很容易使用,有些用法则比较高级。
查看i/o 等待问题不仅需要使用一些高级工具,也需要一些基本工具的高级用法。i/o等待之所以难以排查是因为默认有太多的工具告诉你系统i/o阻塞。
但没那么多工具可以帮你缩小范围以确定是哪个或哪些进程引起的问题。
在排查io等待问题上,首先确定是不是因为i/o引起系统缓慢。你可以使用很多工具但最简单的linux命令还是top。
使用top命令即可看到类似这样的信息cpu(s): 0.0%us, 0.5%sy, 0.0%ni, 99.5%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st。
us用户空间占用cpu百分比。sy内核空间占用cpu百分比。ni用户进程空间内改变过优先级的进程占用cpu百分比。
id空闲cpu百分比。wa等待输入输出的cpu时间百分比。hi硬件中断。si软件中断。st实时。
toptop - 14:31:20 up 35 min, 4 users, load average: 2.25, 1.74, 1.68 tasks: 71 total, 1 running, 70 sleeping, 0 stopped, 0 zombie cpu(s): 2.3%us, 1.7%sy, 0.0%ni, 0.0%id, 96.0%wa, 0.0%hi, 0.0%si, 0.0%st mem: 245440k total, 241004k used, 4436k free, 496k buffers swap: 409596k total, 5436k used, 404160k free, 182812k cached从cpu(s) 这行你可以看出当前cpu io等待的情况,越高的wa表示越多的cpu资源在等待i/o。
上面的top命令从系统面大体展示i/o等待,但它没有告诉你哪个硬盘正在被影响,为此我们还需要使用iostat命令。
iostat -x 2 5avg-cpu: %user %nice %system %iowait %steal %idle 3.66 0.00 47.64 48.69 0.00 0.00 device: rrqm/s wrqm/s r/s w/s rkb/s wkb/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 44.50 39.27 117.28 29.32 11220.94 13126.70 332.17 65.77 462.79 9.80 2274.71 7.60 111.41 dm-0 0.00 0.00 83.25 9.95 10515.18 4295.29 317.84 57.01 648.54 16.73 5935.79 11.48 107.02 dm-1 0.00 0.00 57.07 40.84 228.27 163.35 8.00 93.84 979.61 13.94 2329.08 10.93 107.02iostat -x 2 5命令将每2秒打印报告,共打印5次。iostata命令的-x选项打印更详细的报告信息。
iostat命令打印的第1个报告,数值是基于最后一次系统启动的时间统计的。基于这个原因,在大部份情况下,iostat命令打印出的第1个报告应该被忽略。
每个子报告都是基于上1次的报告。在这个例子中,iostat -x 2 5命令将打印5次报告。
第2份报告就是从第1份报告开始后的硬盘数据,第3份报告基于第2份,依此类推。
上述示例,sda盘的%utili达到了111.41%。这表示引起i/o慢的进程在写入sda磁盘盘。
因为我这个测试实例中只有1个硬盘,但对于有多硬盘的服务器来说,这可以缩小在使用i/o的进程范围。
iostat命令除了提供%utili信息外,像rrqm/s、wrqm/s这些每秒读、写的请求数,r/s、w/s每秒读写数也很有用。
iotop 命令查找高io等待的进程查看哪个进程使用硬盘最多,最简单的方法就是使用iotop命令。iotop命令定期采样磁盘的读写数据。
显示每个进程磁盘读disk read和 disk write写速度以及进程的io优先级prio等信息。
通过查看磁盘的读disk read与写disk write,我们很容易就可以确定是bonnie++进程在频繁的使用磁盘io。
iotoptotal disk read: 8.00 m/s | total disk write: 20.36 m/s tid prio user disk read disk write swapin io> command 15758 be/4 root 7.99 m/s 8.01 m/s 0.00 % 61.97 % bonnie++ -n 0 -u 0 -r 239 -s 478 -f -b -d /tmpps 命令查找高io等待的进程虽然iotop好用,但主流的linux发行版中是没有安装的。系统管理员总是会碰到这样的情况,他们没办法在短时间内简单地安装这些非默认命令。
如果iotop没办法用,可以使用ps命令来代替iotop命令。以下的步聚还是可以帮助你缩小进程的范围。
ps命令可以打印出内存,cpu的情况。但没办法打印磁盘i/o的情况。虽然ps命令没办法打印出i/o的情况,但它可以打印进程是否在等待i/o。
ps命令的stat状态列提供进程当前的状态。d表示不间断睡眠。r正在运行。s可中断的睡眠,正在等待事件的完成。t已经终止进程。
x表示进程已经死亡,你可能永远不会看到此状态。z表示已失效,通常称为僵尸进程,已终止但未由其父进程回收。
等待i/o的进程通常处于d状态,通过ps命令打印的信息我们就可以找到在等待io的进程。
for x in `seq 1 1 10`; do ps -eo state,pid,cmd | grep ^d; echo ----; sleep 5; doned 248 [jbd2/dm-0-8] d 16528 bonnie++ -n 0 -u 0 -r 239 -s 478 -f -b -d /tmp命令会每5秒循环打印处于d状态的进程,共打印10次。但仅凭进程处于d状态,还不能完全确定就是该进程引起的i/o等待。
为了确定可疑的进程,我们还需要使用/proc文件系统。在这个虚拟文件系统里,每个进程都有一个io文件,里面的数值跟iotop命令获取的i/o数值是一样的。
假设,我们怀疑引起高io等待的进程bonnie++,它的进程pid是16528。我们可以运行命令cat /proc/16528/io查看进程磁盘io数据。
cat /proc/16528/iorchar: 562397689wchar: 1073318747syscr: 137395syscw: 190792read_bytes: 482344960write_bytes: 524697984cancelled_write_bytes: 16801792read_bytes和write_bytes就这个进程读写硬盘的字节数。在这里,bonnie++已经读取了46mb,写入524mb的数据。
lsof 命令查看频繁读写的文件lsof命令会为你展示指定进程打开的所有文件,为了减少打印的信息,可以仅使用-p选项打印指定进程打开的文件。
lsof -p 16528减少i/o等待优化应用程序的代码和数据库查询。这可以大大降低磁盘读/写的频率。这应该是您的第一种方法。
确保您有足够的可用内存,以便大约一半的服务器内存用于内存缓冲区和缓存,而不是使用交换空间和分页到磁盘。
调整您的系统、存储设备和 linux 内核以提高存储性能和使用寿命。最后,如果一切都失败了。将存储设备升级到更快的ssd、nvme或其他高吞吐量存储设备。
碳化硅成本何时下降?超充与换电方案孰优孰劣?
电化学工作站—差分脉冲伏安法的详解
中国半导体业发展已到必须猛醒的时刻
自动驾驶和无人驾驶到底是不是一个概念?
物联网行业动态:纵行科技与工业巨头SCG成立合资公司,共拓东盟市场
如何在Linux使用iostat命令
Redmi 9系列新机曝光将搭载联发科Helio G70芯片
华为P10 Plus和iPhone 7 Plus对比评测:长期体验下谁更优质?
中国移动在5G领域的最新进展和布局
Litho发布AR视频创作应用,通过Litho指环来控制仅支持iOS系统
车规级功率电感厂家揭秘大电流功率电感啸叫的解决方法
高能效、小外形的240W USB PD3.1 EPR适配器的参考设计
150W电子变压器,150w power converter
中国联通王启明表示未来5G收费模式一定与现在的4G收费模式不同
这100条电气工程师必须了解的电气运行知识你知道吗
Arm芯片出货量胜过所有其他CPU架构的总和
华为mate9,金立M2017以下大气上档次的商务机,你喜欢哪一款?
【大大速递】与技术专家在线交流,12月热门研讨会正在报名中
多镜头多传感器图像视频处理器应用
骁龙835跑分不敌麒麟960 小米6恐难敌荣耀V9!