一、前言

此篇文章就是通过分析整个操作系统或者单个进程CPU,来监控应用的性能。而在Linux世界中,一切对象皆文件。进程执行的时候,也会将相关的信息保存在约定好的文件中,所以熟悉这些文件是必要的。

二、CPU数量

系统的CPU数量存放在/sys/devices/system/cpu/possible中,如下输出共有0至3四个CPU。

root@p212:/proc # cat /sys/devices/system/cpu/possible

0-3

三、CPU频率

利用上面的命令可以知道CPU个数,下面可以查看每个CPU对应的CPU频率。

/sys/devices/system/cpu/【cpu0】/cpufreq/cpuinfo_max_freq

root@p212:/proc # cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq

1512000

四、系统负载

/proc/loadavg文件中存放系统平均负载相关信息。

127|root@p212:/ # cat /proc/loadavg

2.86 2.67 2.68 3/530 15713

前三个数字是1、5、15分钟内的平均进程数

第四个,分子是正在运行的进程数,分母是进程总数

第五个,是最近运行的进程ID号

五、CPU调度

/proc/[pid]/sched,pid为进程号

130|root@p212:/ # cat /proc/4065/sched

system_server (4065, #threads: 83)

-------------------------------------------------------------------

se.exec_start : 118617735.634033

// 虚拟运行时间,cfs公平调度实体下使用

se.vruntime : 6176888.422605

// 总共运行时间

se.sum_exec_runtime : 11438.649001

se.statistics.wait_start : 0.000000

se.statistics.sleep_start : 118617735.634033

se.statistics.block_start : 0.000000

se.statistics.sleep_max : 58588.327902

se.statistics.block_max : 175.110499

se.statistics.exec_max : 10.003042

se.statistics.slice_max : 8.983541

se.statistics.wait_max : 34.791083

se.statistics.wait_sum : 9057.778515

se.statistics.wait_count : 64578

// io 等待时间

se.statistics.iowait_sum : 5837.190865

// io 等待次数

se.statistics.iowait_count : 1167

se.nr_migrations : 5096

se.statistics.nr_migrations_cold : 0

se.statistics.nr_failed_migrations_affine : 0

se.statistics.nr_failed_migrations_running : 3800

se.statistics.nr_failed_migrations_hot : 766

se.statistics.nr_forced_migrations : 0

se.statistics.nr_wakeups : 54333

se.statistics.nr_wakeups_sync : 29

se.statistics.nr_wakeups_migrate : 959

se.statistics.nr_wakeups_local : 25610

se.statistics.nr_wakeups_remote : 28723

se.statistics.nr_wakeups_affine : 929

se.statistics.nr_wakeups_affine_attempts : 13888

se.statistics.nr_wakeups_passive : 0

se.statistics.nr_wakeups_idle : 0

avg_atom : 0.200889

avg_per_cpu : 2.244632

// 上下文切换次数

nr_switches : 56940

// 主动上下文切换次数,比如获取不到资源,主动放弃CPU

nr_voluntary_switches : 54309

// 上被动下文切换次数,如果被动上下文切换次数过高,说明有大量线程抢占CPU资源

nr_involuntary_switches : 2631

se.load.weight : 1586

se.avg.runnable_avg_sum : 973

se.avg.runnable_avg_period : 47365

se.avg.load_avg_contrib : 32

se.avg.decay_count : 113122688

// struct_task是哪种任务,如先进先出,后台等

policy : 0

// 优先级

prio : 118

clock-delta : 125

六、/proc/stat

查看系统整体情况

130|root@p212:/ # cat /proc/stat

// 分别是:user time、nice time、system time、 idle time、 iowait、irq、softirq

cpu 3257003 31974 2667163 8808597 6822 14 12331 0 0 0

cpu0 1347460 11169 1401885 8702614 5321 0 10851 0 0 0

cpu1 1525121 10689 1002194 81153 2 7 594 0 0 0

cpu2 382045 5510 261340 15158 0 7 886 0 0 0

intr 241202651 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 54961687 0 0 0 0 7214039 0 0 12021142 0 817162 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 56275 152858 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7214037 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 27157318 0 13596066 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 293 0 0 0 0 0 14 0 0 0 0 0 0 0 0 0 2369775 218897 0 0 0 0 0 0 0 168729 0 0 0 0 0

ctxt 531798377

btime 1420070402

processes 95535

procs_running 4

procs_blocked 0

softirq 67877118 94 25753607 4296 1442197 94 94 315020 15626967 150 24734599

CPUn:是对应的CPU的信息。(时间单位jiffies)

user time : 用户态时间

nice time : 低优先级下用户态执行时间

system time : 内核态时间

idle time : 系统空闲时间

iowait time: IO等待时间

irq : 硬件中断次数

softirq : 软中断次数

intr :系统中断情况

ctxt :系统上下文切换次数

btime :系统启动时间

processes :系统创建的进程数量

procs_running :当前处于Runnable状态的进程个数

procs_blocked :当前处于等待I/O完成的进程个数

softirq :系统软中断情况

七、proc/[pid]>/stat

查看某一个进程的stat,也有/proc/[pid]/task/[tid]/stat命令,这个是查看PID进程下的TID的stat。

130|root@p212:/ # cat /proc/4065/stat

4065 (system_server) S 3753 3753 0 0 -1 1077936448 (1~9)

763146 0 859 0 321121 178088 0 0 18 (10~18)

-2 83 0 1080 1707184128 15150 18446744073709551615 (18~25)

2863460352 2863478136 4289341088 4289338152 4148691404 0 4612 0 38136 18446744073709551615 0 0 17 1 0 0 0 0 0 2863484120 2863484928 2864824320 4289342379 4289342455 4289342455 4289343456 0

1: pid: 进程ID.

2: comm: 进程名

3: state: 进程状态

4: ppid: 父进程ID

5: pgrp:进程组ID

6: session:进程会话组ID

7: tty_nr:当前进程的tty终点设备号

8: tpgid:控制进程终端的前台进程号

9: flags:进程标识位

10: minflt: 次要缺页中断的次数,即无需从磁盘加载内存页. 比如COW和匿名页

11: cminflt:当前进程等待子进程的minflt

12: majflt:主要缺页中断的次数,需要从磁盘加载内存页. 比如map文件

13: majflt:当前进程等待子进程的majflt

14: utime: 该进程处于用户态的时间

15: stime: 该进程处于内核态的时间

16: cutime:当前进程等待子进程的utime

17: cstime: 当前进程等待子进程的stime

18: priority: 进程优先级

19: nice: nice值,取值范围[19, -20]

20: num_threads: 线程个数

21: itrealvalue: 该字段已废弃,恒等于0

22: starttime:自系统启动后的进程创建时间

23: vsize:进程的虚拟内存大小,单位为bytes

24: rss: 进程独占内存+共享库,单位pages

25: rsslim: rss大小上限