在linux 上 磁盘读写过高 的 I/O 问题 导致 cpu wait 问题,这里是用一些方法找出问题。

首先 使用 top 命令找出 出现 cpu 中 是否进程运行等待问题

# top

[cpp] view plaincopy
  1. top - 03:57:39 up 1 day, 15:40,  0 users,  load average: 0.00, 0.00, 0.00
  2. Tasks:   8 total,   1 running,   7 sleeping,   0 stopped,   0 zombie
  3. %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
  4. KiB Mem :  1019664 total,   174644 free,    78960 used,   766060 buff/cache
  5. KiB Swap:  1165316 total,  1154816 free,    10500 used.   272848 avail Mem

在%Cpu(s) 一行中 95.1 wa (例子数据)

表示cpu 中出现严重等待问题,可能导致的原因就包括 读写磁盘 I/O 造成的

查找是否是 (确定 上面假设)I/O阻塞问题

方法有二

方法一

[cpp] view plaincopy
  1. $ iostat -x 2 5
  2. avg-cpu: %user %nice %system %iowait %steal %idle
  3. 3.66 0.00 47.64 48.69 0.00 0.00
  4. Device: rrqm/s  wrqm/s  r/s     w/s    rkB/s     wkB/s     avgrq-sz  avgqu-sz  await   r_await  w_await  svctm   %util
  5. 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
  6. 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
  7. 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  写入请求数  说明读出次数过高

其它参数

[cpp] view plaincopy
  1. rrqm/s:每秒这个设备相关的读取请求有多少被Merge了(当系统调用需要读取数据的时候,VFS将请求发到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,FS会将这个请求合并Merge);wrqm/s:每秒这个设备相关的写入请求有多少被Merge了。
  2. rsec/s:每秒读取的扇区数;
  3. wsec/:每秒写入的扇区数。
  4. rKB/s:The number of read requests that were issued to the device per second;
  5. wKB/s:The number of write requests that were issued to the device per second;
  6. avgrq-sz 平均请求扇区的大小
  7. avgqu-sz 是平均请求队列的长度。毫无疑问,队列长度越短越好。
  8. await:  每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。
  9. 这个时间包括了队列时间和服务时间,也就是说,一般情况下,await大于svctm,它们的差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。
  10. svctm    表示平均每次设备I/O操作的服务时间(以毫秒为单位)。如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长,         系统上运行的应用程序将变慢。
  11. %util: 在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度
  12. 。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。

参考 http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858810.html

方法二

[cpp] view plaincopy
  1. root@50e261fb9e06:/var# dstat -d
  2. -dsk/total-
  3. read  writ
  4. 1081B  977B
  5. 0     0
  6. 0     0
  7. 0     0
  8. 0     0

使用 dstat ,其实他就是集成了iostat , vmstat,netstat,ifstat 等工具而已

现在确定了 是 I/O 问题了,接着找出哪个进程 操作哪些文件而导致上面的原因的

同样提供两种方法

第一种 根据 linux IO 读写 epoll 机制(省略,研究中...)读写时会合理运用资源,就是某某进程在读资源,就会先sleep 一会,把cpu让给其他进程,那么阻塞的时候就会不间断的sleep 或 ps 里面 的 状态或“D”状态,所以可以用脚本找出如下可疑进程

[cpp] view plaincopy
  1. # for x in `seq 1 1 10`; do ps -eo state,pid,cmd | grep "^D"; echo "----"; sleep 5; done
  2. D 248 [jbd2/dm-0-8]
  3. D 16528 bonnie++ -n 0 -u 0 -r 239 -s 478 -f -b -d /tmp
  4. ----
  5. D 22 [kswapd0]
  6. D 16528 bonnie++ -n 0 -u 0 -r 239 -s 478 -f -b -d /tmp
  7. ----
  8. D 22 [kswapd0]
  9. D 16528 bonnie++ -n 0 -u 0 -r 239 -s 478 -f -b -d /tmp
  10. ----
  11. D 22 [kswapd0]
  12. D 16528 bonnie++ -n 0 -u 0 -r 239 -s 478 -f -b -d /tmp
  13. ----
  14. D 16528 bonnie++ -n 0 -u 0 -r 239 -s 478 -f -b -d /tmp
  15. ----

第二种方法使用   iotop 工具,这个可能需要安装,不是系统自带的

[cpp] view plaincopy
  1. Total DISK READ :       0.00 B/s | Total DISK WRITE :       7.87 K/s
  2. Actual DISK READ:       0.00 B/s | Actual DISK WRITE:       7.87 K/s
  3. TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND
  4. 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 号)

