系统管理之ps命令和top命令

[TOC]

1. 进程简介

1.1 什么是进程

进程是正在执行的一个程序或命令,每一个进程都是一个运行的实体,都有自己的地址空间,并占用一定的系统资源。

1.2 进程管理的作用

  • 判断服务器健康状态:运维工程师最主要的工作就是保证服务器安全稳定的运行。理想的状态是,在服务器出现问题,但是还没有造成服务器宕机或停止服务时,就人为干预解决了问题。进程管理最主要的工作就是判断服务器当前是否健康,是否需要人为干预。如果服务器的cpu占用率、内存专用率过高,就需要人为介入解决问题了。一般健康服务器的负载最高为内存不超过70%,CPU不超过90%。
  • 查看系统中所有的进程:我们需要查看系统中所有正在运行的进程,通过这些进程可以判断系统中运行了哪些服务,是否有非法服务运行。
  • 杀死进程:这是进程管理中最不常用的手段,当我们需要停止服务时,会通过正确关闭命令来停止服务(如apache服务可以通过systemctl stop httpd来关闭)。只有当正确终止进程的手段失效的情况下,才会考虑使用kill命令杀死进程。

2. 进程管理命令

2.1 ps命令

ps命令是用来静态显示系统中进程的命令。

2.1.1 ps aux

查看系统中所有进程,使用BSD操作系统格式。

示例:

[root@localhost ~]# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.1 193756  6508 ?        Ss   12:53   0:04 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root          2  0.0  0.0      0     0 ?        S    12:53   0:00 [kthreadd]
root          4  0.0  0.0      0     0 ?        S<   12:53   0:00 [kworker/0:0H]
root          6  0.0  0.0      0     0 ?        S    12:53   0:02 [ksoftirqd/0]
root          7  0.0  0.0      0     0 ?        S    12:53   0:00 [migration/0]
...

输出字段介绍:

  • USER:该进程是由哪个用户产生的
  • PID:进程的ID号
  • %CPU:该进程占用CPU资源的百分比
  • %MEN:该进程占用物理内存的百分比
  • VSZ:该进程占用虚拟内存的大小,单位KB
  • RSS:该进程占用实际物理内存的大小,单位KB
  • TTY:该进程是在哪个终端中运行的。tty1-tty7代表本地终端控制台终端。pts/0-255代表虚拟终端,一般是远程连接的终端。?一般代表属于系统调用。
  • STAT:进程状态。常见的状态有:
* D:不可被唤醒的睡眠状态
* R:该正常正在运行
* S:该进程在睡眠状态,可被唤醒
* T:停止状态,可能是在后台暂停或进程在除错状态
* X:死掉的进程
* Z:僵尸进程。进程已经终止,但是部分程序还在内存当中
* <:高优先级
* N:低优先级
* L:被锁入内存
* s:包含子进程
* l:多线程(小写L)
* +:位于后台
  • START:该进程的启动时间
  • TIME:该进程占用CPU的运算时间
  • COMMAND:产生此进程的命令名
2.1.2 ps -ef

查看系统中所有进程,使用System V风格显示。

示例:

[root@localhost ~]# ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 12:53 ?        00:00:04 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root          2      0  0 12:53 ?        00:00:00 [kthreadd]
root          4      2  0 12:53 ?        00:00:00 [kworker/0:0H]
root          6      2  0 12:53 ?        00:00:02 [ksoftirqd/0]
root          7      2  0 12:53 ?        00:00:00 [migration/0]
root          8      2  0 12:53 ?        00:00:00 [rcu_bh]
root          9      2  0 12:53 ?        00:00:02 [rcu_sched]
root         10      2  0 12:53 ?        00:00:00 [lru-add-drain]
...

输出字段介绍:

  • UID:该进程是由哪个用户产生的
  • PID:进程的ID号
  • PPID:父进程的ID号
  • C:该进程占用CPU资源的百分比
  • STIME:该进程的启动时间
  • TTY:该进程是在哪个终端中运行的
  • TIME:该进程占用CPU的运算时间
  • CMD:产生此进程的命令名
2.1.3 pa aux和ps -ef的对比

两者的输出结果差别不大,但展示风格不同。aux是BSD风格,-ef是System V风格。

2.2 top命令

top命令经常用来动态地、交互地显示系统中进程地信息。该命令输出内容是动态的,默认每3s刷新一次。

2.2.1 显示信息详解

该命令的输出主要分为两部分:第一部分是前五行,显示的是整个系统的资源使用状况。第二步分从第六行开始,显示的是系统中进程的信息。

