Linux top 详解

2018/02/09 linux top

一直都对服务性能这块的东西不怎么感冒,但是,有一次面试的时候,被问到了,突然发现自己对这些基础的知识点,好匮乏,正好今天在学python的psutil模块的时候,看到了cpu_times,顺便记录下关于top这个命令的内容;top这个命令其实很多人都会用,但是用的好的人却不多,甚至有人会对监控视图中的内容含义有不少曲解。

先来一份top命令的结果,后面会详细解读

top - 18:02:01 up  1:06,  1 user,  load average: 0.22, 0.12, 0.10
Tasks: 200 total,   2 running, 198 sleeping,   0 stopped,   0 zombie
%Cpu(s):  3.0 us,  1.0 sy,  0.0 ni, 96.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  4039816 total,  1270872 free,  1432504 used,  1336440 buff/cache
KiB Swap:   385836 total,   385836 free,        0 used.  2321064 avail Mem

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND   

第一行:

top - 18:02:01 up 1:06, 1 user, load average: 0.22, 0.12, 0.10


18:02:01 -- 当前系统时间

1:06 -- 系统已经运行了多长时间

1 user -- 当前有一个用户登录系统

load average: 0.22, 0.12, 0.10 -- load average后面的三个数分别是1分钟、5分钟、15分钟的负载情况

load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5就表明系统在超负荷运转了

第二行:

Tasks: 200 total, 2 running, 198 sleeping, 0 stopped, 0 zombie


200 total -- 系统现在一共有多少个进程

2 running -- 其中处于运行中的有几个

198 sleeping -- 处于休眠状态的有多少个

0 stopped -- 处于停止状态的有多少个

0 zombie -- 僵尸进程有多少个

第三行:

%Cpu(s): 3.0 us, 1.0 sy, 0.0 ni, 96.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st


3.0 us -- 用户空间占用CPU的百分比

1.0 sy -- 内核空间占用CPU的百分比

0.0 ni -- 用户进程空间内改变过优先级的进程占用CPU的百分比

96.0 id -- 空闲CPU百分比

0.0 wa -- IO等待占用CPU百分比

0.0 hi -- 硬中断(Hardware IRQ)占用CPU百分比

0.0 si -- 软中断(Software Interrupts)占用CPU百分比

0.0 st -- 虚拟机被hypervisor偷去的CPU时间

第四行:

KiB Mem : 4039816 total, 1270872 free, 1432504 used, 1336440 buff/cache


4039816 total -- 物理总内存

1270872 free -- 空闲内存总量

1432504 used -- 使用内存量

1336440 buff/cache -- 用作内核缓存的内存量

第五行:

KiB Swap: 385836 total, 385836 free, 0 used. 2321064 avail Mem


385836 total -- 交换区总量

385836 free -- 空闲的交换区总量

0 used -- 使用的交换区量

2321064 avail Mem -- 可用于进程下一次分配的物理内存数量

第七行:

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND


PID -- 进程ID

USER -- 进程所有者

PR -- 进程优先级

NI -- nice值。负值表示高优先级,正值表示低优先级

VIRT -- 进程使用的虚拟内存总量 VIRT = SWAP+RES

RES -- 进程使用的,未被换出的物理内存大小

SHR -- 共享内存大小

S -- 进程状态 R=运行,S=睡眠,T=跟踪/停止,Z=僵尸经常,D=不可中断的睡眠状态

%CPU -- 上次更新到现在的CPU时间占用百分比

%MEM -- 进程使用的物理内存百分比

TIME+ 进程使用的CPU时间总计

COMMAND - 进程名称(命令名/命令行)

交互的时候,使用P,以CPU百分比大小进行排序,使用M,以内存大小进行排序,使用T,以时间进行排序

最后记录下如何用python来计算top里面的各个利用率


top上的cpu利用率,大致算法如下

CPU总时间2=user2+system2+nice2+idle2+iowait2+irq2+softirq2

CPU总时间1=user1+system1+nice1+idle1+iowait1+irq1+softirq1

用户cpu利用率 = user_pass * 100% / (CPU总时间2 - CPU总时间1)

内核cpu利用率 = system_pass * 100% / (CPU总时间2 - CPU总时间1)

总的cpu利用率= 用户cpu利用率 + 内核cpu利用率
while True:
    cs1 = sum(psutil.cpu_times())
    cu1 = psutil.cpu_times().user
    time.sleep(3)
    cs2 = sum(psutil.cpu_times())
    cu2 = psutil.cpu_times().user
    ss = cs2 - cs1
    print(((cu2 - cu1) / ss) * 100)

Search

    Table of Contents