如何判断Linux系统运行状态是否良好

嵌入式技术

1362人已加入

描述

众所周知,生病了需要去医院看病,大夫首先要询问我们哪里不舒服,然后再通过观察和自己的经验,大体上就能判定我们得的是什么病。然而Linux不会说话,它不会主动告诉我们哪里出现了问题,需要我们自己去观察。那么如何评估系统运行状态是否良好呢?下面阿铭就介绍一些帮我们分析系统状态的工具。

14.1.1 使用w命令查看当前系统的负载

具体用法如下:  

# w
22:07:15 up 74 days, 7:52,  1 user,  load average: 0.00, 0.00, 0.00
USER TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root pts/0    192.168.18.1     22:07    1.00s  0.07s  0.01s w
  相信所有Linux管理员最常用的命令就是这个w了,该命令显示的信息很丰富。第1行从左至右显示的信息依次为:时间、系统运行时间、登录用户数、平均负载。从第2行开始的所有行则是告诉我们:当前登录的用户名及其登录地址等。其实在这些信息中,阿铭认为最应该关注第1行中的 load average:后面的3个数值。 第1个数值表示1分钟内系统的平均负载值,第2个数值表示5分钟内系统的平均负载值,第3个数值表示15分钟内系统的平均负载值。我们着重看第1个值,它表示单位时间段内使用CPU的活动进程数(在这里其实就是1分钟内),值越大就说明服务器压力越大。一般情况下,这个值只要不超过服务器的CPU数量就没有关系。如果服务器的CPU数量为8,那么值小于8就说明当前服务器没有压力;否则就要关注一下了。查看服务器有几个CPU的方法如下所示:  
# cat /proc/cpuinfo
processor  : 0
vendor_id  : GenuineIntel
cpu family  : 6
model    : 62
model name  : Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz
stepping  : 4
microcode  : 0x427
cpu MHz    : 2600.039
cache size  : 20480 KB
physical id  : 0
siblings  : 1
core id    : 0
cpu cores  : 1
apicid    : 0
initial apicid  : 0
fpu    : yes
fpu_exception  : yes
cpuid level  : 13
wp    : yes
flags    : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc cpuid aperfmperf pni pclmulqdq ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cpuid_fault pti fsgsbase smep xsaveopt dtherm ida arat pln pts
bugs    : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf
bogomips  : 5200.07
clflush size  : 64
cache_alignment  : 64
address sizes  : 40 bits physical, 48 bits virtual
power management:
processor  : 1
vendor_id  : GenuineIntel
cpu family  : 6
model    : 62
model name  : Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz
stepping  : 4
microcode  : 0x427
cpu MHz    : 2600.039
cache size  : 20480 KB
physical id  : 2
siblings  : 1
core id    : 0
cpu cores  : 1
apicid    : 2
initial apicid  : 2
fpu    : yes
fpu_exception  : yes
cpuid level  : 13
wp    : yes
flags    : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc cpuid aperfmperf pni pclmulqdq ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cpuid_fault pti fsgsbase smep xsaveopt dtherm ida arat pln pts
bugs    : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf
bogomips  : 5200.07
clflush size  : 64
cache_alignment  : 64
address sizes  : 40 bits physical, 48 bits virtual
power management:
  上例中,/proc/cpuinfo这个文件记录了CPU的详细信息。目前市面上的服务器有很多是2颗多核CPU,在Linux看来,它就是2*n个CPU(这里的n为单颗物理CPU上有几核)。假如n是4,则查看这个文件时会显示8段类似的信息,而最后一段信息的processor : 后面会显示7。所以查看当前系统有几个CPU,我们可以使用命令grep -c 'processor' /proc/cpuinfo。然而查看有几颗物理CPU时,则需要查看关键字physical id。 另外一个查看CPU信息的命令为lscpu,如下所示:  
# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 2
On-line CPU(s) list: 0,1
Thread(s) per core: 1
Core(s) per socket: 1
Socket(s): 2
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 62
Model name: Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz
Stepping: 4
CPU MHz: 2600.039
BogoMIPS: 5200.07
Hypervisor vendor: VMware
Virtualization type: full
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 20480K
NUMA node0 CPU(s): 0,1
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc cpuid aperfmperf pni pclmulqdq ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cpuid_fault pti fsgsbase smep xsaveopt dtherm ida arat pln pts
  14.1.2 用vmstat命令监控系统的状态 具体用法如下:  
# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
3  0      0 938948   4184 645672    0    0    61   128   90  182  1  1 98  0  0
  命令w查看的是系统整体上的负载,通过看那个数值可以知道当前系统有没有压力。但它无法判断具体是哪里(CPU、内存、磁盘等)有压力,所以这就用到了vmstat。vmstat命令打印的结果共分为6部分:procs、memory、swap、io、system和cpu。请重点关注一下r、b、si、so、bi、bo这几列信息。

 

procs显示进程的相关信息。

r(run):表示运行或等待CPU时间片的进程数。大家不要误认为等待CPU时间片意味着这个进程没有运行,实际上某一时刻1个CPU只能有一个进程占用,其他进程只能排着队等着,此时这些排队等待CPU资源的进程依然是运行状态。该数值如果长期大于服务器CPU的个数,则说明CPU资源不够用了。 b(block):表示等待资源的进程数,这个资源指的是I/O、内存等。举个例子,当磁盘读写非常频繁时,写数据就会非常慢,此时CPU运算很快就结束了,但进程需要把计算的结果写入磁盘,这样进程的任务才算完成,那此时这个进程只能慢慢地等待磁盘了,这样这个进程就是这个b状态。该数值如果长时间大于1,则需要关注一下了。

memory显示内存的相关信息。

swpd:表示切换到交换分区中的内存数量,单位为KB。

free:表示当前空闲的内存数量,单位为KB。

buff:表示(即将写入磁盘的)缓冲大小,单位为KB。

cache:表示(从磁盘中读取的)缓存大小,单位为KB。

swap显示内存的交换情况。

si:表示由交换区写入内存的数据量,单位为KB。 so:表示由内存写入交换区的数据量,单位为KB。

io显示磁盘的使用情况。

bi:表示从块设备读取数据的量(读磁盘),单位为KB。 bo:表示从块设备写入数据的量(写磁盘),单位为KB。

system显示采集间隔内发生的中断次数。

in:表示在某一时间间隔内观测到的每秒设备的中断次数。 cs:表示每秒产生的上下文切换次数。

cpu显示CPU的使用状态。

us:显示用户下所花费CPU的时间百分比。 sy:显示系统花费CPU的时间百分比。 id:表示CPU处于空闲状态的时间百分比。 wa:表示I/O等待所占用CPU的时间百分比。 st:表示被偷走的CPU所占百分比(一般都为0,不用关注)。 以上所介绍的各个参数中,阿铭经常会关注r、b和wa这3列。io部分的bi和bo也是要经常参考的对象,如果磁盘io压力很大,这两列的数值会比较高。另外,当si和so两列的数值比较高并且不断变化时,说明内存不够了,内存中的数据频繁交换到交换分区中,这往往对系统性能影响极大。 我们使用vmstat查看系统状态时,通常都是使用如下形式:

 

# vmstat 1 5
  或者:
# vmstat 1
  前一条命令表示每隔1秒输出一次状态,共输出5次;后一条命令表示每隔1秒输出一次状态且一直输出,除非按Ctrl+C键结束。 14.1.3 用top命令显示进程所占的系统资源 具体用法如下:  
