linux命令-top、ps、pstree、nice、free

2018-07-04 11:03:04

top 指令是用来实时监控进程。

-d	top刷新的间隔。默认是 5 秒;
-b	以批次的方式执行 top,还有更多的参数可以使用!通常会搭配数据流重导向来将批次的结果输出成为文件。
-n	与 -b 搭配,意思是需要进行几次 top 的输出结果。
-p	指定某些个 PID 来进行观察监测而已。

在 top 执行过程当中可以使用的按键指令:
?				显示在 top 当中可以输入的按键指令;
P				CPU 的使用资源排序显示;
M				Memory 的使用资源排序显示;
N				PID 来排序喔!
T				由该 Process 使用的 CPU 时间累积 ( TIME+) 排序。
k				给予某个 PID 一个讯号 ( signal)
r				给予某个 PID 重新制订一个 nice 值。
#top的2次刷新输出到文件
top -b -n 2 > top.txt

#只监控pid为1234的进程,并且2s刷新一次
top -d 2 -p 1234

下面对top的输出进行解释。

内存区显示的buff/cache相信是读者难以理解的地方,这里讲解下 buffer和cache的区别:

buffer 一般可以解释为输出缓冲区,当我们有数据要写入到磁盘或者是终端时,内核考虑到性能问题不会立马输出,而是等待一定数量之后才会输出,而这些没有及时刷新到磁盘或终端的数据会暂时存放在 buffer 内存缓冲区里,一旦系统崩溃或断电,这些数据会丢失。读者可以阅读这篇文章 linux文件io缓冲 进一步加深。

cache 就是从磁盘一次性读取过度的数据然后存起来方便以后使用。假设我们现在打开一个磁盘文件并读取100个字节数据,内核为了加速后续的读取速度,会一次性读取多于100字节的数据存在内存 cache里,那么后续的读取就可以直接从内存cache里拿。其他程序读取相同的数据也可以从cache读取而不必区磁盘读取,这样速度会快很多

系统负载 - 当有一个程序占用 cpu 为100%时,系统负载就是1,当2个进程同时占用cpu100%是系统负载就为2。

#uptime命令也可以显示top第一行的数据
[root@192 tmp]# uptime
 11:40:10 up  3:40,  3 users,  load average: 0.00, 0.01, 0.05
#当前时间 - 开机到现在的时间 - 登录到系统的用户数  --  1, 5, 15 分钟系统的平均负载
#如果负载为1代表1核为满负荷,假设系统为2核8线程,那么1只代表平均1个线程为满负荷(其他还有7个空闲,其实不繁忙)
#所以1只能说明接近于其中一颗cpu为满负载。
top - 18:06:40 up 5 days,  4:02,  1 user,  load average: 0.00, 0.01, 0.05

#进程数 - 运行数 - 休眠数 - 停止数 - 僵尸进程数
Tasks: 162 total,   1 running, 161 sleeping,   0 stopped,   0 zombie

#us-用户cpu,sy-内核cpu,用户进程空间内改变过优先级的进程占用CPU百分比
#wa-- io等待的cpu   hi--硬中断	si--软中断	st-- Steal Time(与其他虚拟机竞争cpu)
%Cpu(s):  1.9 us,  0.0 sy,  0.0 ni, 98.1 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

#内存
KiB Mem :  8173152 total,  2181832 free,   483748 used,  5507572 buff/cache

#swap交换空间
KiB Swap:  8257532 total,  8257532 free,        0 used.  7345212 avail Mem


PID 	USER      	PR  	NI    	VIRT    	RES    		SHR 	S  	%CPU 	%MEM     TIME+ COMMAND                                                        
31488 	root      	20   	0 	1006208 	100152    	388 	S   	1.0 	10.0   	0:00.14 a.out                                                          
1493 	mysql     	20   	0  	766608   	3880      	0 	S   	0.0  	0.4   	0:43.49 mysqld