[root@localhost ~]# top 
top - 21:07:57 up  8:14,  3 users,  load average: 0.00, 0.01, 0.05
Tasks: 128 total,   1 running, 127 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  3861372 total,   272912 free,   771620 used,  2816840 buff/cache
KiB Swap:  3145724 total,  3144416 free,     1308 used.  2814904 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 27187 root      20   0  161992   2116   1516 R   6.2  0.1   0:00.01 top
     1 root      20   0  193756   6508   3752 S   0.0  0.2   0:04.13 systemd
     2 root      20   0       0      0      0 S   0.0  0.0   0:00.03 kthreadd
     4 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H
     6 root      20   0       0      0      0 S   0.0  0.0   0:02.34 ksoftirqd/0
     7 root      rt   0       0      0      0 S   0.0  0.0   0:00.37 migration/0
     8 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcu_bh
     ...
2.2.1.1 系统总体资源介绍

第一行信息为任务队列信息,具体内容如下表所示:

内容 说明
21:07:57 系统当前时间
8:14 系统的运行时间,本机已经运行8小时14分
3 users 当前登录了三个用户
load average: 0.00, 0.01, 0.05 系统在过去1分钟,5分钟,15分钟的平均负载。

面试题:load average值含义是什么?其值和什么有关?是否可以根据该值判断CPU的负载。

查看cpu核数的命令:cat /proc/cpuinfo |grep "cpu core"|wc -l
如果CPU是单核,则这个数超过1,就是高负载。
如果CPU是四核,则这个数超过4,就是高负载。
一般认为不应该超过服务器CPU的核数。

第二行为进程信息,具体内容如下表所示:

内容 说明
128 total 系统中的进程总数
1 running 正在运行的进程数
127 sleeping 睡眠的进程数
0 stopped 正在停止的进程数
0 zombie 僵尸进程。如果不是0,需要手动检查僵尸进程

第三行为CPU信息,具体内容如下表所示:==按下t键可进行可视化显示==

内容 说明
0.0 us 用户模式占用的CPU百分比
0.0 sy 系统模式占用的CPU百分比
0.0 ni 改变优先级的用户进程占用的CPU百分比
100.0 id 空闲CPU的CPU百分比
0.0 wa 等待输入/输出的进程的占用CPU百分比
0.0 hi 硬中断请求服务占用的CPU百分比
0.0 si 软中断请求服务占用的CPU百分比
0.0 st st(Steal time) 虚拟时间百分比。就是当有虚拟机时,虚拟CPU等待实际CPU的时间百分比

第四行为物理内存信息。 ==按下m键可进行可视化显示==

第五行为交换分区(swap)信息。 ==按下m键可进行可视化显示==

2.2.1.1 进程字段介绍
   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 27187 root      20   0  161992   2116   1516 R   6.2  0.1   0:00.01 top
     1 root      20   0  193756   6508   3752 S   0.0  0.2   0:04.13 systemd
     2 root      20   0       0      0      0 S   0.0  0.0   0:00.03 kthreadd
     4 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H
     6 root      20   0       0      0      0 S   0.0  0.0   0:02.34 ksoftirqd/0
     7 root      rt   0       0      0      0 S   0.0  0.0   0:00.37 migration/0
     8 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcu_bh
     ...

进程字段信息和ps命令的输出类似,这里也列出来,top进程信息默认是按CPU占比从高到低进行排序的。

  • PID:进程ID
  • USER:该进程所属的用户
  • PR:优先级,数值越小优先级越高
  • NI:优先级,数值越小优先级越高
  • VIRT:该进程使用的虚拟内存的大小,单位KB
  • RES:该进程使用的物理内存的大小,单位KB
  • SHR:共享内存大小,单位KB
  • S:进程状态
  • %CPU:该进程占用CPU的百分比
  • %MEM:该进程总共占用内存的百分比
  • TIME+:该进程总共占用的CPU时间
  • COMMAND:进程的命令名
2.2.2 交互式详解
  • 按h或?查看帮助信息:
Help for Interactive Commands - procps-ng version 3.3.10
Window 1:Def: Cumulative mode Off.  System: Delay 3.0 secs; Secure mode Off.

  Z,B,E,e   Global: 'Z' colors; 'B' bold; 'E'/'e' summary/task memory scale
  l,t,m     Toggle Summary: 'l' load avg; 't' task/cpu stats; 'm' memory info
  0,1,2,3,I Toggle: '0' zeros; '1/2/3' cpus or numa node views; 'I' Irix mode
  f,F,X     Fields: 'f'/'F' add/remove/order/sort; 'X' increase fixed-width

  L,&,<,> . Locate: 'L'/'&' find/again; Move sort column: '<'/'>' left/right
  R,H,V,J . Toggle: 'R' Sort; 'H' Threads; 'V' Forest view; 'J' Num justify
  c,i,S,j . Toggle: 'c' Cmd name/line; 'i' Idle; 'S' Time; 'j' Str justify
  x,y     . Toggle highlights: 'x' sort field; 'y' running tasks
  z,b     . Toggle: 'z' color/mono; 'b' bold/reverse (only if 'x' or 'y')
  u,U,o,O . Filter by: 'u'/'U' effective/any user; 'o'/'O' other criteria
  n,#,^O  . Set: 'n'/'#' max tasks displayed; Show: Ctrl+'O' other filter(s)
  C,...   . Toggle scroll coordinates msg for: up,down,left,right,home,end

  k,r       Manipulate tasks: 'k' kill; 'r' renice
  d or s    Set update interval
  W,Y       Write configuration file 'W'; Inspect other output 'Y'
  q         Quit
          ( commands shown with '.' require a visible task display window ) 
