28 March 2019

Linux 系统下几种常用的CPU监控命令

cpu是整个操作系统的核心,整个操作系统的运行状态,跟cpu有着重要的关系。 我们可以通过一些常用工具和命令,获取cpu的监控信息。 从监控信息能看到

  • top
  • mpstat
  • sar –p
  • perf
  • pidstat
  • uptime
  • w
  • ps
  • /proc/cpuinfo

top

Linux的任务管理器 display Linux tasks 多核模式, 1/I: 切换smp模式,观察每个SMP CPU 的使用率

Tasks: 349 total,   1 running, 347 sleeping,   0 stopped,   1 zombie
load average: 0.18, 0.26, 0.32
Cpu0  :  0.3%us,  0.3%sy,  0.0%ni, 99.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu1  : 10.4%us,  1.8%sy,  0.0%ni, 87.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu2  :  3.7%us,  0.9%sy,  0.0%ni, 95.4%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu3  :  0.6%us,  0.3%sy,  0.0%ni, 99.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
  • load average: 0.18, 0.26, 0.32: [系统负载,即任务队列的平均长度], 分别是 1分钟,5分钟,15分钟时间内的平均的队列长队,该长度反应了系统负载的变化情况。

对于系统CPU 数量为1 的系统, load average=1 代表了系统在全力工作,小于0.7认为是安全的, 大于5说明系统已经不堪重负了。 内核每5s中更新 load average 值。 获取load average 的方法有 w, top, uptime 以及 cat /proc/loadavg 获取。 如果一个进程满足以下条件则其就会位于运行队列中,它没有在等待I/O操作的结果, 它没有主动进入等待状态(也就是没有调用’wait’)没有被停止(例如:等待终止)

  • Cpu(s):
    1. 3.9%us [用户空间占用CPU百分比]
    2. 0.6%sy [内核空间占用CPU百分比]
    3. 0.0%ni [用户进程空间内改变过优先级的进程占用CPU百分比] nice 的进程百分比
    4. 95.4%id [空闲CPU百分比]
    5. 0.0%wa [等待输入输出的CPU时间百分比]
    6. 0.0%hi [系统花在处理hardware interrupt的时间百分比]
    7. 0.1%si [系统花在处理softare interrupt的时间百分比]
    8. 0.0%st [虚拟化管理程序,xen/kvm 等]
KiB Mem : 39431625+total,   505616 free, 35967712+used, 34133516 buff/cache
KiB Swap:        0 total,        0 free,        0 used. 26684268 avail Mem
  • Mem: 4147888k total[物理内存总量]
  • 2493092k used[使用的物理内存总量]
  • 1654796k free[空闲内存总量]
  • 158188k buffers[用作内核缓存的内存量]
  • Swap: 5144568k total[交换区总量]
  • 56k used[使用的交换区总量]
  • 5144512k free[空闲交换区总量]
  • 2013180k cached[缓冲的交换区总量]

进程详细信息,每列含义:

序号 列名 含义
a PID 进程id
b PPID 父进程id
c RUSER Real user name
d UID 进程所有者的用户id
e USER 进程所有者的用户名
f GROUP 进程所有者的组名
g TTY 启动进程的终端名。不是从终端启动的进程则显示为 ?
h PR 优先级
i NI nice值。负值表示高优先级,正值表示低优先级
j P 最后使用的CPU,仅在多CPU环境下有意义
k %CPU 上次更新到现在的CPU时间占用百分比
l TIME 进程使用的CPU时间总计,单位秒
m TIME+ 进程使用的CPU时间总计,单位1/100秒
n %MEM 进程使用的物理内存百分比
o VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
p SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。
q RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
r CODE 可执行代码占用的物理内存大小,单位kb
s DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
t SHR 共享内存大小,单位kb
u nFLT 页面错误次数
v nDRT 最后一次写入到现在,被修改过的页面数。
w S 进程状态(D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程)
x COMMAND 命令名/命令行
y WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名
z Flags 任务标志,参考 sched.h

mpstat

查看多 cpu 的统计信息 Report processors related statistics

mpstat [-P {|ALL}] [internal [count]]
mpstat -P 0 1 1
Linux 3.10.0-693_21.tl2 (kvm_9_16_45_154) 	03/29/19 	_x86_64_	(80 CPU)

18:39:42     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
  • %user 在internal时间段里,用户态的CPU时间(%),不包含nice值为负进程 (usr/total)*100
  • %nice 在internal时间段里,nice值为负进程的CPU时间(%) (nice/total)*100
  • %sys 在internal时间段里,内核时间(%) (system/total)*100
  • %iowait 在internal时间段里,硬盘IO等待时间(%) (iowait/total)*100
  • %irq 在internal时间段里,硬中断时间(%) (irq/total)*100
  • %soft 在internal时间段里,软中断时间(%) (softirq/total)*100
  • %idle 在internal时间段里,CPU除去等待磁盘IO操作外的因为任何原因而空闲的时间闲置时间(%) (idle/total)*100

sar –P

参考linux 工具 - sar

