5.27 IO 基础学习
I/O 分析手法
- I/O 是针对磁盘和内存来说的
- I:内存从磁盘中读取数据
- O:内存向磁盘写入数据
- 系统级IO监控:iostat、vmstat 进程级IO监控:iodump、iotop 文件级IO监控:ioprofile,sysstat
为什么要关注 I/O
大多数时间里性能由于在硬盘上的高 I/O 读和写降低了性能。如果它很高或者波动,很可能就是它造成的。因此,我们需要检查硬盘上的 I/O 活动。
分析 I/O 的相关命令
vmstat
简介
vmstat(Virtual Memory Statistics 虚拟内存统计) 命令用来显示Linux系统虚拟内存状态,也可以报告关于进程、内存、I/O等系统整体运行状态。
代码实现文件路径:http://10.205.0.38:8080/sprds_int/xref/external/toybox/toys/other/vmstat.c
示例
procs:
r: 运行队列中进程数量,这个值也可以判断是否需要增加CPU。(长期大于1)
b: 等待IO的进程数量。
memory:
swpd: 使用虚拟内存大小,如果swpd的值不为0,但是SI,SO的值长期为0,这种情况不会影响系统性能。
free: 空闲物理内存大小。
buff: 用作缓冲的内存大小。
cache: 用作缓存的内存大小,如果cache的值大的时候,说明cache处的文件数多,如果频繁访问到的文件都能被cache处,那么磁盘的读IO bi会非常小
好不容易理解了 buffer 和 cache 的区别
buffer 和 cache 是内存划分出来的两个不同区域。
内存空间 = 绝对 used + 绝对 free + buffer(used+free) + cache(used+free)
buffer:缓冲,一般用来高速设备向低速设备写数据时,避免突发性 IO。当高速设备向低速设备写数据时,会先将数据填满 buffer,最后再一次性写入低速设备。
cache:缓存,一般用来高速设备向低速设备读数据时。当高速设备向低速设备读数据时,第一次读取的时候,会在 cache 中拷贝一份数据。然后后续高速设备再向低速设备读取数据的时候,直接从 cache 中读取数据。
参考文档:www.cnblogs.com/M18-BlankBo…
swap:
si: 每秒从交换区写到内存的大小,由磁盘调入内存。
so: 每秒写入交换区的内存大小,由内存调入磁盘。
注意:内存够用的时候,这2个值都是0,如果这2个值长期大于0时,系统性能会受到影响,磁盘IO和CPU资源都会被消耗。有些朋友看到空闲内存(free)很少的或接近于0时,就认为内存不够用了,不能光看这一点,还要结合si和so,如果free很少,但是si和so也很少(大多时候是0),那么不用担心,系统性能这时不会受到影响的。因为linux总是先把内存用光
IO:
bi: 从块设备读取数据的量(读磁盘);从磁盘里出来进入到内存里边去
bo: 从块设备写入数据的量(写磁盘);
注意:随机磁盘读写的时候,这2个值越大(如超出1024k),能看到CPU在IO等待的值也会越大。
system:
in: 每秒中断数,包括时钟中断。
cs: 每秒上下文切换数。
注意:上面2个值越大,会看到由内核消耗的CPU时间会越大
cpu:
us: 用户进程执行时间百分比(user time) us的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期超50%的使用,那么我们就该考虑优化程序算法或者进行加速。
sy: 内核系统进程执行时间百分比(system time) sy的值高时,说明系统内核消耗的CPU资源多,这并不是良性表现,我们应该检查原因。
wa: IO等待时间百分比 wa的值高时,说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)。
id: 空闲时间百分比
lsof + strace
lsof 查看进程打开的文件描述符
COMMAND:进程的名称
PID:进程标识符
USER:进程所有者
FD:文件描述符,应用程序通过文件描述符识别该文件。
TYPE:文件类型
DEVICE:指定磁盘的名称
SIZE:文件的大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称
统计系统中当前打开的总文件句柄数:lsof|awk '{print $2}'|wc -l
根据打开文件句柄的数量降序排列,其中第二列为进程ID:lsof|awk '{print $2}'|uniq -c|sort -nr|more
strace –p 1693 #按照Pid查询系统调用
strace常用来跟踪进程执行时的系统调用和所接收的信号。
有两种跟踪模式。
一种是通过它启动要跟踪的进程。用法很简单,在原本的命令前加上strace即可
另外一种运行模式,是跟踪已经在运行的进程,在不中断进程执行的情况下,理解它在干嘛
-
e.g. strace -tt -T -v -f -e trace=file -o /data/log/strace.log -s 1024 -p 23489
这里的输出只显示和文件访问有关的内容,这是因为我们通过-e trace=file 选项指定了 -tt 在每行输出的前面,显示毫秒级别的时间 -T 显示每次系统调用所花费的时间 -v 对于某些相关调用,把完整的环境变量,文件stat结构等打出来。 -f 跟踪目标进程,以及目标进程创建的所有子进程 -e 控制要跟踪的事件和跟踪行为,比如指定要跟踪的系统调用名称 -o 把strace的输出单独写到指定的文件 -s 当系统调用的某个参数是字符串时,最多输出指定长度的内容,默认是32个字节 -p 指定要跟踪的进程pid, 要同时跟踪多个pid, 重复多次-p选项即可。
参考文档:www.cnblogs.com/zhiminyu/p/…
-
追踪一个已经存在的进程: strace -p [pid]
-
统计系统调用次数 strace -p [pid] -c 使用ctrl+c 停止统计
-
统计系统调用时间点 strace -p [pid] -tt
-
查看每一条系统调用的耗时