# top
top - 2230 up 2 days, 8:14,  1 user,  load average: 0.00, 0.00, 0.00
Tasks: 154 total, 2 running, 152 sleeping,   0 stopped,   0 zombie
%Cpu(s): 2.6 us,  7.7 sy,  0.0 ni, 87.2 id,  0.0 wa,  2.6 hi,  0.0 si,  0.0 st
MiB Mem : 3770.4 total,   2086.4 free,    437.3 used,   1246.8 buff/cache
MiB Swap: 4060.0 total,   4060.0 free,      0.0 used.   2893.2 avail Mem
PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                                                                                                
28123 root 20   0   60948   3948   3308 R   5.6   0.1   0:00.03 top                                                                                                                    
1 root      20   0  246944  14540   9144 S   0.0   0.4   3:42.49 systemd                                                                                                                
2 root      20   0       0      0      0 S   0.0   0.0   0:04.89 kthreadd                                                                                                               
3 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_gp                                                                                                                 
4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_par_gp                                                                                                             
6 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/0:0H-kblockd                                                                                                   
8 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 mm_percpu_wq                                                                                                           
9 root      20   0       0      0      0 S   0.0   0.0  31:45.82 ksoftirqd/0                                                                                                            
10 root      20   0       0      0      0 R   0.0   0.0  34:36.15 rcu_sched                                                                                                              
11 root      rt   0       0      0      0 S   0.0   0.0  16:37.79 migration/0                                                                                                            
12 root      rt   0       0      0      0 S   0.0   0.0   0:45.63 watchdog/0                                                                                                             
13 root      20   0       0      0      0 S   0.0   0.0   0:00.00 cpuhp/0                                                                                                                
14 root      20   0       0      0      0 S   0.0   0.0   0:00.00 cpuhp/1                                                                                                                
15 root      rt   0       0      0      0 S   0.0   0.0   0:46.99 watchdog/1                                                                                                             
16 root      rt   0       0      0      0 S   0.0   0.0  14:44.19 migration/1
  top命令用于动态监控进程所占的系统资源,每隔3秒变一次。它的特点是把占用系统资源(CPU、内存、磁盘I/O等)最高的进程放到最前面。上例中,top命令打印出了很多信息,包括系统负载(load average)、进程数(Tasks)、CPU使用情况、内存使用情况以及交换分区使用情况。这些内容其实可以通过其他命令来查看,用top重点查看的还是下面的进程使用系统资源的详细状况,其中你需要关注%CPU、%MEM和COMMAND这几项所代表的意义。RES这一项为进程所占的内存大小,而%MEM这一项为使用内存的百分比。在top状态下,按Shift+m键可以按照内存使用大小排序。按数字1可以列出所有核CPU的使用状态,按q键可以退出top。 另外,阿铭经常用到命令top -bn1,它表示非动态打印系统资源的使用情况,可以用在shell脚本中。示例如下:  
# top -bn1 |head
top - 2237 up 2 days, 8:15,  1 user,  load average: 0.00, 0.00, 0.00
Tasks: 155 total, 1 running, 154 sleeping,   0 stopped,   0 zombie
%Cpu(s): 0.0 us,  5.6 sy,  0.0 ni, 91.7 id,  0.0 wa,  2.8 hi,  0.0 si,  0.0 st
MiB Mem : 3770.4 total,   2086.1 free,    437.6 used,   1246.8 buff/cache
MiB Swap: 4060.0 total,   4060.0 free,      0.0 used.   2893.0 avail Mem
PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
28137 root 20   0   60944   3944   3392 R   6.2   0.1   0:00.02 top
1 root      20   0  246944  14540   9144 S   0.0   0.4   3:42.49 systemd
2 root      20   0       0      0      0 S   0.0   0.0   0:04.89 kthreadd
  和top命令唯一的区别就是,它一次性输出所有信息而非动态显示。 14.1.4 用sar命令监控系统状态 sar命令很强大,它可以监控系统几乎所有资源的状态,比如平均负载、网卡流量、磁盘状态、内存使用等。与其他系统状态监控工具不同,它可以打印历史信息,可以显示当天从零点开始到当前时刻的系统状态信息。如果你的系统没有安装这个命令,请使用命令yum install -y sysstat安装。初次使用sar命令会报错,那是因为sar工具还没有生成相应的数据库文件(无需实时监控,因为不用去查询那个库文件)。它的数据库文件在/var/log/sa/目录下。因为这个命令太复杂,所以阿铭只介绍以下两个方面。 1. 查看网卡流量 sar -n DEV 具体用法如下:  
