进程、线程状态查看命令:top、strace、pstack

top

top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。

 

语法:

top [-] [d] [q] [c] [S] [s] [i] [n] [b]

参数说明:

d : 改变显示的更新速度,或是在交谈式指令列( interactive command)按 s

q : 没有任何延迟的显示速度,如果使用者是有 superuser 的权限,则 top 将会以最高的优先序执行

c : 切换显示模式,共有两种模式,一是只显示执行档的名称,另一种是显示完整的路径与名称

S : 累积模式,会将己完成或消失的子行程 ( dead child process ) 的 CPU time 累积起来

s : 安全模式,将交谈式指令取消, 避免潜在的危机

i : 不显示任何闲置 (idle) 或无用 (zombie) 的行程

n : 更新的次数,完成后将会退出 top

b : 批次档模式,搭配 "n" 参数一起使用,可以用来将 top 的结果输出到档案内

 

 

调用效果:

参数含义:

统计信息区前五行是系统整体的统计信息。

第一行任务队列信息,同 uptime 命令的执行结果。其内容如下:

01:06:48    当前时间

up 1:22    系统运行时间,格式为时:分

1 user    当前登录用户数

load average: 0.06, 0.60, 0.48    系统负载,即任务队列的平均长度。三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。

二、三行进程和CPU信息。当有多个CPU时,这些内容可能会超过两行。内容如下:

total 进程总数

running 正在运行的进程数

sleeping 睡眠的进程数

stopped 停止的进程数

zombie 僵尸进程数

Cpu(s):

0.0%us【user space】— 用户空间占用CPU的百分比。

0.3%sy【sysctl】— 内核空间占用CPU的百分比。

0.0%ni【】— 改变过优先级的进程占用CPU的百分比

99.7%id【idolt】— 空闲CPU百分比

0.0%wa【wait】— IO等待占用CPU的百分比

0.0%hi【Hardware IRQ】— 硬中断占用CPU的百分比

0.0%si【Software Interrupts】— 软中断占用CPU的百分比

0.0%st:虚拟机占用百分比

 

 

最后两行内存信息。内容如下:

Mem:

191272k total    物理内存总量

173656k used    使用的物理内存总量

17616k free    空闲内存总量

22052k buffers    用作内核缓存的内存量

Swap:

192772k total    交换区总量

0k used    使用的交换区总量

192772k free    空闲交换区总量

123988k cached    缓冲的交换区总量,内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖,该数值即为这些内容已存在于内存中的交换区的大小,相应的内存再次被换出时可不必再对交换区写入。

 

备注:

可用内存=free + buffer + cached

对于内存监控,在top里我们要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。

第四行中使用中的内存总量(used)指的是现在系统内核控制的内存数,

第四行中空闲内存总量(free)是内核还未纳入其管控范围的数量。

纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少,但不用为此担心。

 

进程信息区统计区的下方显示了各个进程的详细信息。首先来认识一下各列的含义。

序号  列名    含义

a    PID     进程id

e    USER    进程所有者的用户名

h    PR      优先级

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

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

m    TIME+   进程使用的CPU时间总计,单位1/100秒

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

o    VIRT    进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES

q    RES     进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA

t    SHR     共享内存大小,单位kb

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

x    COMMAND 命令名/命令行

详解:

VIRT:virtual memory usage 虚拟内存

1、进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等

2、假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量

RES:resident memory usage 常驻内存

1、进程当前使用的内存大小,但不包括swap out

2、包含其他进程的共享

3、如果申请100m的内存,实际使用10m,它只增长10m,与VIRT相反

4、关于库占用内存的情况,它只统计加载的库文件所占内存大小

SHR:shared memory 共享内存

1、除了自身进程的共享内存,也包括其他进程的共享内存

2、虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小

3、计算某个进程所占的物理内存大小公式:RES – SHR

4、swap out后,它将会降下来

DATA

1、数据占用的内存。如果top没有显示,按f键可以显示出来。

2、真正的该程序要求的数据空间,是真正在运行中要使用的。

 

默认情况下仅显示比较重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。可以通过下面的快捷键来更改显示内容。

更改显示内容通过 f 键可以选择显示的内容。按 f 键之后会显示列的列表,按 a-z 即可显示或隐藏对应的列,最后按回车键确定。

按 o 键可以改变列的显示顺序。按小写的 a-z 可以将相应的列向右移动,而大写的 A-Z 可以将相应的列向左移动。最后按回车键确定。

按大写的 F 或 O 键,然后按 a-z 可以将进程按照相应的列进行排序。而大写的 R 键可以将当前的排序倒转。

 

b    PPID    父进程id

c    RUSER   Real user name

d    UID     进程所有者的用户id

f    GROUP   进程所有者的组名

g    TTY     启动进程的终端名。不是从终端启动的进程则显示为 ?

j    P       最后使用的CPU,仅在多CPU环境下有意义

l    TIME    进程使用的CPU时间总计,单位秒

p    SWAP    进程使用的虚拟内存中,被换出的大小,单位kb。

r    CODE    可执行代码占用的物理内存大小,单位kb

s    DATA    可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb

u    nFLT    页面错误次数

v    nDRT    最后一次写入到现在,被修改过的页面数。

y    WCHAN   若该进程在睡眠,则显示睡眠中的系统函数名

z    Flags   任务标志,参考 sched.h

 

 

其他实用命令

下面介绍在top命令执行过程中可以使用的一些交互命令。从使用角度来看,熟练的掌握这些命令比掌握选项还重要一些。这些命令都是单字母的,如果在命令行选项中使用了s选项,则可能其中一些命令会被屏蔽掉。

 

Ctrl+L 擦除并且重写屏幕。

h或者? 显示帮助画面,给出一些简短的命令总结说明。

