top

top

使用top命令,可以查看到CPU利用率、CPU平均负载这两个指标。

# 指定查看用户,键入数字 1 查看单个 CPU 的负载,P/M/T 分别切换按照 CPU、内存、CPU 占用时间排序
$ top -u oracle

# Cpu(s): 87.3%us,  1.2%sy,  0.0%ni, 27.6%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
us: user cpu time (or) % CPU time spent in user space
sy: system cpu time (or) % CPU time spent in kernel space
ni: user nice cpu time (or) % CPU time spent on low priority processes
id: idle cpu time (or) % CPU time spent idle
wa: io wait cpu time (or) % CPU time spent in wait (on disk)
hi: hardware irq (or) % CPU time spent servicing/handling hardware interrupts
si: software irq (or) % CPU time spent servicing/handling software interrupts
st: steal time - - % CPU time in involuntary wait by virtual cpu while hypervisor is servicing another processor (or) % CPU time stolen from a virtual machine

# 表格列

# PID:进程的ID
# USER:进程所有者
# PR:进程的优先级别,越小越优先被执行
# NInice:值
# VIRT:进程占用的虚拟内存
# RES:进程占用的物理内存
# SHR:进程使用的共享内存
# S:进程的状态。S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值为负数
# %CPU:进程占用CPU的使用率
# %MEM:进程使用的物理内存和总内存的百分比
# TIME+:该进程启动后占用的总的CPU时间,即占用CPU使用时间的累加值。
# COMMAND:进程启动命令名称

第一行显示的内容:当前时间、系统运行时间以及正在登录用户数。load average后的三个数字,依次表示过去1分钟、5分钟、15分钟的平均负载(Load Average。平均负载是指单位时间内,系统处于可运行状态(正在使用CPU或者正在等待CPU的进程,R状态)和不可中断状态(D状态)的平均进程数,也就是平均活跃进程数,它和CPU使用率并没有直接关系。

第三行的内容表示CPU利用率,每一列的含义可以使用man查看。CPU使用率体现了单位时间内CPU使用情况的统计,以百分比的方式展示。计算方式为:CPU利用率= 1 -CPU空闲时间)/ CPU总的时间。需要注意的是,通过性能分析工具得到的CPU的利用率其实是某个采样时间内的CPU平均值。注:top工具显示的的CPU利用率是把所有CPU核的数值加起来的,即8CPU的利用率最大可以到达800%(可以用htop等更新一些的工具代替top

default

1处表示系统负载,它表示当前正在等待被cpu调度的进程数量,这个值小于系统vcpu(超线程数)的时候是比较正常的,一旦大于vcpu数,则说明并发运行的进程太多了,有进程迟迟得不到cpu时间。这种情况给用户的直观感受就是敲任何命令都卡。

2处表示当前系统的总进程数,通常该值过大的时候就会导致load average过大。

3处表示cpu的空闲时间,可以反应cpu的繁忙程度,该值较高时表示系统cpu处于比较清闲的状态,如果该值较低,则说明系统的cpu比较繁忙。需要注意的是,有些时候该值比较高,表示cpu比较清闲,但是load average依然比较高,这种情况很可能就是因为进程数太多,进程切换占用了大量的cpu时间,从而挤占了业务运行需要使用的cpu时间。

4处表示进程IO等待的时间,该值较高时表示系统的瓶颈可能出现在磁盘和网络。

5处表示系统的剩余内存,反应了系统的内存使用情况。

6处表示单个进程的cpu和内存使用情况。关于top命令中各个指标含义的进一步描述可以参见:

此外,我们也可以使用扩展 htop 或者 glances;如果针对容器监控,可以使用 ctop

➊ 在命令行输入top,然后shift+p查看占用CPU最高的进程,记下进程号 ➋ 在命令行输入top -Hp进程号,查看占用CPU最高的线程 ➌ 使用printf 0x%x线程号,得到其16进制线程号 ➍ 使用jstack进程号得到java执行栈,然后grep16进制找到相应的信息

ps -eo %cpu,pid |sort -n -k1 -r | head -n 1 | awk ‘{print $2}’ |xargs top -b -n1 -Hp | grep COMMAND -A1 | tail -n 1 | awk ‘{print $1}’ | xargs printf 0x%x

找到使用CPU最高的进程之使用CPU最高的线程的16进制号。

➊ 如果load超过了cpu核数,则负载过高 ➋ 如果wa过高,可初步判断IO有问题 ➌ sy,si,hi,st,任何一个超过5%,都有问题 ➍ 进程状态长时处于D、Z、T状态,提高注意度 ➎ cpu不均衡,判断亲和性和优先级问题 ➊ 如果load超过了cpu核数,则负载过高 ➋ 如果wa过高,可初步判断IO有问题 ➌ sy,si,hi,st,任何一个超过5%,都有问题 ➍ 进程状态长时处于D、Z、T状态,提高注意度 ➎ cpu不均衡,判断亲和性和优先级问题

除了关注类似top的一些指标,还有: ➊ b置于等待队列(等待资源、等待输入/输出)的内核线程数目。数字过大则cpu太忙。 ➋ cs如果频繁的进行上下文切换,则考虑是否是线程数开的过多 ➌ si/so显示了交换分区的现状,有时候会造成cpu问题,一并关注

htop

ctop

上一页
下一页