# sar -n DEV 1 5
Linux 4.18.0-80.el8.x86_64 (localhost.localdomain) 03/03/20   _x86_64_  (2 CPU)
22:31:30 IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
22:31:31 virbr0    0.00    0.00    0.00     0.00     0.00     0.00     0.00     0.00
22:31:31 lo     0.00    0.00      0.00      0.00      0.00      0.00      0.00      0.00
22:31:31 ens33     1.00     1.00     0.06     0.18     0.00      0.00      0.00      0.00
22:31:31 IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
22:31:32 virbr0     0.00     0.00     0.00     0.00     0.00      0.00      0.00      0.00
22:31:32 lo       0.00     0.00     0.00     0.00     0.00     0.00      0.00      0.00
22:31:32 ens33    12.00    23.00     0.70     2.69     0.00      0.00      0.00      0.00
22:31:32 IFACE  rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
22:31:33 virbr0    0.00    0.00     0.00      0.00      0.00      0.00      0.00      0.00
22:31:33 lo    0.00    0.00    0.00      0.00      0.00      0.00      0.00      0.00
22:31:33 ens33     1.00     2.00     0.06     0.71     0.00      0.00      0.00      0.00
22:31:33 IFACE  rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
22:31:34 virbr0    0.00     0.00     0.00     0.00     0.00      0.00      0.00      0.00
22:31:34 lo     0.00     0.00     0.00     0.00     0.00      0.00      0.00      0.00
22:31:34 ens33    1.00    2.00     0.06     0.71     0.00      0.00      0.00      0.00
22:31:34 IFACE   rxpck/s  txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
22:31:35 virbr0    0.00     0.00     0.00     0.00     0.00     0.00      0.00      0.00
22:31:35 lo      0.00     0.00     0.00     0.00     0.00     0.00      0.00      0.00
22:31:35 ens33    1.00     1.00     0.06     0.60     0.00     0.00      0.00      0.00
Average: IFACE  rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
Average: virbr0    0.00     0.00     0.00     0.00      0.00      0.00      0.00      0.00
Average: lo    0.00     0.00     0.00     0.00      0.00      0.00      0.00      0.00
Average: ens33    3.20     5.80     0.19     0.98      0.00      0.00      0.00      0.00
  你的结果可能和阿铭的不一样,这是因为网卡名字不一样,总之这个命令会把网卡信息打印出来,这里的1 5和vmstat用法一样,表示每隔1秒打印一次,共打印5次。IFACE这一列表示设备名称,rxpck/s这一列表示每秒进入收取的包的数量,txpck/s这一列表示每秒发送出去的包的数量,rxkB/s这一列表示每秒收取的数据量(单位为KB),txkB/s这一列表示每秒发送的数据量(后面几列不需要关注)。 如果有一天服务器丢包非常严重,那么你就应该查一下网卡流量是否异常了。如果rxpck/s那一列的数值大于4000,或者rxkB/s那一列的数值大于5000000,很有可能是被攻击了。正常的服务器网卡流量不会这么高,除非是你自己在复制数据。 另外也可以使用-f选项查看某一天的网卡流量历史,后面跟文件名。在Red Hat或者CentOS发行版中,sar的库文件一定在/var/log/sa/目录下,如果你刚安装syssta包,该目录下还未生成任何文件,其用法如下所示:
# sar -n DEV -f /var/log/sa/sa03
  2. 查看历史负载 sar -q 具体用法如下:  