k 终止一个进程。系统将提示用户输入需要终止的进程PID,以及需要发送给该进程什么样的信号。一般的终止进程可以使用15信号;如果不能正常结束那就使用信号9强制结束该进程。默认值是信号15。在安全模式中此命令被屏蔽。

i 忽略闲置和僵死进程。这是一个开关式命令。

q 退出程序

r 重新安排一个进程的优先级别。系统提示用户输入需要改变的进程PID以及需要设置的进程优先级值。输入一个正值将使优先级降低,反之则可以使该进程拥有更高的优先权。默认值是10。

S 切换到累计模式。

s 改变两次刷新之间的延迟时间。系统将提示用户输入新的时间,单位为s。如果有小数,就换算成m s。输入0值则系统将不断刷新,默认值是5 s。需要注意的是如果设置太小的时间,很可能会引起不断刷新,从而根本来不及看清显示的情况,而且系统负载也会大大增加。

f或者F 从当前显示中添加或者删除项目

o或者O 改变显示项目的顺序。

l 切换显示平均负载和启动时间信息。

m 切换显示内存信息。

t 切换显示进程和CPU状态信息。

c 切换显示命令名称和完整命令行。

M 根据驻留内存大小进行排序

P 根据CPU使用百分比大小进行排序

T 根据时间/累计时间进行排序

W 将当前设置写入~/.toprc文件中。这是写top配置文件的推荐方法

 

常用操作:

top   //每隔5秒显式所有进程的资源占用情况

top -d 2  //每隔2秒显式所有进程的资源占用情况

top -c  //每隔5秒显式进程的资源占用情况,并显示进程的命令行参数(默认只有进程名)

top -p 12345 -p 6789//每隔5秒显示pid是12345和pid是6789的两个进程的资源占用情况

top -d 2 -c -p 123456 //每隔2秒显示pid是12345的进程的资源使用情况,并显式该进程启动的命令行参数

 

拓展:

查看多核CPU命令

  1. mpstat -P ALL
  2. sar -P ALL

说明:sar -P ALL > aaa.txt   重定向输出内容到文件 aaa.txt

  1. top  命令,然后按数字“1”可监控每个逻辑CPU的状况:

 

Linux查看物理CPU个数、核数、逻辑CPU个数

 

# 总核数 = 物理CPU个数 X 每颗物理CPU的核数

# 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数

 

# 查看物理CPU个数

cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l

 

# 查看每个物理CPU中core的个数(即核数)

cat /proc/cpuinfo| grep "cpu cores"| uniq

 

# 查看逻辑CPU的个数

cat /proc/cpuinfo| grep "processor"| wc -l

 

strace

strace是一个可用于诊断、调试和教学的Linux用户空间跟踪器。我们用它来监控用户空间进程和内核的交互,比如系统调用、信号传递、进程状态变更等

它可以跟踪系统调用的执行。最简单的方式,它可以从头到尾跟踪binary的执行,然后以一行文本输出系统调用的名字,参数和返回值。

 

​strace常用来跟踪进程执行时的系统调用和接收所接收的信号,在Linux中,进程不能直接访问硬件设备,当进程需要访问硬件设备的时候(如读取磁盘,接收网络数据的时候),必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。

 

Linux 操作系统有很多用来跟踪程序行为的工具,内核态的函数调用跟踪用「strace」,用户态的函数调用跟踪用「ltrace」

 

调用效果:

输出含义:

root@ubuntu:/usr# strace cat /dev/null

execve("/bin/cat", ["cat", "/dev/null"], [/* 22 vars */]) = 0

brk(0)                                  = 0xab1000

access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)

mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f29379a7000

access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)

...

brk(0) = 0xab1000

brk(0xad2000) = 0xad2000

fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0

open("/dev/null", O_RDONLY) = 3

fstat(3, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0

read(3, "", 32768) = 0

close(3) = 0

close(1) = 0

close(2) = 0

exit_group(0) = ?

 

每一行都是一条系统调用,等号左边是系统调用的函数名及其参数,右边是该调用的返回值。 strace 显示这些调用的参数并返回符号形式的值。

 

strace有两种运行模式。

一种是通过它启动要跟踪的进程。用法很简单,在原本的命令前加上strace即可。比如我们要跟踪 "ls -lh /var/log/messages" 这个命令的执行,可以这样:

strace ls -lh /var/log/messages

另外一种运行模式,是跟踪已经在运行的进程,在不中断进程执行的情况下,理解它在干嘛。 这种情况,给strace传递个-p pid 选项即可

 

通用的完整用法:

strace -o output.txt -T -tt -e trace=all -p 28979

上面的含义是 跟踪28979进程的所有系统调用(-e trace=all),并统计系统调用的花费时间,以及开始时间(并以可视化的时分秒格式显示),最后将记录结果存在output.txt文件里面。

 

pstack

pstack工具对指定PID的进程输出函数调用栈

pstack命令可显示每个进程的栈跟踪

 

这个命令在排查进程问题时非常有用,比如我们发现一个服务一直处于work状态(如假死状态,好似死循环),使用这个命令就能轻松定位问题所在;可以在一段时间内,多执行几次pstack,若发现代码栈总是停在同一个位置,那个位置就需要重点关注,很可能就是出问题的地方;

 

 

pstree以树结构显示进程

 

 

参考:

https://www.runoob.com/linux/linux-comm-top.html

https://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316399.html

https://www.cnblogs.com/niuben/p/12017242.html

 

https://www.cnblogs.com/youxin/p/8837771.html

https://www.cnblogs.com/machangwei-8/p/10388883.html

https://www.cnblogs.com/youxin/p/8837771.html

 

https://www.cnblogs.com/shenlinken/p/8157204.html

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值