linux io阻塞问题
在linux 上 磁盘读写过高 的 I/O 问题 导致 cpu wait 问题,这里是用一些方法找出问题。
首先 使用 top 命令找出 出现 cpu 中 是否进程运行等待问题
# top
- top - 03:57:39 up 1 day, 15:40, 0 users, load average: 0.00, 0.00, 0.00
- Tasks: 8 total, 1 running, 7 sleeping, 0 stopped, 0 zombie
- %Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 95.1 wa, 0.0 hi, 0.0 si, 0.0 st
- KiB Mem : 1019664 total, 174644 free, 78960 used, 766060 buff/cache
- KiB Swap: 1165316 total, 1154816 free, 10500 used. 272848 avail Mem
在%Cpu(s) 一行中 95.1 wa (例子数据)
表示cpu 中出现严重等待问题,可能导致的原因就包括 读写磁盘 I/O 造成的
查找是否是 (确定 上面假设)I/O阻塞问题
方法有二
方法一
- $ iostat -x 2 5
- avg-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.02
上面的指标 有有三个需要明白
%util 111.41 利用率,说明了磁盘 的 读写io 过高了,出现了延迟状况
await 响应时间 svctm 表示平均每次设备I/O操作的服务时间 await 和 svctm 越接近表示几乎没有I/O等待,上面差距大
r/s 117.28 读出请求数 w/s 29.32 写入请求数 说明读出次数过高
其它参数
- rrqm/s:每秒这个设备相关的读取请求有多少被Merge了(当系统调用需要读取数据的时候,VFS将请求发到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,FS会将这个请求合并Merge);wrqm/s:每秒这个设备相关的写入请求有多少被Merge了。
- rsec/s:每秒读取的扇区数;
- wsec/:每秒写入的扇区数。
- rKB/s:The number of read requests that were issued to the device per second;
- wKB/s:The number of write requests that were issued to the device per second;
- avgrq-sz 平均请求扇区的大小
- avgqu-sz 是平均请求队列的长度。毫无疑问,队列长度越短越好。
- await: 每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。
- 这个时间包括了队列时间和服务时间,也就是说,一般情况下,await大于svctm,它们的差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。
- svctm 表示平均每次设备I/O操作的服务时间(以毫秒为单位)。如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长, 系统上运行的应用程序将变慢。
- %util: 在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度
- 。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。
参考 http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858810.html
方法二
- root@50e261fb9e06:/var# dstat -d
- -dsk/total-
- read writ
- 1081B 977B
- 0 0
- 0 0
- 0 0
- 0 0
使用 dstat ,其实他就是集成了iostat , vmstat,netstat,ifstat 等工具而已
现在确定了 是 I/O 问题了,接着找出哪个进程 操作哪些文件而导致上面的原因的
同样提供两种方法
第一种 根据 linux IO 读写 epoll 机制(省略,研究中...)读写时会合理运用资源,就是某某进程在读资源,就会先sleep 一会,把cpu让给其他进程,那么阻塞的时候就会不间断的sleep 或 ps 里面 的 状态或“D”状态,所以可以用脚本找出如下可疑进程
- # for x in `seq 1 1 10`; do ps -eo state,pid,cmd | grep "^D"; echo "----"; sleep 5; done
- D 248 [jbd2/dm-0-8]
- D 16528 bonnie++ -n 0 -u 0 -r 239 -s 478 -f -b -d /tmp
- ----
- D 22 [kswapd0]
- D 16528 bonnie++ -n 0 -u 0 -r 239 -s 478 -f -b -d /tmp
- ----
- D 22 [kswapd0]
- D 16528 bonnie++ -n 0 -u 0 -r 239 -s 478 -f -b -d /tmp
- ----
- D 22 [kswapd0]
- D 16528 bonnie++ -n 0 -u 0 -r 239 -s 478 -f -b -d /tmp
- ----
- D 16528 bonnie++ -n 0 -u 0 -r 239 -s 478 -f -b -d /tmp
- ----
第二种方法使用 iotop 工具,这个可能需要安装,不是系统自带的
- Total DISK READ : 0.00 B/s | Total DISK WRITE : 7.87 K/s
- Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 7.87 K/s
- TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
- 20736 be/4 www-data 0.00 B/s 7.87 K/s 0.00 % 0.08 % php-fpm: pool www
上面可以看到当前系统读写高的进程(已经排序)和 PID
找到 PID 号号办事啊
现在已经发现是哪个进程导致的问题,跟着呢,找出磁盘上哪个文件的读写过高问题
使用 lsof 命令 最简单用法是
lsof -p 20736(pid 号)
- root@iZ28ec5minyZ:~# lsof -p 20736
- COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
- php-fpm7. 20736 www-data cwd DIR 253,1 4096 2 /
- php-fpm7. 20736 www-data rtd DIR 253,1 4096 2 /
- php-fpm7. 20736 www-data txt REG 253,1 4277456 1196882 /usr/sbin/php-fpm7.0
- php-fpm7. 20736 www-data mem REG 253,1 43616 798292 /lib/x86_64-linux-gnu/libnss_files-2.19.so
- php-fpm7. 20736 www-data mem REG 253,1 47760 798284 /lib/x86_64-linux-gnu/libnss_nis-2.19.so
- php-fpm7. 20736 www-data mem REG 253,1 97296 798280 /lib/x86_64-linux-gnu/libnsl-2.19.so
- php-fpm7. 20736 www-data mem REG 253,1 39824 798279 /lib/x86_64-linux-gnu/libnss_compat-2.19.so
- php-fpm7. 20736 www-data DEL REG 0,4 21893 /dev/zero
上面的 iostat 可以看到哪个磁盘,lsof 可以找出进程控制的文件,然后找出大致是那几份文件出问题了
ok!
参考资料 http://bencane.com/2012/08/06/troubleshooting-high-io-wait-in-linux/
linux io阻塞问题相关推荐
- Linux IO - 同步,异步,阻塞,非阻塞
From:http://blog.csdn.net/historyasamirror/article/details/5778378 同步/异步,阻塞/非阻塞概念深度解析:http://blog.cs ...
- Linux之阻塞与非阻塞IO
目录 一.阻塞与非阻塞IO简介 1.阻塞IO 2.非阻塞IO 二.应用程序阻塞与非阻塞 1.阻塞 2.查询(非阻塞) ①select ②poll ③epoll 三.驱动程序阻塞与非阻塞 1.等待队列( ...
- Linux IO模型漫谈(1)
基础知识 Linux将所有外部设备都看做一个文件来进行操作.因此,linux对所有外部设备的操作都可以看做是文件的操作.文件的操作当然需要有个标示描述它,这就是文件描述符(file descripto ...
- 深入剖析Linux IO原理和几种零拷贝机制的实现
本文来说下Linux IO原理和几种零拷贝机制的实现 文章目录 概述 物理内存和虚拟内存 物理内存 虚拟内存 内核空间和用户空间 内核空间 用户空间 Linux的内部层级结构 Linux I/O读写方 ...
- Linux IO模式和select,poll,epoll解释
一些概念: 虚拟空间:是进程所看到的所有地址组成的空间.虚拟空间某个进程对所有分配给它的所有物理地址的重新映射. 寻址返回与计算机的位数有关系.分为内核空间与用户空间.针对32位的Linux系统,最高 ...
- Linux IO原理和零拷贝机制
目录 1 概述 2 Linux I/O读写方式 2.1 I/O中断原理 2.2. DMA传输原理 2.3 传统I/O方式 3 零拷贝方式 3.1 用户态直接I/O 3.2 mmap + write 3 ...
- [linux]linux IO 5种方式
1.几个重要概念 用户空间与内核空间: 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心是内核,独立于普通的应用程序,可以访 ...
- 网络编程中同步与异步,IO阻塞与非阻塞总结
IO操作分两个阶段 第1个阶段:等待数据准备好(从外部设备磁盘或网络读到内核缓冲区): 第2个阶段:采用系统调用(内核进程),操作系统内核将数据从内核缓冲区读到用户空间. 第1阶段花费的时间远远大于第 ...
- 再聊聊Linux IO
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可. 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权. 文章目录 引言 提出问题 块设备与 ...
最新文章
- C++实现九九乘法表
- linux查找时间文件,Linux基础教程 linux下使用find命令根据系统时间查找文件用法(示例代码)...
- qt widget 窗口句柄的问题
- 一键搭建php本地测试环境_如何在PHP中设置本地调试环境
- 【算法】java 用 数组 模拟 队列
- servlet中文数据存入数据库为乱码的解决办法
- Leapmotion 找到那双手和一些交互案例
- NumPy学习笔记之zeros_like()函数(包含zeros函数)
- 任务栏流量监测工具 NetSpeedMonitor 在Windows 8下的安装使用
- Flexsim国外视频教程
- 照片宽高比怎么设置_【经验分享】照片处理
- Qpython SL4A服务调用GPS定位获取获取位置信息
- Windows 11 移动文件夹错误 0x800700E1 无法成功完成操作
- mysql 查询关键字有中文_Laravel Backpack 后台列表页面查询关键词包含中文时报错...
- NBA常规赛总助攻排行榜(数据截止至11年4月14日)
- 基于高德地图SDK开发之地图显式
- linux 压缩文件性能,Linux压缩工具的性能比较
- navicat 链接mysql异常 2005 - Unknown MySQL server host ‘xxxxxxxxx‘(11001)
- Promise异步编程
- RT-Thread入门教程,环境配置和第一个代码