监控与分析

监控与分析

一、系统级 IO 监控

1. iostat 工具

统计的是通用块层经过合并后,直接向设备提交的 IO 数据,可以反映系统整体的 IO 状况,但是有如下缺点:

  • 距离业务层比较遥远,和代码中的 read、write 不对应(由于系统预读、pagecache、IO 调度算法等)
  • 是系统级,没有办法精确到进程,比如得知磁盘很忙,但是没办法告诉我们谁在忙?忙什么?

二、进程级别 IO 监控

1. iotop 和 pidstat 工具

都是依赖 /proc/pid/io 文件导出的统计信息。可以得知:

  • 当前系统哪些进程在占用 IO,百分比是多少?
  • 占用 IO 的进程是在读?还是在写?读写量是多少

但是这两个工具统计的粒度较粗,没有办法得知当前进程读写了哪些文件?耗时以及大小?

三、业务级 IO 监控

1. ioprofile 工具

本质上是 lsof 和 strace 的组合。可以解决这几个问题:

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

https://blog.yufeng.info/archives/995

四、文件级 IO 监控

主要针对单个文件,查看当前那些进程正在对某个文件进行读写操作

  • lsof 或者 /proc/pid/fd

1. lsof 工具

查看当前目录有哪些进程打开:

1
2
3
4
5
6
# /tmp 目录,查看当前打开 tmp 目录的进程
# lsof /tmp
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
zsh 6607 zhangyi83 cwd DIR 259,2 12288 14942209 /tmp
lsof 7370 zhangyi83 cwd DIR 259,2 12288 14942209 /tmp
lsof 7371 zhangyi83 cwd DIR 259,2 12288 14942209 /tmp

lsof 命令只能查看静态信息,并且打开并不代表一定读取了,对于 cat、echo 这种转瞬即逝的操作,lsof 捕捉不到