Press 'h' or '?' for help with Windows,
Type 'q' or  to continue

这里稍微介绍几个:

  • E:更改top界面系统总体资源信息内存单位(KB、MB、GB、TB、PB)
  • e:更改进程信息内存单位(KB、MB、GB、TB、PB)
  • 小写l:切换负载显示风格
  • t:切换cpu显示风格
  • m:切换内存显示风格
  • 数字1:显示所有cpu情况
  • f:进行字段选择页面,添加要显示的列属性
  • x:高亮显示根据哪一列熟悉进行排序
  • y:高亮显示正在运行的进程
  • :修改排序的字段(默认根据CPU)

面试题:发现某个进程CPU使用率非常高,如何使用top命令该进程的线程情况?

先使用top命令或者ps命令查看该进程的进程号PID,然后使用:
top -Hp PID
即可显示该进程的所有线程运行信息。
-H 显示线程信息,-p指定pid
2.2.3 常用技巧
2.2.3.1 将top页面信息输出到文件

如果在操作终端执行top命令,并不能看到系统中所有的进程(虽然按↑↓键可以移动看,但是也不方便),默认看到的只是CPU占比靠前的进程。如果想看所有的进程信息,可以把top命令的结果重定向到文件即可:

top -b -n 1 > top.log
参数解释:
 -b:将信息输出到文件
 -n 1:将一次刷新的结果输出到文件
2.2.3.2 使用top查看线程信息
top -Hp PID
-H 显示线程信息,-p指定pid

2.3 pstree命令

centos7上默认没有安装psmisc包,即没有pstree命令。

安装psmisc包:

yum -y install psmisc

命令:

pstree [options]
-p: 显示进程的PID

示例:

[root@localhost ~]# pstree -p
systemd(1)─┬─VGAuthService(834)
           ├─auditd(798)───{auditd}(799)
           ├─chronyd(25564)
           ├─crond(841)
           ├─dbus-daemon(826)───{dbus-daemon}(831)
           ├─dnsmasq(23027)───dnsmasq(23028)
           ├─irqbalance(832)
           ├─libvirtd(24309)─┬─{libvirtd}(24310)
           │                 ├─{libvirtd}(24311)
           │                 ├─{libvirtd}(24312)
           │                 ├─{libvirtd}(24313)
           │                 ├─{libvirtd}(24314)
           │                 ├─{libvirtd}(24315)
           │                 ├─{libvirtd}(24316)
           │                 ├─{libvirtd}(24317)
           │                 ├─{libvirtd}(24318)
           │                 ├─{libvirtd}(24319)
           │                 ├─{libvirtd}(24320)
           │                 ├─{libvirtd}(24321)
           │                 ├─{libvirtd}(24322)
           │                 ├─{libvirtd}(24323)
           │                 ├─{libvirtd}(24324)
           │                 ├─{libvirtd}(24368)
           │                 └─{libvirtd}(24635)
           ├─login(842)───bash(19239)
           ├─lvmetad(600)
           ├─master(1771)─┬─pickup(27295)
           │              └─qmgr(1775)
           ├─polkitd(833)─┬─{polkitd}(845)
           │              ├─{polkitd}(846)
           │              ├─{polkitd}(847)
           │              ├─{polkitd}(848)
           │              ├─{polkitd}(849)
           │              └─{polkitd}(850)
           ├─qemu-kvm(25133)─┬─{qemu-kvm}(25142)
           │                 └─{qemu-kvm}(25143)
           ├─rsyslogd(21113)─┬─{rsyslogd}(21115)
           │                 └─{rsyslogd}(21116)
           ├─sshd(19683)───sshd(27392)───bash(27396)─┬─pstree(27881)
           │                                         └─vi(27576)
           ├─systemd-journal(577)
           ├─systemd-logind(823)
           ├─systemd-machine(25136)
           ├─systemd-udevd(604)
           ├─tuned(1215)─┬─{tuned}(2202)
           │             ├─{tuned}(2203)
           │             ├─{tuned}(2269)
           │             └─{tuned}(2270)
           ├─virtlogd(23647)
           └─vmtoolsd(835)───{vmtoolsd}(858)

你可能感兴趣的:(系统管理之ps命令和top命令)