# sar -q
Cannot open /var/log/sa/sa03: No such file or directory
  如果报如上错误,可以重启syssta服务,命令为systemctl restart sysstat。即使生成该文件,但依然还不能正常显示结果,因为它需要每隔10分钟才会记录一次数据。这个命令有助于我们查看服务器在过去某个时间的负载状况。其实阿铭介绍sar命令,只是为了让你学会查看网卡流量(这是非常有用的)。如果你感兴趣可以man一下,它的用法还有很多。 14.1.5 用nload命令查看网卡流量 sar虽然可以查看网卡流量,但是不够直观,还有一个更好用的工具,那就是nload。系统没有默认安装它,安装方法如下:  
# yum install –y epel-release; yum install –y nload
  安装过程阿铭不再贴出来。关于上面的命令,也许你有疑问,为什么不直接写两个包呢?这是因为要想安装nload,前提是先安装epel-release包,nload包是在epel这个扩展源里面的。以后在工作中,你一定会经常使用epel扩展源安装一些软件包,非常方便。安装完之后,直接运行nload命令,然后回车就会出现如下界面。是动态的哦,很直观对不对?相信你会喜欢上这个工具。  
Device ens33 [192.168.72.128] (1/2):
==
Incoming:
Curr: 944.00 Bit/s
Avg: 1.20 kBit/s
Min: 944.00 Bit/s
Max: 1.84 kBit/s
Ttl: 1.17 GByte
Outgoing:
Curr: 8.88 kBit/s
Avg: 8.67 kBit/s
Min: 5.35 kBit/s
Max: 9.83 kBit/s
Ttl: 58.45 MByt
  最上面一行为网卡名字以及IP地址,按向右箭头可以查看其他网卡的网络流量。输出结果分为两部分,Incoming为进入网卡的流量,Outgoing为网卡出去的流量,我们关注的当然是Curr那行的数据,其单位也可以动态自动调整,非常人性化。按q退出该界面。 14.1.6 用free命令查看内存使用状况 具体用法如下:  
total        used        free      shared  buff/cache   available
Mem: 1849532      230972     1346700        8852      271860     1460708
Swap: 2097148           0     2097148
  free命令可以查看当前系统的总内存大小以及使用内存的情况。

total:内存总大小。

used:真正使用的实际内存大小。

free:剩余物理内存大小(没有被分配,纯剩余)。

shared:共享内存大小,不用关注它。

buff/cache:分配给buffer和cache的内存总共有多大。关于buffer和cache大家也许有一些疑惑,因为字面意思上两者很相近。阿铭教你一个很容易区分这两者的方法,buffer和cache都是一部分内存,内存的作用就是缓解CPU和IO(如,磁盘)的速度差距的,你可以这样理解:数据经过CPU计算,即将要写入磁盘,这时用的内存为buffer;CPU要计算时,需要把数据从磁盘中读出来,临时先放到内存中,这部分内存就是cache。

available:系统可使用内存有多大,它包含了free。Linux系统为了让应用跑得更快,会预先分配一部分内存(buffer/cache)给某些应用使用,虽然这部分内存并没有真正使用,但也已经分配出去了。然而,当另外一个服务要使用更多内存时,是可以把这部分预先分配的内存拿来用的。所以还没有被占用的这部分buffer和cache再加上free就是available。

这个free命令显示的结果中,其实有一个隐藏的公式:total=used+free+buff/cache。另外,available是由free这部分内存和buff/cache还未被占用的那部分内存组成。used那部分内存和buff/cache被占用的内存是没有关系的。 free命令还可以加-m和-g选项(分别以MB或GB为单位)打印内存的使用状况,甚至也支持-h选项。示例命令如下: 

