linux IO性能
一、相关命令
(1) top
top命令是Linux下面使用较多的一款性能分析工具,与windows的任务管理器很相似;命令是前台显示并且是动态刷新的;
命令格式
top [参数]
命令功能
显示当前系统正在执行的进程的相关信息,包括进程ID、内存占用率、CPU占用率等
参数
-b 批处理
-c 显示完整的治命令
-I 忽略失效过程
-s 保密模式
-S 累积模式
-i<时间> 设置间隔时间
-u<用户名> 指定用户名
-p<进程号> 指定进程
-n<次数> 循环显示的次数
实例 top
关于IO相关的,我们很多时候会注意第三行,CPU信息这行
0.5 us:用户空间所占CPU百分比
0.2 sy:内核空间占用CPU百分比
0.0 ni:用户进程空间内改变过优先级的进程占用CPU百分比
- 3 id:空闲CPU百分比
0.0 wa:等待IO的CPU时间百分比
0.0 hi:硬件CPU中断占用百分比
0.0 si:软中断占用百分比
0.0 st:虚拟机占用百分比
其他信息有很多讲解,不过多说了;
一般IO相关看CPU和wa这两个字段信息;
(2) lsof
参考:https://www.cnblogs.com/peida/archive/2013/02/26/2932972.html
lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。
命令格式:
lsof [参数] [文件]
命令功能
用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为 lsof 需要访问核心内存和各种文件,所以需要root用户执行。
命令参数
-a 列出打开文件存在的进程
-c<进程名> 列出指定进程所打开的文件
-g 列出GID号进程详情
-d<文件号> 列出占用该文件号的进程
+d<目录> 列出目录下被打开的文件
+D<目录> 递归列出目录下被打开的文件
-n<目录> 列出使用NFS的文件
-i<条件> 列出符合条件的进程。(4、6、协议、:端口、 @ip )
-p<进程号> 列出指定进程号所打开的文件
-u 列出UID号进程详情
-h 显示帮助信息
-v 显示版本信息
(3) strace
strace 是一个可用于诊断、调试和教学的Linux用户空间跟踪器。我们用它来监控用户空间进程和内核的交互,比如系统调用、信号传递、进程状态变更等。
命令格式
strace [参数]
参数
tt 在每行输出的前面,显示毫秒级别的时间 -T 显示每次系统调用所花费的时间 -v 对于某些相关调用,把完整的环境变量,文件stat结构等打出来。 -f 跟踪目标进程,以及目标进程创建的所有子进程 -e 控制要跟踪的事件和跟踪行为,比如指定要跟踪的系统调用名称 -o 把strace的输出单独写到指定的文件 -s 当系统调用的某个参数是字符串时,最多输出指定长度的内容,默认是32个字节 -p 指定要跟踪的进程pid, 要同时跟踪多个pid, 重复多次-p选项即可。
二、IO指标和类型
磁盘 I/O 性能指标
- 使用率,是指磁盘忙处理 I/O 请求的百分比。过高的使用率(比如超过 60%)通常意味着磁盘 I/O 存在性能瓶颈。
- IOPS(Input/Output Per Second),是指每秒的 I/O 请求数。
- 吞吐量,是指每秒的 I/O 请求大小。
- 响应时间,是指从发出 I/O 请求到收到响应的间隔时间。
IO类型
阻塞 I/O,是指应用程序在执行 I/O 操作后,如果没有获得响应,就会阻塞当前线程,不能执行其他任务。
非阻塞 I/O,是指应用程序在执行 I/O 操作后,不会阻塞当前的线程,可以继续执行其他的任务。
同步 I/O,是指收到 I/O 请求后,系统不会立刻响应应用程序;等到处理完成,系统才会通过系统调用的方式,告诉应用程序 I/O 结果。
异步 I/O,是指收到 I/O 请求后,系统会先告诉应用程序 I/O 请求已经收到,随后再去异步处理;等处理完成后,系统再通过事件通知的方式,告诉应用程序结果。
三、IO性能分析
案例:
这里写了一个简单的程序,不断的把数据写入文件
#include <iostream>#include <fstream>#include <string>#include <unistd.h>using namespace std;ofstream ofs;void WriteLog(string msg){ ofs<<msg<<endl;}int main(){ ofs.open("1.txt",ios::out|ios::app); while(1) { sleep(0.1); WriteLog("WriteLog...."); } ofs.close(); return 0;}
然后我们运行程序:
我们发现CPU使用率比较高,使用pidstat来看下进程:
我们发现每秒写入磁盘比较大;
使用starce跟踪一下进程号3118
我们会发现在程序调用了write这个接口,我们使用lsof看下相关的文件
最终得出结论,由于不断的写1.txt这个文件,导致了CPU的升到,但是这里没有体现出影响IO性能;
一般IO出现瓶颈问题,一般我们看着两个指标:
但是需要注意: iowait只是代表了CPU上I/O操作的时间占用的百分比,如果没有其他进程运行,那么只有IO运行,这个占比也会比较高的,这点需要注意下;
四、总结
我们一般遇到io相关的问题,先使用top看下iowait指标和CPU占有率,然后pidstat看是哪个进程比较高,然后再通过strace,lsof找出进程在读写的具体文件,然后对应的分析;这样的流程适用于很多场合下,当然,实际工作中可能更加复杂,需要不断的去探索和思考练习;
想了解学习更多C++后台服务器方面的知识,请关注: 微信公众号:====CPP后台服务器开发====
本文使用 mdnice 排版