一、前言
此篇文章就是通过分析整个操作系统或者单个进程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大小上限