[cpp] view plaincopy
  1. root@iZ28ec5minyZ:~# lsof -p 20736
  2. COMMAND     PID     USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
  3. php-fpm7. 20736 www-data  cwd    DIR  253,1     4096       2 /
  4. php-fpm7. 20736 www-data  rtd    DIR  253,1     4096       2 /
  5. php-fpm7. 20736 www-data  txt    REG  253,1  4277456 1196882 /usr/sbin/php-fpm7.0
  6. php-fpm7. 20736 www-data  mem    REG  253,1    43616  798292 /lib/x86_64-linux-gnu/libnss_files-2.19.so
  7. php-fpm7. 20736 www-data  mem    REG  253,1    47760  798284 /lib/x86_64-linux-gnu/libnss_nis-2.19.so
  8. php-fpm7. 20736 www-data  mem    REG  253,1    97296  798280 /lib/x86_64-linux-gnu/libnsl-2.19.so
  9. php-fpm7. 20736 www-data  mem    REG  253,1    39824  798279 /lib/x86_64-linux-gnu/libnss_compat-2.19.so
  10. 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阻塞问题相关推荐

  1. Linux IO - 同步,异步,阻塞,非阻塞

    From:http://blog.csdn.net/historyasamirror/article/details/5778378 同步/异步,阻塞/非阻塞概念深度解析:http://blog.cs ...

  2. Linux之阻塞与非阻塞IO

    目录 一.阻塞与非阻塞IO简介 1.阻塞IO 2.非阻塞IO 二.应用程序阻塞与非阻塞 1.阻塞 2.查询(非阻塞) ①select ②poll ③epoll 三.驱动程序阻塞与非阻塞 1.等待队列( ...

  3. Linux IO模型漫谈(1)

    基础知识 Linux将所有外部设备都看做一个文件来进行操作.因此,linux对所有外部设备的操作都可以看做是文件的操作.文件的操作当然需要有个标示描述它,这就是文件描述符(file descripto ...

  4. 深入剖析Linux IO原理和几种零拷贝机制的实现

    本文来说下Linux IO原理和几种零拷贝机制的实现 文章目录 概述 物理内存和虚拟内存 物理内存 虚拟内存 内核空间和用户空间 内核空间 用户空间 Linux的内部层级结构 Linux I/O读写方 ...

  5. Linux IO模式和select,poll,epoll解释

    一些概念: 虚拟空间:是进程所看到的所有地址组成的空间.虚拟空间某个进程对所有分配给它的所有物理地址的重新映射. 寻址返回与计算机的位数有关系.分为内核空间与用户空间.针对32位的Linux系统,最高 ...

  6. 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 ...

  7. [linux]linux IO 5种方式

    1.几个重要概念 用户空间与内核空间: 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心是内核,独立于普通的应用程序,可以访 ...

  8. 网络编程中同步与异步,IO阻塞与非阻塞总结

    IO操作分两个阶段 第1个阶段:等待数据准备好(从外部设备磁盘或网络读到内核缓冲区): 第2个阶段:采用系统调用(内核进程),操作系统内核将数据从内核缓冲区读到用户空间. 第1阶段花费的时间远远大于第 ...

  9. 再聊聊Linux IO

    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可. 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权. 文章目录 引言 提出问题 块设备与 ...

最新文章

  1. C++实现九九乘法表
  2. linux查找时间文件,Linux基础教程 linux下使用find命令根据系统时间查找文件用法(示例代码)...
  3. qt widget 窗口句柄的问题
  4. 一键搭建php本地测试环境_如何在PHP中设置本地调试环境
  5. 【算法】java 用 数组 模拟 队列
  6. servlet中文数据存入数据库为乱码的解决办法
  7. Leapmotion 找到那双手和一些交互案例
  8. NumPy学习笔记之zeros_like()函数(包含zeros函数)
  9. 任务栏流量监测工具 NetSpeedMonitor 在Windows 8下的安装使用
  10. Flexsim国外视频教程
  11. 照片宽高比怎么设置_【经验分享】照片处理
  12. Qpython SL4A服务调用GPS定位获取获取位置信息
  13. Windows 11 移动文件夹错误 0x800700E1 无法成功完成操作
  14. mysql 查询关键字有中文_Laravel Backpack 后台列表页面查询关键词包含中文时报错...
  15. NBA常规赛总助攻排行榜(数据截止至11年4月14日)
  16. 基于高德地图SDK开发之地图显式
  17. linux 压缩文件性能,Linux压缩工具的性能比较
  18. navicat 链接mysql异常 2005 - Unknown MySQL server host ‘xxxxxxxxx‘(11001)
  19. Promise异步编程
  20. RT-Thread入门教程,环境配置和第一个代码

热门文章

  1. 第四节:5种数据类型在TypeScript中的运用
  2. 性能优化(9):切记要避免重定向
  3. 探讨SEO与前端:使用display:none对seo的影响
  4. smote算法_支持向量机算法的可解释和可视化
  5. 局域网samba配置,以及在Windows环境下的访问
  6. RLock vs Lock
  7. 优化算法笔记|飞蛾扑火优化算法理解及实现
  8. ggplot2绘图如何根据一个变量即区分颜色又区分深浅?
  9. 展示一个基本的正则用例
  10. 【重磅综述】长序列数据分析相关资源哪里找?一文读懂长序列测序数据分析的机遇与挑战!...