Linux日常运维(二)—进程、内存网络监控

Linux日常运维(二)—进程、内存网络监控

Administrator 1101 2018-05-06

本文主要介绍LInux日常运维中如何监控io性能,以及free查看内存的命令和ps查看进程的命令,另外介绍如何查看网络状态并且对网络进行抓包的相关知识。


磁盘监控

iostat命令

  • 使用vmstat查看系统状态时,如果bi、bo或者wa列数值过高,那么需要查看磁盘更详细的状态,就可以使用iostat命令;

  • iostat命令是在安装sysstat软件包时一并安装到系统中的,直接执行iostat命令可以查看系统中各个磁盘的详细信息,也可以像vmstat命令一样执行iostat 1命令每秒刷新输出磁盘信息;

    [root@evobot ~]# iostat 
    Linux 3.10.0-693.21.1.el7.x86_64 (evobot) 	2018年05月06日 	_x86_64_	(1 CPU)
    
    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
               0.61    0.00    0.24    0.29    0.00   98.85
    
    Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
    vda               2.04         0.29        18.04     454791   27963960
    scd0              0.00         0.00         0.00        552          0
    
  • 列出的信息中,每列分别表示设备名、每秒进程下发的IO读写请求数量、每秒读取的kB数,每秒写入的kB数、取样时间间隔内读取的kB总数和取样时间间隔内写入的kB总量;

  • 上面的输出信息与sar -b查看到的内容是一样的,更常用的用法为iostat -x 1:

    [root@evobot ~]# iostat -x
    Linux 3.10.0-693.21.1.el7.x86_64 (evobot) 	2018年05月06日 	_x86_64_	(1 CPU)
    
    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
               0.61    0.00    0.24    0.29    0.00   98.85
    
    Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
    vda               0.00     2.36    0.01    2.03     0.29    18.04    17.98     0.03   16.11    9.70   16.16   1.77   0.36
    scd0              0.00     0.00    0.00    0.00     0.00     0.00     9.95     0.00    1.41    1.41    0.00   1.41   0.00
    
    • 这里列出的信息,主要关注%util列,其表示进程被I/O需求消耗的CPU百分比,如果这里的值超过50%,但wkB/s和rkB/s比较小,则说明磁盘io繁忙,磁盘存在一些问题,可能需要更换磁盘;

iotop命令

  • 当我们使用iostat查看到磁盘io较高时,可能需要查看是哪个进程的磁盘读写较高,就可以使用iotop命令,使用iotop命令需要安装iotop软件包;

  • 执行iotop命令,其命令输出类似于top命令,每秒钟刷新一次:

    iotop

  • 主要关注的是IO列和COMMAND列,来查看具体哪个进程占用IO比例最高;


内存和进程监控

free命令

  • free命令主要用来查看内存的使用情况:

    [root@evobot ~]# free
                  total        used        free      shared  buff/cache   available
    Mem:        1883540       97652      468720         392     1317168     1586592
    Swap:             0           0           0
    
  • 所列出的信息中,第一行为标题,第二行为内存使用情况,第三行为交换分区使用情况;

  • 各列所表示信息如下表,默认free命令输出信息单位为kB,可以使用free -m转换单位为MB,或者使用free -h人性化显示:

标示说明
total内存总大小
used内存已被使用的大小
free空闲内存大小
shared共享的内存大小
buff/cache缓冲(buff)及缓存(cache)大小,cache是从磁盘预先读取出来准备送往CPU处理的数据,buf则是CPU处理完的准备存储到磁盘上的数据
available表示空闲内存加上未分配给buff/cache的内存大小
  • free命令的输出中,total=used+free+buff/cache,而avaliable=free+(buff/cache剩余部分),所以在查看内存状态时,应该关注的是avaliable的值。
  • 而swap行如果占用过高,或者swap剩余为0,则需要增加内存,或者有程序存在内存泄露,需要进一步排查。