# free -m
total        used        free      shared  buff/cache   available
Mem: 1806         225        1315           8         265        1426
Swap: 2047           0        2047
# free -g
total        used        free      shared  buff/cache   available
Mem: 1           0           1           0           0           1
Swap: 1           0           1
# free -h
total        used        free      shared  buff/cache   available
Mem: 1.8Gi       225Mi       1.3Gi       8.0Mi       265Mi       1.4Gi
Swap: 2.0Gi          0B       2.0Gi
  14.1.7 用ps命令查看系统进程 系统管理员一定要知道你所管理的系统都有哪些进程在运行,在Windows下只要打开任务管理器即可查看。那么在Linux下如何查看呢?其实使用前面介绍的top命令就可以,但是查看起来没有ps命令方便,它是专门显示系统进程的命令,如下所示:
# ps aux
USER PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root 1  0.1  0.7 178496 13248 ?        Ss   20:32   0:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 17
root 2  0.0  0.0      0     0 ?        S    20:32   0:00 [kthreadd]
root 3  0.0  0.0      0     0 ?        I<   20:32   0:00 [rcu_gp]
root 4  0.0  0.0      0     0 ?        I<   20:32   0:00 [rcu_par_gp]
root 6  0.0  0.0      0     0 ?        I<   20:32   0:00 [kworker/0:0H-kblockd]
root 7  0.0  0.0      0     0 ?        I    20:32   0:00 [kworker/u256:0-events_unbound]
root 8  0.0  0.0      0     0 ?        I<   20:32   0:00 [mm_percpu_wq]
root 9  0.0  0.0      0     0 ?        S    20:32   0:00 [ksoftirqd/0]
root 10  0.0  0.0      0     0 ?        R    20:32   0:00 [rcu_sched]
root 11  0.0  0.0      0     0 ?        S    20:32   0:00 [migration/0]
root 12  0.0  0.0      0     0 ?        S    20:32   0:00 [watchdog/0]
root 13  0.0  0.0      0     0 ?        S    20:32   0:00 [cpuhp/0]
root 15  0.0  0.0      0     0 ?        S    20:32   0:00 [kdevtmpfs]
root 16  0.0  0.0      0     0 ?        I<   20:32   0:00 [netns]
root 17  0.0  0.0      0     0 ?        S    20:32   0:00 [kauditd]
root 18  0.0  0.0      0     0 ?        S    20:32   0:00 [khungtaskd]
root 19  0.0  0.0      0     0 ?        S    20:32   0:00 [oom_reaper]
root 20  0.0  0.0      0     0 ?        I<   20:32   0:00 [writeback]
root 21  0.0  0.0      0     0 ?        S    20:32   0:00 [kcompactd0]
root 22  0.0  0.0      0     0 ?        SN   20:32   0:00 [ksmd]
root 23  0.0  0.0      0     0 ?        SN   20:32   0:00 [khugepaged]
root 24  0.0  0.0      0     0 ?        I<   20:32   0:00 [crypto]
root 25  0.0  0.0      0     0 ?        I<   20:32   0:00 [kintegrityd]
  阿铭也经常看到有人喜欢用命令ps -elf,但它们显示的信息基本上是一样的。ps命令还有更多的用法,你只要会用这个命令就足够了。下面介绍几个系统进程的参数。

PID:表示进程的ID,这个ID很有用。在Linux中,内核管理进程就得靠pid来识别和管理某一个进程。比如我想终止某一个进程,则用命令“kill 进程的pid”。有时这样并不能终止进程,需要加-9选项,即“kill -9 进程的pid”,但这样有点暴力,严重的时候会丢数据,所以尽量还是别用。

STAT:进程的状态。进程状态分为以下几种(不要求记住,但要了解)。

D:不能中断的进程(通常为IO)。

R(run):正在运行中的进程,其中包括了等待CPU时间片的进程。

S(sleep):已经中断的进程。通常情况下,系统的大部分进程都是这个状态。

T:已经停止或者暂停的进程。如果我们正在运行一个命令,比如说sleep 10,我们按一下Ctrl+Z暂停进程时,用ps命令查看就会显示T这个状态。

