io分配表怎么写(一文看懂系统级IO)
io分配表怎么写(一文看懂系统级IO)1.2、各统计量之间关系svctm 一次IO请求的服务时间 对于单块盘 完全随机读时 基本在7ms左右 既寻道 旋转延迟时间iostat -xdm 1 # 个人习惯 %util 代表磁盘繁忙程度。100% 表示磁盘繁忙 0%表示磁盘空闲。但是注意 磁盘繁忙不代表磁盘(带宽)利用率高argrq-sz 提交给驱动层的IO请求大小 一般不小于4K 不大于max(readahead_kb max_sectors_kb)可用于判断当前的IO模式 一般情况下 尤其是磁盘繁忙时 越大代表顺序 越小代表随机
概述学习优化,理解IO还是很重要的,今天抽空整理了一下这块内容,下面一起看看吧~
下面这张经典的图源自 Linux Performance and Tuning Guidelines.pdf
各种IO监视工具在Linux IO 体系结构中的位置
1 、系统级IO监控
1.1、iostat
iostat -xdm 1 # 个人习惯
%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个缺点:
- 1 距离业务层比较遥远 跟代码中的write read不对应(由于系统预读 pagecache IO调度算法等因素 也很难对应)
- 2 是系统级 没办法精确到进程 比如只能告诉你现在磁盘很忙 但是没办法告诉你是谁在忙 在忙什么?
2 、进程级IO监控
2.1、 iotop 和 pidstat (仅rhel6u系列)
iotop 顾名思义 io版的top
pidstat 顾名思义 统计进程(pid)的stat 进程的stat自然包括进程的IO状况
这两个命令 都可以按进程统计IO状况 因此可以知道:
1)当前系统哪些进程在占用IO 百分比是多少?
2)占用IO的进程是在读?还是在写?读写量是多少?
pidstat 参数很多,介绍几个比较常用的:
pidstat -d 1 #只显示IO
pidstat -u -r -d -t 1
# -d IO 信息
# -r 缺页及内存信息
# -u CPU使用率
# -t 以线程为统计单位
# 1 1秒统计一次
iotop 很简单 直接敲命令
2.2、block_dump iodump
iotop 和 pidstat 都依赖于/proc/pid/io文件导出的统计信息 这个对于老一些的内核是没有的 比如rhel5u2。
因此只好用以上2个命令来替代:
echo 1 > /proc/sys/vm/block_dump # 开启block_dump 此时会把io信息输入到dmesg中
# dmesg
watch -n 1 "dmesg -c | grep -oP \"\w \(\d \): (WRITE|READ)\" | sort | uniq -c"
# 不停的dmesg -c
echo 0 > /proc/sys/vm/block_dump # 不用时关闭
2.3、总结
从进程级IO监控 ,可以看出:
- 系统级IO监控不能回答的2个问题
- 距离业务层相对较近(例如 可以统计进程的读写量)
但是也没有办法跟业务层的read write联系在一起 同时颗粒度较粗 没有办法知道当前进程读写了哪些文件? 耗时? 大小 ?
3、 业务级IO监控
3.1、ioprofile
ioprofile 命令本质上是 lsof strace
ioprofile 可以解决以下三个问题:
1 当前进程某时间内 在业务层面读写了哪些文件(read write)?
2 读写次数是多少?(read write的调用次数)
3 读写数据量多少?(read write的byte数)
3.2、实例
假设某个行为会触发程序一次IO动作 例如: "一个页面点击 导致后台读取A B C文件"
============================================
./io_event # 假设模拟一次IO行为 读取A文件一次 B文件500次 C文件500次
ioprofile -p `pidof io_event` -c count # 读写次数
ioprofile -p `pidof io_event` -c times # 读写耗时
ioprofile -p `pidof io_event` -c sizes # 读写大小
注: 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 两个进程打开
lsof 命令 只能查看静态的信息 并且"打开" 并不一定"读取" 对于 cat echo这样的命令 打开和读取都是瞬间的 lsof很难捕捉
4.2、inodewatch.stp
可以用 inodewatch.stp 来弥补
stap inodewatch.stp major minor inode # 主设备号 辅设备号 文件inode节点号 stap inodewatch.stp 0xfd 0x00 523170 # 主设备号 辅设备号 inode号 可以通过 stat 命令获得
后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注一下~