PR	cpu priority(进程优先级默认20,0-39)
NI	nice(-20-19)
VIRT    虚拟内存占用KB(包含swap) (如malloc(1000000)bytes, 则VIRT接近1000K,RES接近与0
RES	实际用了的物理内存(不包含被swap的内存),比如malloc(1000000)之后,把很多数据复制到次内存中RES才会上升
SHR	共享内存KB
S	进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU	上次更新到现在的CPU时间占用百分比
%MEM	进程使用的实际物理内存百分比


ps 这个指令很多不同的 Unix 都用来查阅程序状态, 为了要符合不同版本的需求,所以这个 man page 写的非常的庞大!因此,直接背两个比较不同的选项, 一个是查询自己的bash程序 'ps -l',另一个则是查询所有程序!

-A	所有的 process 均显示出来,与 -e 具有同样的效用;
-a	不与 terminal 有关的所有 process ;
-u	有效使用者(effective user)相关的 process
x	通常与 a 这个参数一起使用,可列出较完整信息。

-l	较长、较详细的将该 PID 的的信息列出;
-j	工作的格式(jobs format)
-f	做一个更为完整的输出。
-L	显示线程
-o	显示的格式自定义
#只显示当前bash的进程
[root@izj6cfw9yi1iqoik31tqbgz push]# ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ    WCHAN  TTY      TIME CMD
4 S     0 14229 14227  0  80   0  -   28880 do_wai pts/1    00:00:00 bash
0 T     0 17308 14229  0  80   0  -   26986 do_sig pts/1    00:00:00 tail
0 T     0 17309 14229  0  80   0  -   28374 do_sig pts/1    00:00:00 awk
0 T     0 17310 14229  0  80   0  -   26987 do_sig pts/1    00:00:00 cut
0 R     0 22479 14229  0  80   0  -   37235 -      pts/1    00:00:00 ps

#也可以以此格式显示所有
[root@izj6cfw9yi1iqoik31tqbgz push]# ps -lA
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
...
0 S    27  1248   950  0  80   0 - 247346 poll_s ?       00:14:31 mysqld
5 S    99  1267   867  0  80   0 - 84181 inet_c ?        00:00:10 php-fpm
...
4 S     0 14227  1392  0  80   0 - 37069 poll_s ?        00:00:00 sshd
5 S    99 19076  1443  0  80   0 - 19304 ep_pol ?        00:00:05 nginx
5 S    99 19077  1443  0  80   0 - 19160 ep_pol ?        00:00:01 nginx
F:代表这个程序旗标 (process flags) ,说明这个程序的总结权限,常见号码有:
    若为 4 表示此程序的权限为 root ;
    若为 1 则表示此子程序仅进行复制(fork) 而没有实际执行(exec) 。
S:代表这个程序的状态 (STAT) ,主要的状态有:
    R (Running) :该程序正在运行中;
    S (Sleep) :该程序目前正在睡眠状态(idle) ,但可以被唤醒(signal) 。
    D :不可被唤醒的睡眠状态,通常这支程序可能在等待 I/O 的情况(ex>打印)
    T :停止状态(stop) ,可能是在工作控制(背景暂停) 或除错 (traced) 状态;
    Z (Zombie) :僵尸状态,程序已经终止但却无法被移除至内存外。
UID/PID/PPID:代表"此程序被该 UID 所拥有/程序的 PID 号码/此程序的父程序 PID 号码"
C:代表 CPU 使用率,单位为百分比;

PRI/NI:Priority/Nice 的缩写,代表此程序被 CPU 所执行的优先顺序,数值越小代表该
程序越快被 CPU 执行。详细的 PRI 与 NI 将在下一小节说明。

ADDR/SZ/WCHAN:都与内存有关,ADDR 是 kernel function,指出该程序在内存的哪个部分,
            如果是个 running 的程序,一般就会显示 - / SZ 代表此程序用掉多少内存 /
WCHAN 表示目前程序是否运行中,同样的, 若为 - 表示正在运行中。
TTY:登陆者的终端机位置,若为远端登陆则使用动态终端接口 (pts/n) ;
TIME:使用掉的 CPU 时间,注意,是此程序实际花费 CPU 运行的时间,而不是系统时
间;
CMD:就是 command 的缩写,造成此程序的触发程序之指令为何
[root@izj6cfw9yi1iqoik31tqbgz push]# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      1443  0.0  0.3  72608  3500 ?        Ss   Jun08   0:00 nginx: master process nginx
root      2717  0.0  0.0   4168   344 ?        S    Jun08   0:00 ./a.out 30
redis     2775  0.0  0.5 142912  5552 ?        Ssl  Jun08  29:08 /usr/bin/redis-server 127.0.0.1:6379
nobody   19076  0.0  0.6  77216  6836 ?        S    Jun29   0:05 nginx: worker process
nobody   19077  0.0  0.6  76640  6272 ?        S    Jun29   0:01 nginx: worker process
USER:该 process 属于那个使用者帐号的?
PID :该 process 的程序识别码。
%CPU:该 process 使用掉的 CPU 资源百分比;
%MEM:该 process 所占用的实体内存百分比;
VSZ :该 process 使用掉的虚拟内存量 (KBytes)
RSS :该 process 占用的固定的内存量 (KBytes)
TTY :该 process 是在那个终端机上面运行,若与终端机无关则显示 ?,另外, tty1-tty6
是本机上面的登陆者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。
STAT:该程序目前的状态,状态显示与 ps -l 的 S 旗标相同 (R/S/T/Z)
START:该 process 被触发启动的时间;
TIME :该 process 实际使用 CPU 运行的时间。
COMMAND:该程序的实际指令为何?
#利用下面指令也可以显示全部进程
[root@izj6cfw9yi1iqoik31tqbgz push]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
...
root      1392     1  0 Jun08 ?        00:00:02 /usr/sbin/sshd -D
root      1418   505  0 Jun08 tty1     00:00:00 -bash
root      1443     1  0 Jun08 ?        00:00:00 nginx: master process nginx
...
#进程组,工作组方式显示
[root@izj6cfw9yi1iqoik31tqbgz push]# ps -axjf
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
    1   505   505   505 ?           -1 Ss       0   0:00 login -- root
  505  1418  1418  1418 tty1      1418 Ss+      0   0:00  \_ -bash
    1   857   857   857 ?           -1 Ssl      0   3:29 /usr/bin/python -Es /usr/sbin/tuned -l -P
    1   867   867   867 ?           -1 Ss       0   1:26 php-fpm: master process (/etc/php-fpm.conf)
  867  1267   867   867 ?           -1 S       99   0:10  \_ php-fpm: pool www
  867  1268   867   867 ?           -1 S       99   0:10  \_ php-fpm: pool www
    1   893   893   893 ?           -1 Ss      38   0:08 /usr/sbin/ntpd -u ntp:ntp -g
    1  1374  1374  1374 ?           -1 Ssl      0   1:16 /usr/sbin/aliyun-service
    1  1392  1392  1392 ?           -1 Ss       0   0:02 /usr/sbin/sshd -D
 1392 14227 14227 14227 ?           -1 Ss       0   0:00  \_ sshd: root@pts/1
14227 14229 14229 14229 pts/1    23079 Ss       0   0:00      \_ -bash
14229 23079 23079 14229 pts/1    23079 R+       0   0:00          \_ ps -axjf

要想查询特定程序名的信息可以结合 grep

[root@izj6cfw9yi1iqoik31tqbgz push]# ps -ef | grep nginx
root      1443     1  0 Jun08 ?        00:00:00 nginx: master process nginx
nobody   19076  1443  0 Jun29 ?        00:00:05 nginx: worker process
nobody   19077  1443  0 Jun29 ?        00:00:01 nginx: worker process
root     23270 14229  0 10:50 pts/1    00:00:00 grep --color=auto nginx


pstree 可以查询程序相关性

-A    各程序树之间的连接以 ASCII 字符来连接;
-U    各程序树之间的连接以万国码的字符来连接。在某些终端接口下可能会有错误;
-p    并同时列出每个 process 的 PID以及各个线程和线程id;
-u    并同时列出每个 process 的所属帐号名称。
[root@izj6cfw9yi1iqoik31tqbgz push]# pstree -p
systemd(1)─├─atd(498)
           ├─auditd(398)───{auditd}(400)
           ├─crond(495)
           ├─dbus-daemon(472)
           ├─login(505)───bash(1418)
           ├─mysqld_safe(950)───mysqld(1248)─┬─{mysqld}(1283)
           │                                 ├─{mysqld}(1284)
           │                                 ├─{mysqld}(3494)
...
           │                                 ├─{mysqld}(19101)
           │                                 └─{mysqld}(8472)
           ├─nginx(1443)─┬─nginx(19076)
           │             └─nginx(19077)
...


nice 命令可以调整进程的nice值,默认为20,nice值越小获得cpu调度优先级越高。

-n    后面接一个数值,数值的范围 -20 ~ 19。
#最低优先级39运行
nice -n +19 ./a.out &

#最高优先级0运行
nice -n -20 ./a.out &

renice 可以调整正在运行的进程的优先级

#将进程id为1234的进程调整为优先级15
renice -5 1234


free 命令可先显示系统内存使用情况。

-h	human readable
-t	total
-s	可以让系统每几秒钟输出一次
-c	与-s一起,代表显示次数
free -h
free -h -s 2	    #2秒显示1次
free -h -s 2 -c 2   #2秒显示1次,2次后断开


备注:
1.本系列命令都在centos7里测试,其他发行版如ubuntu、debian、fedora、opensuse等可能略微不同
2.本文只讲解常用用法,详细用法请自行利用 man 命令查看
3.原文地址http://www.freecls.com/a/2712/7f

 

©著作权归作者所有
收藏
推荐阅读
简介
天降大任于斯人也,必先苦其心志。