W:(内核2.6xx以后不可用),没有足够的内存页分配。

X:已经死掉的进程(这个好像从来不会出现)。 Z:僵尸进程,即杀不掉、打不死的垃圾进程,占用系统一点资源,不过没有关系。如果占用太多(一般不会出现),就需要重视了。 <:高优先级进程。 N:低优先级进程。 L:在内存中被锁了内存分页。 s:主进程,后面阿铭讲到nginx或者php-fpm服务的时候,你就能更好地理解它了。 l:多线程进程。 +:在前台运行的进程,比如在当前终端执行ps aux就是前台进程。 ps命令是阿铭在工作中用得非常多的一个命令,所以请记住它。阿铭经常会将ps连同管道符一起使用,用来查看某个进程或者它的数量。示例命令如下:  

# ps aux |grep -c sshd
4
# ps aux |grep sshd
root 814  0.0  0.3  92304  6648 ?        Ss   20:33   0:00 /usr/sbin/sshd -D -oCiphers=aes256-gcm@openssh.com,chacha20-poly1305@openssh.com,aes256-ctr,aes256-cbc,aes128-gcm@openssh.com,aes128-ctr,aes128-cbc -oMACs=hmac-sha2-256-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha2-256,hmac-sha1,umac-128@openssh.com,hmac-sha2-512 -oGSSAPIKexAlgorithms=gss-gex-sha1-,gss-group14-sha1- -oKexAlgorithms=curve25519-sha256,curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1 -oHostKeyAlgorithms=rsa-sha2-256,rsa-sha2-256-cert-v01@openssh.com,ecdsa-sha2-nistp256,ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384,ecdsa-sha2-nistp384-cert-v01@openssh.com,rsa-sha2-512,rsa-sha2-512-cert-v01@openssh.com,ecdsa-sha2-nistp521,ecdsa-sha2-nistp521-cert-v01@openssh.com,ssh-ed25519,ssh-ed25519-cert-v01@openssh.com,ssh-rsa,ssh-rsa-cert-v01@openssh.com -oPubkeyAcceptedKeyTypes=rsa-sha2-256,rsa-sha2-256-cert-v01@openssh.com,ecdsa-sha2-nistp256,ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384,ecdsa-sha2-nistp384-cert-v01@openssh.com,rsa-sha2-512,rsa-sha2-512-cert-v01@openssh.com,ecdsa-sha2-nistp521,ecdsa-sha2-nistp521-cert-v01@openssh.com,ssh-ed25519,ssh-ed25519-cert-v01@openssh.com,ssh-rsa,ssh-rsa-cert-v01@openssh.com -oCASignatureAlgorithms=rsa-sha2-256,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,rsa-sha2-512,ecdsa-sha2-nistp521,ssh-ed25519,ssh-rsa
root 1709  0.0  0.5 151200  9368 ?        Ss   20:54   0:00 sshd: root [priv]
root 1713  0.0  0.2 151200  5300 ?        S    20:54   0:00 sshd: root@pts/0
root 1745  0.0  0.0  12320  1080 pts/0    R+   20:57   0:00 grep --color=auto sshd
  上例中的4不准确,需要减掉1。因为使用grep命令时,grep命令本身也算一个进程。 14.1.8 用netstat命令查看网络状况 具体用法如下:  
