详解Linux下的IO监控与分析:系统级+进程级+业务级+文件级IO

系统 Linux
学习优化,理解IO还是很重要的,今天抽空整理了一下这块内容,下面一起看看吧~

概述

[[267201]]

学习优化,理解IO还是很重要的,今天抽空整理了一下这块内容,下面一起看看吧~

下面这张经典的图源自 Linux Performance and Tuning Guidelines.pdf 

详解Linux下的IO监控与分析--系统级+进程级+业务级+文件级IO

各种IO监视工具在Linux IO 体系结构中的位置

1 、系统级IO监控

1.1、iostat

  1. iostat -xdm 1 # 个人习惯 

详解Linux下的IO监控与分析--系统级+进程级+业务级+文件级IO

%util 代表磁盘繁忙程度。100% 表示磁盘繁忙, 0%表示磁盘空闲。但是注意,磁盘繁忙不代表磁盘(带宽)利用率高

argrq-sz 提交给驱动层的IO请求大小,一般不小于4K,不大于max(readahead_kb, max_sectors_kb)

可用于判断当前的IO模式,一般情况下,尤其是磁盘繁忙时, 越大代表顺序,越小代表随机

svctm 一次IO请求的服务时间,对于单块盘,完全随机读时,基本在7ms左右,既寻道+旋转延迟时间

1.2、各统计量之间关系

%util = ( r/s + w/s) * svctm / 1000 # 队列长度 = 到达率 * 平均服务时间

avgrq-sz = ( rMB/s + wMB/s) * 2048 / (r/s + w/s) # 2048 为 1M / 512

1.3、总结

iostat 统计的是通用块层经过合并(rrqm/s, wrqm/s)后,直接向设备提交的IO数据,可以反映系统整体的IO状况,但是有以下2个缺点:

  • 距离业务层比较遥远,跟代码中的write,read不对应(由于系统预读 + pagecache + IO调度算法等因素, 也很难对应)
  • 是系统级,没办法精确到进程,比如只能告诉你现在磁盘很忙,但是没办法告诉你是谁在忙,在忙什么?

2 、进程级IO监控

2.1、 iotop 和 pidstat (仅rhel6u系列)

iotop 顾名思义, io版的top

pidstat 顾名思义, 统计进程(pid)的stat,进程的stat自然包括进程的IO状况

这两个命令,都可以按进程统计IO状况,因此可以知道:

1)当前系统哪些进程在占用IO,百分比是多少?

2)占用IO的进程是在读?还是在写?读写量是多少?

pidstat 参数很多,介绍几个比较常用的:

  1. pidstat -d 1 #只显示IO 

详解Linux下的IO监控与分析--系统级+进程级+业务级+文件级IO

  1. pidstat -u -r -d -t 1  
  • # -d IO 信息,
  • # -r 缺页及内存信息
  • # -u CPU使用率
  • # -t 以线程为统计单位
  • # 1 1秒统计一次
  • iotop, 很简单,直接敲命令

详解Linux下的IO监控与分析--系统级+进程级+业务级+文件级IO

2.2、block_dump, iodump

iotop 和 pidstat 都依赖于/proc/pid/io文件导出的统计信息, 这个对于老一些的内核是没有的,比如rhel5u2。

因此只好用以上2个命令来替代:

  1. echo 1 > /proc/sys/vm/block_dump # 开启block_dump,此时会把io信息输入到dmesg中 

# dmesg

  1. watch -n 1 "dmesg -c | grep -oP "w+(d+): (WRITE|READ)" | sort | uniq -c" 

详解Linux下的IO监控与分析--系统级+进程级+业务级+文件级IO

# 不停的dmesg -c

  1. echo 0 > /proc/sys/vm/block_dump # 不用时关闭 

详解Linux下的IO监控与分析--系统级+进程级+业务级+文件级IO

2.3、总结

从进程级IO监控 ,可以看出:

  • 系统级IO监控不能回答的2个问题
  • 距离业务层相对较近(例如,可以统计进程的读写量)

但是也没有办法跟业务层的read,write联系在一起,同时颗粒度较粗,没有办法知道当前进程读写了哪些文件? 耗时? 大小 ?

3、 业务级IO监控

3.1、ioprofile

ioprofile 命令本质上是 lsof + strace,

ioprofile 可以解决以下三个问题:

  • 当前进程某时间内,在业务层面读写了哪些文件(read, write)?
  • 读写次数是多少?(read, write的调用次数)
  • 读写数据量多少?(read, write的byte数)

3.2、实例

假设某个行为会触发程序一次IO动作,例如: "一个页面点击,导致后台读取A,B,C文件"

./io_event # 假设模拟一次IO行为,读取A文件一次, B文件500次, C文件500次

ioprofile -p `pidof io_event` -c count # 读写次数

 详解Linux下的IO监控与分析--系统级+进程级+业务级+文件级IO

ioprofile -p `pidof io_event` -c times # 读写耗时

详解Linux下的IO监控与分析--系统级+进程级+业务级+文件级IO

ioprofile -p `pidof io_event` -c sizes # 读写大小

 详解Linux下的IO监控与分析--系统级+进程级+业务级+文件级IO

注: ioprofile 仅支持多线程程序,对单线程程序不支持. 对于单线程程序的IO业务级分析,strace足以。

3.3、总结

ioprofile本质上是strace,因此可以看到read,write的调用轨迹,可以做业务层的io分析。

4 、文件级IO监控

文件级IO监控可以配合/补充"业务级和进程级"IO分析

文件级IO分析,主要针对单个文件, 查看当前哪些进程正在对某个文件进行读写操作.

  • lsof 或者 ls /proc/pid/fd
  • inodewatch.stp

4.1、lsof

查看当前文件由哪些进程打开

lsof ../io # io目录 当前由 bash 和 lsof 两个进程打开

 详解Linux下的IO监控与分析--系统级+进程级+业务级+文件级IO

lsof 命令 只能查看静态的信息, 并且"打开" 并不一定"读取", 对于 cat ,echo这样的命令, 打开和读取都是瞬间的,lsof很难捕捉

4.2、inodewatch.stp

可以用 inodewatch.stp 来弥补

  1. stap inodewatch.stp major minor inode # 主设备号, 辅设备号, 文件inode节点号  
  2. stap inodewatch.stp 0xfd 0x00 523170 # 主设备号, 辅设备号, inode号,可以通过 stat 命令获得  

详解Linux下的IO监控与分析--系统级+进程级+业务级+文件级IO

责任编辑:武晓燕 来源: 今日头条
相关推荐

2012-02-06 09:40:25

2022-09-06 09:29:43

监控系统

2009-09-22 11:59:19

2017-06-09 17:35:07

Zerto灾备

2023-11-03 08:22:09

Android系统算法

2016-02-23 13:16:08

网络监控网络可用性监控系统

2010-05-24 12:50:59

MySQL表级锁

2018-01-09 09:45:02

秒级监控阿里

2023-12-08 12:04:32

命令Linux骨灰级

2009-08-09 20:39:11

Linux内核虚拟环境虚拟主机

2010-09-01 14:10:36

CSS优先级

2022-08-30 08:41:51

日志文件FileBeat配置

2020-06-11 09:00:59

ELKTB级监控

2020-01-13 08:43:20

Elasticsear分布式搜索

2013-03-28 09:35:31

企业级系统

2009-09-23 09:37:07

Hibernate缓存

2011-03-24 16:41:24

百卓网络百卓上网行为管理

2010-09-09 15:54:00

blockinlineCSS

2012-09-04 13:56:48

LinuxMySQL优化

2012-12-28 09:57:53

点赞
收藏

51CTO技术栈公众号