ps命令

  • ps命令用来查看当前系统运行的进程快照,ps aux用来查看所有的进程,并列出进程命令;

  • 常用使用ps命令与管道符和grep使用查看具体的进程是否运行,另外查看进程也可以用ps -elf命令:

    ps

  • ps命令可以查看到进程的PID,PID可以用来杀死一个进程,使用kill [pid]命令杀死进程;

  • 使用ls -l /proc/[pid]可以查看进程运行的信息和相关文件:

    [root@evobot ~]# ls -l /proc/447/
    总用量 0
    dr-xr-xr-x 2 root root 0 4月  19 00:35 attr
    -rw-r--r-- 1 root root 0 5月   7 22:47 autogroup
    -r-------- 1 root root 0 5月   7 22:47 auxv
    -r--r--r-- 1 root root 0 4月  19 00:35 cgroup
    --w------- 1 root root 0 5月   7 22:47 clear_refs
    -r--r--r-- 1 root root 0 4月  19 00:35 cmdline
    -rw-r--r-- 1 root root 0 4月  19 00:35 comm
    -rw-r--r-- 1 root root 0 5月   7 22:47 coredump_filter
    -r--r--r-- 1 root root 0 5月   7 22:47 cpuset
    lrwxrwxrwx 1 root root 0 5月   7 22:47 cwd -> /
    -r-------- 1 root root 0 5月   7 22:38 environ
    lrwxrwxrwx 1 root root 0 4月  19 00:35 exe -> /usr/sbin/auditd
    
  • ps命令所列的信息中,包括CPU和内存百分比,VSZ表示进程占用的虚拟内存,RSS表示进程占用的物理内存与top命令的RES列相同,TTY表示进程在哪个tty所运行,START表示进程开始运行的时间,TIME表示进程运行的总时间,COMMAND表示进程的命令,STAT表示进程的状态,具体存在的状态如下表:

状态表示字符说明
D不能中断的进程
Rrun状态正在运行的进程
Ssleep睡眠状态的进程,有些进程运行时占用CPU时间非常短暂,也会显示为S
T暂停的进程,如ctrl+z暂停的进程
+表示前台进程
Z僵尸进程
<高优先级进程,有限占用CPU资源
N低优先级进程
L内存中被锁了内存分页的进程,少见
s主进程,例如nginx进程,存在一个主进程,另外还衍生出多个子进程
l多线程进程,一个进程可以有多个线程,线程间共享进程的内存

网络监控和抓包

netstat命令

  • netstat命令用来查看系统的网络状态,常用的用法分为以下三种:

    1. netstat -lnp:查看服务监听的端口,如下图,tcp和udp分别监听的端口,另外也列出了系统的socket文件:

    netstat -lnp

    1. netstat -an:查看系统的网络连接状态,具体状态含义可以查看tcp的三次握手和四次挥手

    netstat -an

    1. 上面的命令输出中将TCP和UDP都列出来了,如果想要只查看tcp连接,可以使用-t参数,查看udp连接使用-u参数,使用这两个参数时不会列出socket:
    [root@evobot ~]# netstat -ant
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State      
    tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN     
    tcp        0      0 0.0.0.0:2233            0.0.0.0:*               LISTEN     
    tcp        0     36 10.139.151.2:2233       118.113.205.177:25473   ESTABLISHED
    
    [root@evobot ~]# netstat -anu
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State      
    udp        0      0 10.139.151.2:34290      114.114.114.114:53      ESTABLISHED
    udp        0      0 10.139.151.2:123        0.0.0.0:*                          
    udp        0      0 127.0.0.1:123           0.0.0.0:*                          
    udp        0      0 0.0.0.0:123             0.0.0.0:*                          
    udp6       0      0 :::123                  :::*                              
    
  • ss -an命令同样也可以输出系统的网络连接状态,但不会显示进程名:

    [root@evobot ~]# ss -an
    Netid  State      Recv-Q Send-Q       Local Address:Port                      Peer Address:Port              
    nl     UNCONN     0      0                        0:490                                   *                   
    u_str  ESTAB      0      0      /run/systemd/journal/stdout 12258                                * 12257              
    udp    ESTAB      0      0             10.139.151.2:35758                  114.114.114.114:53                 
    udp    UNCONN     0      0             10.139.151.2:123                                  *:*                  
    udp    UNCONN     0      0                127.0.0.1:123                                  *:*                  
    tcp    LISTEN     0      128                      *:111                                  *:*                  
    tcp    LISTEN     0      128                      *:2233                                 *:*                  
    tcp    ESTAB      0      0             10.139.151.2:2233                   118.113.205.177:25473              
    
  • netstat -an | awk '/^tcp/{++sta[$NF]} END {for(key in sta) print key,"\t",sta[key]}'命令可以统计出系统各个网络连接的总数:

    [root@evobot ~]# netstat -an | awk '/^tcp/{++sta[$NF]} END {for(key in sta) print key,"\t",sta[key]}'
    LISTEN 	 2
    ESTABLISHED 	 1
    
    • 这其中我们主要关注ESTABLISHED状态数,其表示正在和服务器通信的连接数。

