top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,监控linux的系统状况,类似于Windows的任务管理器。
前五行是系统整体的统计信息。
第一行是任务队列信息,同 uptime 命令的执行结果。
第二、三行为进程和CPU的信息。当有多个CPU时,这些内容可能会超过两行。
最后两行为内存信息。具体内容如下:
在numa架构下,top后按3即可查看相应的numa上的cpu信息。意义如下:
us: is meaning of "user CPU time" 用户空间占用CPU百分比
sy: is meaning of "system CPU time" 内核空间占用CPU百分比
ni: is meaning of" nice CPU time" 用户进程空间内改变过优先级的进程占用CPU百分比
id: is meaning of "idle" 空闲CPU百分比
wa: is meaning of "iowait" 等待输入输出的CPU时间百分比
hi:is meaning of "hardware irq" 硬件中断
si : is meaning of "software irq" 软件中断
st : is meaning of "steal time" 是当 hypervisor 服务另一个虚拟处理器时,虚拟 CPU 等待实际 CPU 的时间的百分比
统计信息下方类似表格区域显示的是各个进程的详细信息,默认5秒刷新一次。在top命令中按f按可以查看显示的列信息,按对应字母来开启/关闭列,大写字母表示开启,小写字母表示关闭。带*号的是默认列。
A: PID = (Process Id) 进程Id;
E: USER = (User Name) 进程所有者的用户名;
H: PR = (Priority) 优先级
I: NI = (Nice value) nice值。负值表示高优先级,正值表示低优先级
O: VIRT = (Virtual Image (kb)) 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
Q: RES = (Resident size (kb)) 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
T: SHR = (Shared Mem size (kb)) 共享内存大小,单位kb
W: S = (Process Status) 进程状态。D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程
K: %CPU = (CPU usage) 上次更新到现在的CPU时间占用百分比
N: %MEM = (Memory usage (RES)) 进程使用的物理内存百分比
M: TIME+ = (CPU Time, hundredths) 进程使用的CPU时间总计,单位1/100秒
b: PPID = (Parent Process Pid) 父进程Id
c: RUSER = (Real user name)
d: UID = (User Id) 进程所有者的用户id
f: GROUP = (Group Name) 进程所有者的组名
g: TTY = (Controlling Tty) 启动进程的终端名。不是从终端启动的进程则显示为 ?
j: P = (Last used cpu (SMP)) 最后使用的CPU,仅在多CPU环境下有意义
p: SWAP = (Swapped size (kb)) 进程使用的虚拟内存中,被换出的大小,单位kb
l: TIME = (CPU Time) 进程使用的CPU时间总计,单位秒
r: CODE = (Code size (kb)) 可执行代码占用的物理内存大小,单位kb
s: DATA = (Data+Stack size (kb)) 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
u: nFLT = (Page Fault count) 页面错误次数
v: nDRT = (Dirty Pages count) 最后一次写入到现在,被修改过的页面数
y: WCHAN = (Sleeping in Function) 若该进程在睡眠,则显示睡眠中的系统函数名
z: Flags = (Task Flags ) 任务标志,参考 sched.h
X: COMMAND = (Command name/line) 命令名/命令行
top -H -p PID
当我们需要排查cpu利用率过高的原因时,也可以用perf命令
// 查看某个进程各函数占用
perf top -p PID
//使用下列命令可以看到函数的调用栈
perf record -ga sleep 5
perf report --no-children --sort=symbol
第一项敲回车打开调用栈
perf stat -e L1-dcache-load-misses ./a.out
# ps -ef 显示所有进程
# ps -eo comm,pcpu //显示所有命令占用的cpu的大小
e显示所有进程,o指定命令的名字
# ps -eo comm,pmem //显示所有命令占用的mem的大小
# ps -eo 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' //显示内存占用等信息
ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
smmsp 3521 0.0 0.7 6556 1616 ? Ss 20:40 0:00 sendmail: Queue runner@01:00:00 f
root 3532 0.0 0.2 2428 452 ? Ss 20:40 0:00 gpm -m /dev/input/mice -t imps2
dbus 3655 0.0 0.5 13840 1084 ? Ssl 20:41 0:00 dbus-daemon-1 --system
....................................
解释如下:
VSZ–进程的虚拟大小
RSS–驻留集的大小,可以理解为当前实际占用的物理内存(kb)
TTY–控制终端的ID
STAT–当前进程的状态
STRAT–该进程启动的时间
TIME–进程已经消耗的CPU时间,注意是消耗CPU的时间
COMMOND–命令的名称和参数
STAT中的参数意义如下:
D 不可中断 Uninterruptible(usually IO)
R 正在运行,或在队列中的进程
S 处于休眠状态
T 停止或被追踪
Z 僵尸进程
W 进入内存交换(从内核2.6开始无效)
X 死掉的进程
< 高优先级
N 低优先级
L 有些页被锁进内存
s 包含子进程
+ 位于后台的进程组
l 多线程,克隆线程
查看可用物理内存:
free -g
或
cat /proc/meminfo
ps -p PID -o lstart