pstree命令以树的形式显示进程信息,默认树的分支是收拢的,也不显示pid,要显示这些信息需要指定对应的选项。
一般用法:pstree -a -h -p
选项 | 说明 |
---|---|
-a | 显示进程的命令行 |
-c | 展开分支 |
-h | 高亮当前正在运行的进程及其父进程 |
-p | 显示进程 pid,此选项也将展开分支 |
-l | 允许显示长格式进程。默认在结果中超过132个字符时将截断后面的字符 |
查看当前这一刻的进程信息,注意查看的是静态进程信息,要查看随时刷新的动态进程信息(如windows的进程管理器那样,每秒刷新一次),使用top或htop命令。
ps 支持三种类型的选项:GNU、BSD、UNIX。不同类型的选项其展示的信息格式不一样。有些加了"-"的是SysV风格 的选项,不加"-"的是BSD选项,加不加"-"它们的意义是不一样的,例如ps aux 和ps -aux是不同的。
ps aux
对于 BSD 风格的选项只需知道 ps aux 就够了。“a”表示列出依赖于终端的所有进程,“x”表示列出不依赖于终端的进程,“u”表示展现的进程信息以用户为导向的。ps aux 不显示 ppid
ps -elf
"-e"表示输出全部进程信息,"-f"全格式输出,"-l"长格式输出
在ps后加上grep筛选目标进程时,总会发现grep自身进程也被显示出来。通过管道将ps结果传递给grep时,管道协调了ps和grep两进程间通信,但管道的本质是进程间数据传递。管道左边的输出数据放入内存,由管道右边的进程读取。假如划分的内存不足以完全存放输出数据,则管道左边的进程将一直等待,直到管道右边取出内存中一部分的数据以让管道左边的进程继续输出,而管道右边的进程在管道左边的进程启动后也立刻启动了,但是它一直处于等待状态,等待接收管道传递来的数据(就像是平时执行命令时不给输入文件将会一直等待输入一样)。也就是说,管道左右两端的进程是同时被创建的(不考虑父进程创建进程消耗的那点时间),但数据传输是有先后顺序的,左边先传,右边后收,所以可能会造成交叉的情况,左边还没执行完,就捕获到了右边的进程信息。在此处体现在ps还没有统计完进程信息时,grep进程就已经被ps抓到了。
要将grep自身进程排除在结果之外,方法有二:
[root@docker ~]# ps aux | grep "crond" | grep -v "grep" # 使用-v将grep自己筛选掉
root 1425 0.0 0.1 117332 1276 ? Ss Jun10 0:00 crond
[root@docker ~]# ps aux | grep "cron[d]"
root 1425 0.0 0.1 117332 1276 ? Ss Jun10 0:00 crond
第二种方法能成功是因为grep进程被ps捕获时的结果是"grep crond",而使用crond匹配时,它将只能匹配crond,所以"grep crond"被筛选掉了。其实加上其他字符将更容易理解。
[root@docker ~]# ps aux | grep "cron[dabc]"
root 1425 0.0 0.1 117332 1276 ? Ss Jun10 0:00 crond
显示当前时间,已开机运行多少时间,当前有多少个用户已登录系统,以及3个平均负载值
负载率(load),即特定时间长度内,cpu运行队列中的平均进程数(包括线程),一般平均每分钟每核的进程数小于3都认为正常,大于5时负载已经非常高。在UNIX系统中,运行队列包括cpu正在执行的进程和等待cpu的进程(即所谓的可运行runable)。在Linux系统中,还包括不可中断睡眠态(IO等待)的进程。运行队列中每出现一个进程,load就加1,进程每退出运行队列,Load就减1。如果是多核cpu,则还要除以核数。
详细信息见man uptime和https://en.wikipedia.org/wiki/Load_(computing)(https://en.wikipedia.org/wiki/Load_(computing%29)
例如,单核cpu上的负载值为"1.73 0.60 7.98"时,表示:
最近1分钟:1.73表示平均可运行的进程数,这一分钟要一直不断地执行这1.73个进程。0.73个进程等待该核cpu。
最近5分钟:平均进程数还不足1,表示该核cpu在过去5分钟空闲了40%的时间。
最近15分钟:7.98表示平均可运行的进程数,这15分钟要一直不断地执行这7.98个进程。
结合前5分钟的结果,说明前15-前10分钟时间间隔内,该核cpu的负载非常高。
如果是多核cpu,则还要将结果除以核数。例如4核时,某个最近一分钟的负载值为3.73,则意味着有3.73个进程在运行队列中,这些进程可被调度至4核中的任何一个核上运行。最近1分钟的负载值为1.6,表示这一分钟内每核cpu都空闲(1-1.6/4)=60%的时间。
所以,load的理想值是正好等于CPU的核数,小于核数的时候表示cpu有空闲,超出核数的时候表示有进程在等待cpu,即系统资源不足。
top命令查看动态进程状态,默认每5秒刷新一次
选项 | 说明 |
---|---|
-d | 指定 top 刷新的时间间隔,默认是5秒 |
-b | 批处理模式,每次刷新分批显示 |
-n | 指定 top 刷新几次就退出,可以配合-b使用 |
-p | 指定监控的 pid,指定方式为-pN1 -pN2或-pN1,N2 |
-u | 指定要监控的用户的进程,可以是 UID 也可以是user name |
在top动态模式下,按下各种键可以进行不同操作。使用"h"或"?"可以查看相关键的说明。
htop 是 top 的升级款,htop可以使用鼠标完成点击选中。其他使用方法和top类似,使用h查看各按键意义即可。
iftop用于动态显示网络接口的数据流量。用法也很简单,按下h键即可获取帮助。
vmstat的第一次统计是自开机起的平均值信息,从第二次开始的统计才是指定刷新时间间隔内的资源利用信息,若不指定刷新时间间隔,则默认只显示一次统计信息。
一般用法:
vmstat [-d] [delay [ count]]
vmstat [-f]
选项:
选项 | 说明 |
---|---|
-f | 统计自开机起 fork 的次数,包括 fork、clone、vfork 的次数,但不包括 exec 次数 |
-d | 显示磁盘统计信息 |
delay | 刷新时间间隔,若不指定,则只统计一次信息就退出 vmstat |
count | 总共要统计的次数 |
例:只统计一次信息
iostat主要统计磁盘或分区的整体使用情况。也可以输出cpu信息,甚至是NFS网络文件系统的信息。同vmstat/sar一样,第一次统计的都是自系统开机起的平均统计信息。
一般用法:iostat -c -n -h [ -p device ] [ interval count ]
选项 | 说明 |
---|---|
-c | 统计 cpu 信息 |
-d | 统计磁盘信息 |
-n | 统计 NFS 文件系统信息 |
-h | 使 nfs 统计信息更加人类可读化 |
-k | 指定以 kb/s 为单位显示 |
-m | 指定以 mb/s 为单位显示 |
-p | 指定要统计的设备名称 |
-y | 指定不显示第一次统计信息,即不显示自开机起统计信息 |
interval | 刷新时间间隔 |
count | 总统计次数 |
例如:
sar是一个非常强大的性能分析工具,它可以获取系统的cpu/等待队列/磁盘IO/内存/网络等性能指标。
sar [options] [-o filename] [delay [count] ]
选项 | 说明 |
---|---|
-A | 显示系统所有资源运行状况 |
-b | 显示磁盘 IO 和 transfer 速率信息,和 iostat 的信息一样,是总体 IO 统计信息 |
-d | 显示磁盘在刷新时间间隔内的活跃情况,可以指定一个或多个设备, 和-b 不同的是,它显示的单设备的 IO、transfer 信息 建议配合-p使用显示友好的设备名,否则默认显示带主次设备号的设备名 |
-P | 显示指定的某颗或几颗 cpu 的使用情况。 -P 0,1,2,3或ALL。 |
-u | 显示每颗cpu整体平均使用情况。 |
-r | 显示内存在刷新时间间隔内的使用情况 |
-n | 显示网络运行状态。 后可接DEV/NFS/NFSD/ALL等多种参数 DEV:显示网络接口信息 NFS和 NFSD:NFS 客户端和服务端的流量信息 ALL:显示所有信息 |
-q | 显示等待队列大小。 |
-o filename | 将结果存入文件 |
delay | 状态刷新时间间隔 |
count | 总共刷新几次 |
我们真正需要关注的是最后的average部分的idle值,idle越小,说明cpu处于空闲时间越少,该颗或整体cpu使用率就越高。
或者直接对整体进行统计。如下:
其中kbdirty表示内存中脏页的大小,即内存中还有多少应该刷新到磁盘的数据。
或者通过查看/proc/net/dev 文件
关注列:receive和transmit分别表示收包和发包,关注每个网卡的bytes即可获得网卡的情况。写一个脚本计算每秒的差值即为网络流量。
free用于查看内存使用情况。CentOS 6和CentOS 7上显示格式不太一样。
选项 | 说明 |
---|---|
-h | 人类可读方式显示单位 |
-m | 以 MB 显示单位 |
-w | 将 buffers 和 cache 分开单独显示。Centos 7 only |
-s | 动态查看内存信息时的刷新时间间隔 |
-c | 一共要刷新多少次退出 free |
free -hm
total used free shared buff/cache available
Mem: 991M 100M 154M 6.7M 735M 677M
Swap: 819M 8K 819M
Mem和Swap分别表示物理内存和交换分区的使用情况。
所以available才是真正需要关注的可使用内存空间量。
使用-w可以将buffers/cache分开显示
free -w -m
total used free shared buffers cache available
Mem: 991 100 154 6 0 735 678
Swap: 819 0 819
动态统计内存信息,例如每秒统计一次,统计2次
free -w -m -s 1 -c 2
total used free shared buffers cache available
Mem: 991 100 154 6 0 735 678
Swap: 819 0 819
total used free shared buffers cache available
Mem: 991 100 154 6 0 735 678
Swap: 819 0 819
以下是CentOS 6上的free结果。
[root@docker ~]# free -m
total used free shared buffers cached
Mem: 980 415 565 0 53 239
-/+ buffers/cache: 121 859
Swap: 1999 0 1999
在此结果中,"-/+ buffers/cache"的free列才是真正可用的内存空间了,即CentOS 7上的available列。
一般来说,内存可用量的范围低于20%应该要引起注意了。
上图中,系统负载非常之高,最近一分钟的负载量高达383.19,这表示这一分钟有383.19个进程正在运行或等待调度,如果是单核CPU,表示这一分钟要毫不停留地执行这么多进程,如果是8核CPU,表示这一分钟内平均每核心CPU要执行大概50个进程。
从load average上看,确实是非常繁忙的场景。但是看CPU的idle值为98.8,说明CPU非常闲。为什么系统负载如此高,CPU却如此闲?
前面解释system load average的时候,已经说明过可运行的(就绪态,即就绪队列的长度)、正在运行的(运行态)和不可中断睡眠(如IO等待)的进程任务都会计算到负载中。现在负载高、CPU空闲,说明当前正在执行的任务基本不消耗CPU资源,大量的负载进程都在IO等待中。
可以从ps的进程状态中获取哪些进程是正在运行或运行队列中的(状态为R),哪些进程是在不可中断睡眠中的(状态为D)。
[root@docker]# ps -eTo stat,pid,ppid,comm --no-header |grep -E "^(D|R)"
R+ 11864 9624 ps
在Linux中查看各种状态,其实质是查看内核中相关进程的数据结构中的项,通过工具将其格式化后输出出来。但是内核的数据是绝对不能随意查看或更改的,至少不能直接去修改。所以,在linux上出现了伪文件系统/proc,它是内核中各属性或状态向外提供访问和修改的接口。
在/proc下,记录了内核自己的数据信息,各进程独立的数据信息,统计信息等。绝大多数文件都是只读不可改的,即使对root也一样,但/proc/sys除外,为何如此稍后解释。
其中数字命名的目录对应的是各进程的pid号,其内的文件记录的都是该进程当前的数据信息,且都是只读的,例如记录命令信息的cmdline文件,进程使用哪颗cpu信息cpuset,进程占用内存的信息mem文件,进程IO信息io文件等其他各种信息文件。
查看CPU的信息:/proc/cpuinfo
查看内存的信息:/proc/meminfo | free -hm | htop
查看硬盘容量:df -h
非数字命名的目录各有用途,例如bus表示总线信息,driver表示驱动信息,fs表示文件系统特殊信息,net表示网络信息,tty表示跟物理终端有关的信息,最特殊的两个是/proc/self和/proc/sys。
/proc/self
它表示的是当前正在访问/proc目录的进程,因为/proc目录是内核数据向外记录的接口,所以当前访问/proc目录的进程表示的就是当前cpu正在执行的进程。如果执行cat /proc/self/cmdline,会发现其结果总是该命令本身,因为cat是手动敲入的命令,它是重要性进程,cpu会立即执行该命令。
/proc/sys
该目录是为管理员提供用来修改内核运行参数的,所以该目录中的文件对root都是可写的,例如管理数据包转发功能的/proc/sys/net/ipv4/ip_forward文件。使用sysctl命令修改内核运行参数,其本质也是修改/proc/sys目录中的文件。
参考链接:http://www.cnblogs.com/f-ck-need-u/p/7059074.html
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有