tcpdump命令

  • tcpdump命令是用来网络抓包的命令行工具,使用前需要安装tcpdump软件包;

  • 常用用法有以下几种:

    1. tcpdump -nn -i [网卡名]: 这里的参数-nn,第一个n表示显示ip地址,否则显示主机名,第二个n表示显示端口,否则使用服务名表示;

    tcpdump -nn

    tcpdump -i

    上面的输出中分别表示时间,IP,源ip.端口,目的ip.端口以及数据包信息;

    1. tcpdump -nn port [端口号]:抓取指定端口的数据包,同样也可以使用tcpdump -nn -i eth0 not port [端口号]抓取除指定端口外的数据包,或者tcpdump -nn -i eth0 not port [端口号] and host [ip地址]来抓取指定host除指定端口外的数据包:
    root@Deppin:~# tcpdump -nn -i wlp2s0 not port 22 and host 180.97.33.108
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on wlp2s0, link-type EN10MB (Ethernet), capture size 262144 bytes
    00:23:25.460925 IP 192.168.199.199.43109 > 180.97.33.108.80: Flags [F.], seq 836106603, ack 3946427568, win 229, length 0
    00:23:29.332936 IP 192.168.199.199.43109 > 180.97.33.108.80: Flags [F.], seq 0, ack 1, win 229, length 0
    00:23:29.332966 IP 192.168.199.199.34253 > 180.97.33.108.80: Flags [F.], seq 3073252526, ack 1107915791, win 229, length 0
    00:23:29.332975 IP 192.168.199.199.42371 > 180.97.33.108.80: Flags [F.], seq 1787139822, ack 537241163, win 229, length 0
    ^C
    4 packets captured
    4 packets received by filter
    0 packets dropped by kernel
    
    1. 也可以指定抓取的数据包个数和指定存储到哪个文件:root@Deppin:~# tcpdump -nn -i wlp2s0 -c 5 -w /tmp/1.cap:
    root@Deppin:~# tcpdump -nn -i wlp2s0 -c 5 -w /tmp/1.cap
    tcpdump: listening on wlp2s0, link-type EN10MB (Ethernet), capture size 262144 bytes
    5 packets captured
    35 packets received by filter
    0 packets dropped by kernel
    
    root@Deppin:~# file /tmp/1.cap 
    /tmp/1.cap: tcpdump capture file (little-endian) - version 2.4 (Ethernet, capture length 262144)
    
  • 抓取的文件是无法使用cat命令查看的,查看需要使用tcpdump -r [filename]进行查看。

  • tshark命令是类似tcpdump的工具,使用这个命令需要安装wireshark软件包,常用用法如下:

    # tshark -n -t a -R http.request -T fields -e "frame.time" -e "ip.src" -e "http.host" -e "http.request.method" -e "http.request.uri"
    tshark: -R without -2 is deprecated. For single-pass filtering use -Y.
    Running as user "root" and group "root". This could be dangerous.
    Capturing on 'eth0'
    "May  8, 2018 00:35:03.807043090 CST"	10.139.151.2	receiver.barad.tencentyun.com	POST	/ca_report.cgi
    "May  8, 2018 00:35:08.814790915 CST"	10.139.151.2	receiver.barad.tencentyun.com	POST	/ca_report.cgi
    "May  8, 2018 00:35:13.823298617 CST"	10.139.151.2	receiver.barad.tencentyun.com	POST	/heart_report.cgi
    "May  8, 2018 00:35:18.831342319 CST"	10.139.151.2	receiver.barad.tencentyun.com	POST	/ca_report.cgi
    "May  8, 2018 00:35:23.840005021 CST"	10.139.151.2	receiver.barad.tencentyun.com	POST	/ca_report.cgi
    ^C1 packet dropped
    5 packets captured
    
  • 上面的命令可以看到详细的ip地址、访问的网址,请求方法和请求的资源。关于tshark更多的用法,可以参考tshark----wireshark的命令行工具