# netstat -lnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address         State       PID/Program name    
tcp 0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      814/sshd            
tcp6 0      0 :::22                   :::*                    LISTEN      814/sshd            
udp 0      0 0.0.0.0:68              0.0.0.0:*                           1648/dhclient       
udp 0      0 127.0.0.1:323           0.0.0.0:*                           766/chronyd         
udp6 0      0 :323                 :::*                                766/chronyd         
raw6 0      0 :::58                   :::*                    7           796/NetworkManager  
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type       State         I-Node   PID/Program name     Path
unix 2      [ ACC ]     SEQPACKET  LISTENING     21770    1/systemd            /run/systemd/coredump
unix 2      [ ACC ]     STREAM     LISTENING     25846    783/sssd_nss         /var/lib/sss/pipes/nss
unix 2      [ ACC ]     SEQPACKET  LISTENING     21557    1/systemd            /run/udev/control
unix 2      [ ACC ]     STREAM     LISTENING     24964    1/systemd            /var/run/.heim_org.h5l.kcm-socket
unix 2      [ ACC ]     STREAM     LISTENING     24966    1/systemd            /run/dbus/system_bus_socket
unix 2      [ ACC ]     STREAM     LISTENING     12679    1/systemd            /run/systemd/journal/stdout
unix 2      [ ACC ]     STREAM     LISTENING     32410    1496/systemd         /run/user/0/systemd/private
unix 2      [ ACC ]     STREAM     LISTENING     32419    1496/systemd         /run/user/0/bus
unix 2      [ ACC ]     STREAM     LISTENING     25795    763/sssd             /var/lib/sss/pipes/private/sbus-monitor
unix 2      [ ACC ]     STREAM     LISTENING     25816    780/sssd_be          /var/lib/sss/pipes/private/sbus-dp_implicit_files.780
unix 2      [ ACC ]     STREAM     LISTENING     25804    761/VGAuthService    /var/run/vmware/guestServicePipe
unix 2      [ ACC ]     STREAM     LISTENING     21476    1/systemd            /run/systemd/private
Active Bluetooth connections (only servers)
Proto Destination       Source            State         PSM DCID   SCID      IMTU    OMTU Security
Proto Destination       Source            State     Channel
  若没有此命令,请使用yum install net-tools安装。由于书本页面有限,显示的字符已经换行,看起来有点乱。显示的结果中,上面那一部分是tcp/ip,下面一部分是监听的socket(unix开头的行)。netstat命令用来打印网络连接状况、系统所开放端口、路由表等信息。阿铭最常用的两种用法是netstat -lnp(打印当前系统启动哪些端口)和netstat -an(打印网络连接状况),它们非常有用,请一定要记住。示例如下:  
# netstat -an |head -n 20  // 为了节省空间, 只显示前20行
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address         State      
tcp 0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp 0     52 192.168.72.128:22       192.168.72.1:52219   ESTABLISHED
tcp6 0      0 :::22                   :::*                    LISTEN     
udp 0      0 0.0.0.0:68              0.0.0.0:*                          
udp 0      0 127.0.0.1:323           0.0.0.0:*                          
udp6 0      0 :323                 :::*                               
raw6 0      0 :::58                   :::*                    7          
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type       State         I-Node   Path
unix 2      [ ACC ]     SEQPACKET  LISTENING     21770    /run/systemd/coredump
unix 2      [ ACC ]     STREAM     LISTENING     25846    /var/lib/sss/pipes/nss
unix 2      [ ACC ]     SEQPACKET  LISTENING     21557    /run/udev/control
unix 3      [ ]         DGRAM                    12656    /run/systemd/notify
unix 2      [ ]         DGRAM                    12658    /run/systemd/cgroups-agent
unix 12     [ ]         DGRAM                    12670    /run/systemd/journal/dev-log
unix 2      [ ]         DGRAM                    25475    /var/run/chrony/chronyd.sock
unix 2      [ ACC ]     STREAM     LISTENING     24964    /var/run/.heim_org.h5l.kcm-socket
unix 2      [ ACC ]     STREAM     LISTENING     24966    /run/dbus/system_bus_socket
  最右侧为网络连接的状态,如果你对TCP三次握手比较熟悉,那应该对最后这一列的字符串不陌生。如果你管理是一台提供Web服务(80端口)的服务器,那么就可以使用命令netstat -an |grep 80来查看当前连接Web服务的有哪些IP了。

编辑:黄飞

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分