Linux环境获取系统性能数据
CPU利用率
/proc/stat文件里包含系统cpu使用情况,2-8列对应的CPU消耗含义是用户态消耗(user)、用户态nice消耗(nice)、内 核态消耗(sys)、空闲时间(idle)、等待IO消耗(iowait)、硬件中断消耗(hardirq)、软中断消耗(softirq)。(man proc)
1 |
|
要计算t1~t2时间内系统的cpu利用率,需要在t1、t2时刻分别采集cpu使用信息1
2
3
4
5
6t1_all = t1(user + nice + sys + idle + iowait + hardirq + sortirq)
t1_used = t1(user + nice + sys + iowait + hardirq + sortirq)
t2_all = t2(user + nice + sys + idle + iowait + hardirq + sortirq
t2_used = t2(user + nice + sys + iowait + hardirq + sortirq)
cpu_usage = (t2_used - t1_used) / (t2_all - t1_all)
进程CPU利用率
/proc/$pid/stat文件里包含某个进程的cpu使用信息,14、15、16、17列对应进程用户态消耗(user)、内核态消耗(sys)、用户态等待子进程的消耗(user_child)、内核态等待子进程的消耗(sys_child)。
1 |
|
t1、t2时刻分别采集/proc/stat、/proc/$pid/stat,获取总的cpu消耗,以及进程的cpu消耗1
2
3
4
5
6t1_all = t1(user + nice + sys + idle + iowait + hardirq + sortirq)
t1_pid = t1(user + sys + user_child + sys_child)
t2_all = t2(user + nice + sys + idle + iowait + hardirq + sortirq)
t2_pid = t2(user + sys + user_child + sys_child)
pid_cpu_usage = (t2_pid - t1_pid) / (t2_all - t1_all)
内存利用率
/proc/meminfo文件里包含系统内存使用信息
1 | $ cat /proc/meminfo |
系统load
/proc/uptime的前3列包含了最近1min、5min、15min系统的平均load(正在运行或等待IO的进程数,进程state为R或D)
1 | $cat /proc/loadavg |
网卡流量信息
/proc/net/dev包含所有网卡的流量信息,第1、2、10、11列分别代表网卡当前接受字节数(recv_bytes)、接受包个数(recv_packets)、发送字节数(send_bytes)、发送个数(send_packets)。
1 | $cat /proc/net/dev |
t1~t2时间内的平均流量为1
2avg_recv_bytes = (t2_recv_bytes - t1_recv_bytes) / (t2 - t1)
avg_send_bytes = (t2_send_bytes - t1_send_bytes) / (t2 - t1)
磁盘(文件系统)空间信息
通过statfs系统调用可获取当前文件系统的空间占用情况
1 | struct statfs { |
磁盘读写信息
/proc/diskstats包含磁盘的IO信息,第4-9列分别为当前磁盘读次数(read),磁盘读扇区数(read_sec)、磁盘读毫秒数(read_ms)、磁盘写次数(write)、磁盘写扇区数(write_sec)、磁盘写毫秒数(write_ms)。
1 | $cat /proc/diskstats |
t1~t2时间内磁盘平均读写次数、扇区数、IO利用率计算如下1
2
3
4
5avg_read = (t2_read - t1_read) / (t2 - t1)
avg_read_sec = (t2_read_sec - t1_read_sec) / (t2 - t1)
avg_write = (t2_write - t1_write) / (t2 - t1)
avg_write_sec = (t2_write_sec - t1_write_sec) / (t2 - t1)
io_util = (t2_read_ms + t2_write_ms - t1_read_ms - t1_write_ms) / (t2 - t1) (t1~t2时间段内IO