sar是System Activity Reporter(系统活动情况报告), sar是目前Linux上最为全面的系统性能分析工具之一,可以从14个大方面对系统的活动进行报告。 生成文件。

# 查看cpu 1, 没间隔1秒获取一次数据,共执行一次
sar -P 1 1 1
Linux 3.10.0-693_21.tl2 (kvm_9_16_45_154) 	03/29/19 	_x86_64_	(80 CPU)

18:53:53        CPU     %user     %nice   %system   %iowait    %steal     %idle
18:53:54          1      0.00      0.00      0.00      0.00      0.00    100.00
Average:          1      0.00      0.00      0.00      0.00      0.00    100.00

sar –u 查看是否有cpu 瓶颈

perf

Perf 是用来进行软件性能分析的工具。

对于性能调优而言,需要尽可能地压榨硬件的资源利用率。比如说 Cache, CPU 流水线等功能。

对于CPU而言,不同的指令需要的处理步骤和时钟周期不同。

  • 流水线:多级流水线
  • superscalar:允许一个时钟周期发射多条指令
  • 分支预测技术
  1. perf top: 用于系统层面的调优,可以查看系统当前使用最多的系统调用。
  2. perf stat: 用于具体某个程序,提供针对该程序运行情况的汇总。

pidstat

顾名思义,用于统计进程数据,可以针对CPU,内存,IO等

# 进程27254,报错其所有子进程等每间隔1s,采样cpu使用情况,持续10次
pidstat -p 27254 -T ALL -u 1 10

uptime

系统启动时间报告,如果怀疑系统负载升高,首先要查看的就是uptime命令的输出。 观察 load average 字段的输出。

w

查看登录用户,(who的缩写)。

ps

  • ps -ef: System V Style
  • ps -aux: Unix Style

/proc/cpuinfo

cpuinfo 这个文件中包含了cpu的全部信息。

processor	: 23
vendor_id	: GenuineIntel
cpu family	: 6
model		: 63
model name	: Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz
stepping	: 2
microcode	: 0x31
cpu MHz		: 2401.000
cache size	: 15360 KB
physical id	: 1
siblings	: 12
core id		: 5
cpu cores	: 6
apicid		: 27
initial apicid	: 27
fpu		: yes
fpu_exception	: yes
cpuid level	: 15
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm epb tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm xsaveopt cqm_llc cqm_occup_llc dtherm ida arat pln pts
bogomips	: 4790.14
clflush size	: 64
cache_alignment	: 64
address sizes	: 46 bits physical, 48 bits virtual
power management:

可以重点观察一下下面几个:

  1. model name : Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz
  2. flags: 该cpu 包含了哪些特性。 比如说avx2 (avx_512), 每款CPU硬件层面可能支持哪些flag,有可能在bios 层面没有打开,还有可能是在内核层面,该cpu的某些特性没用支持或者打开。
  3. cpu MHz : 2401.000 , CPU 性能的充分条件,不是必要条件
  4. bogomips: 这个值,在linux 内核启动的时候,会去做busy-loop计算,是一个伪的mips值。代表了该host的计算能力。(这里考虑 流水线数量,是否支持超标量,乱序执行等), 常用以下短语及时 the number of million times per second a processor can do absolutely nothing
CPU bogomips 含义
Intel 8088 clock × 0.004 时钟数 * 0.004
Intel Xeon MP (32-bit) (hyper-threading) clock × 3.97 时钟数 * 3.97

附录

Linux 进程的各种状态

活动进程:处于TASK_RUNNING和TASK_UNINTERRUPTIBLE状态的进程。

进程的状态有以下7种。

  • TASK_RUNNING

    进程处于运行(它是系统的当前进程)或者准备运行状态(它在等待系统将CPU分配给它)

  • TASK_INTERRUPTIBLE

    等待某个条件:中断、信号或能唤醒进程的资源

  • TASK_UNINTERRUPTIBLE

    处于睡眠状态,信号无法唤醒它。

  • TASK_STOPPED

    进程停止,当进程收到SIGSTOP、SIGTSTP、SIGTTIN或SIGTTOU信号时就会进入次状态

  • TASK_TRACED

    进程执行被调试器停止(调试程序使用ptrace()系统调用来监控程序)

  • EXIT_ZOMBIE

    进程执行停止,但父进程还没调用wait4()或waitpid()来获取该进程返回信息。

  • EXIT_DEAD

    进程的最终状态,父进程调用wait4()或waitpid()来获取该进程返回信息,内核即将移除该进程。

孤儿进程&僵尸进程&守护进程

没有父进程的进程就是孤儿进程,孤儿进程会被init领养,成为一个准守护进程。如果进程他爹活着,但是不给子进程收尸(wait、waitpid),子进程就会变成僵尸(zombie)。守护进程(Daemon)是在一类脱离终端在后台执行的程序, 通常以 d 结尾, 随系统启动, 其父进程 (ppid) 通常是 init 进程。

  • 一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程所收养,并由init进程对它们完成状态收集工作。
  • 一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构


blog comments powered by Disqus