监控io性能

iostat 命令 iostat 数值 #一秒输出结果一次动态显示

[root@localhost ~]# iostat 1
Linux 3.10.0-514.el7.x86_64 (localhost.localdomain) 2018年07月06日 _x86_64_	(1 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle
           0.59 0.00 0.09 0.02 0.00 99.30

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.47 4.07 14.33 615626 2168024
sdb 0.00 0.02 0.00 2436 0
dm-0 0.00 0.01 0.00 912 0

avg-cpu: %user %nice %system %iowait %steal %idle
           0.99 0.00 0.00 0.00 0.00 99.01

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.00 0.00 0.00 0 0
sdb 0.00 0.00 0.00 0 0
dm-0 0.00 0.00 0.00 0 0

iostat -x 显示io占用

[root@localhost ~]# iostat -x
Linux 3.10.0-514.el7.x86_64 (localhost.localdomain) 2018年07月06日 _x86_64_	(1 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle
           0.59 0.00 0.09 0.02 0.00 99.30

Device: rrqm/s wrqm/s r/s w/s  rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda     0.00   0.24  0.14 0.33 4.06  14.31 77.69    0.01     17.92  2.19    24.57  0.90  0.04
sdb     0.00   0.00  0.00 0.00 0.02  0.00  12.40    0.00     0.55   0.55    0.00   0.39  0.00
dm-0    0.00   0.00  0.00 0.00 0.01  0.00  15.20    0.00     0.33   0.33    0.00   0.30  0.00

iostat命令我们只可以关注%util 这项, 表示为io读写状态占比,数值大表示io占用越高

iotop 命令 默认没有iotop命令,需要使用yum安装 yum install -y iotop 直接执行iotop就可以动态显示出io动态读写状态

 Total DISK READ :        0.00 B/s  |Total DISK WRITE :        3.90 K/s
  Actual DISK READ:        0.00 B/s  |Actual DISK WRITE:        39.01 K/s 
  TID   PRIO USER   DISK_READ DISK_WRITE   SWAPIN    IO>          COMMAND
  285   be/3 root   0.00 B/s  0.00 B/s      0.00 %   0.35 %       [jbd27vda18]
  24755 be/4 root   0.00 B/s  0.00 B/s      0.00 %   0.03 %       [kworker/l:21]
  2027  be/4 tomcat 0.OO B/s  3.90 K/s      0.00 %   0.00 %       java -server - Xms2048m - Xmx409~atalina .startup .Bootstrap start
  1     be/4 root   0.00 B/s  0.00 B/s      0.00 %   0.00 %       systemd --system --deserialize 
  212   be/4 root   0.00 B/s  0.00 B/s      0.00 %   0.00 %       [kthreadd]
  3     be/4 root   0.00 B/s I0.00 B/s      0.00 %   0.00 %       [ksoftirqd/0]
  6150  be/4 tomcat 0.00 B/s  0.O0 B/s      0.O0 %   0.O0 %       java -server - Xms2048m - Xmx4o9~atalina . startup.Bootstrap start

DISK READ:为磁盘的读取速度,会以常见的容量单位显示 DISK WRITE :为磁盘的写入速度,同样以常见的容量单位显示 第三行分别为 TID 进程的IO使用ID
USER 运行用户
DISK_READ 使用磁盘的读取速度
DISK_WRITE 使用磁盘的写入速度
SWAPIN 数据使用交换分区的占比
IO> 进程正在使用磁盘io的占比
COMMAND 使用磁盘的io进程

free查看内存使用状态

 [root@localhost ~]# free
              total        used        free      shared  buff/cache   available
Mem:        1016476      117676      139440        6816      759360      692296
Swap:       2097148         228     2096920
[root@localhost ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:            992         114         136           6         741         676
Swap:          2047           0        2047
[root@localhost ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           992M        114M        136M        6.7M        741M        676M
Swap:          2.0G        228K        2.0G

linux中内存表述是:总内存(total) = used + free + buff/cache 的容量,buff/cache是系统预分配内存 avaliable包含free和buff/cache剩余部分内存 关于buff/cache理解 buff/cache是系统预分配的内存空间,这部分空间是未使用的,作为缓存缓冲使用 计算机读取运算数据时,会从硬盘读数据到CPU处理,但是这中间磁盘的传输速率远远低于CPU运算速率,这样会导致CPU会长时间等待硬盘的数据,为了时CPU不等待硬盘的数据读取的怠慢,在CPU和硬盘间建立cache缓存层,CPU读取数据时会从内存的cache当中读取,不需要从硬盘读取
当CPU处理完数据时会存储到硬盘中,但是两者数量相差大,CPU处理完的数据不可能等待数据慢慢存储到硬盘,这时候就需要把CPU处理完的数据交给内存存储,这部分数据叫做buff缓冲层,内存中的buff再存储到硬盘中

ps命令

ps aux 查看系统中所有进程信息 ps -elf 查看系统中所有进程信息

[root@localhost ~]# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.3  43360  3244 ?        Ss   7月04   0:01 /usr/lib/systemd/systemd --system --deserialize 15
root         2  0.0  0.0      0     0 ?        S    7月04   0:00 [kthreadd]
root         9  0.0  0.0      0     0 ?        R    7月04   0:02 [rcu_sched]
root        12  0.0  0.0      0     0 ?        S<   7月04   0:00 [khelper]
root        27  0.0  0.0      0     0 ?        SN   7月04   0:00 [ksmd]
root       601  0.0  0.1  55476  1328 ?        S<sl 7月04   0:00 /sbin/auditd -n
polkitd    632  0.0  0.8 528332  8144 ?        Ssl  7月04   0:00 /usr/lib/polkit-1/polkitd --no-debu
root      2199  0.0  0.2 115836  2352 tty1     Ss+  7月04   0:00 -bash
root      3569  0.0  0.1 151112  1848 pts/0    R+   10:18   0:00 ps -aux

USER 运行进程的用户 PID 进程的PID号,可以通过PID来查找PID进程的路径,使用ls -l /proc/进程PID来查看进程所在目录 %CPU cpu使用百分比 %MEM 内存使用百分比 VSZ 虚拟内存使用量 RSS 物理内存使用量 TTY 在哪个终端运行 STAT 进程运行状态,这个是需要着重关注的,下面会详解各种进程状态 START 进程启动时间 TIME 进程运行的累计时间 COMMAND 进程的运行路径

STAT进程运行状态

  • 正在前台终端里运行的进程 D 不能中断的进程,这类进程会使平均负载增高的假象,这时只能看CPU使用率来判断是否负载过高 R run运行状态的进程 S sleep休眠状态的进程,这类进程可能是每隔一段时间运行一次,不运行状态时会是sleep状态,即休眠状态 T 暂停的进程,这类进程是命令或执行文件中止挂起的状态,如top查看后按ctrl+z挂起 Z 僵尸进程,主进程崩溃,遗留的子进程就有可能成为僵尸进程 < 高优先级进程,进程会比其他进程优先得到CPU运算处理 N 低优先级进程,不重要进程任务,会其次得到CPU运算 L 内存中被锁了内存分页的进程,不常见 s 主进程,属于程序主进程,在该进程下会有其他类型的子进程,如Ssl 这是一个休眠中的多线程进程 l 多线程进程,如httpd这样的程序会生成多个进程,httpd的多线程如下:
[root@localhost ~]# ps -aux |grep httpd
root 1325 0.0 0.2 70956 2164 ? Ss 7月04 0:07 /usr/local/httpd/bin/httpd
daemon 1326 0.0 0.4 490992 4760 ? Sl 7月04 0:00 /usr/local/httpd/bin/httpd
daemon 1327 0.0 0.4 359920 4256 ? Sl 7月04 0:00 /usr/local/httpd/bin/httpd
daemon 1328 0.0 0.4 359920 4256 ? Sl 7月04 0:00 /usr/local/httpd/bin/httpd
root 3623 0.0 0.0 112724 972 pts/0 R+ 11:09 0:00 grep --color=auto httpd

netstat网络查看工具

netstat -i查看网络传输报文状态

[root@localhost ~]# netstat -i
Kernel Interface table
Iface         MTU      RX-OK    RX-ERR   RX-DRP RX-OVR    TX-OK  TX-ERR TX-DRP TX-OVR     Flg
enp0s3    1500      349797      0              0                0             72139      0            0              0         BMRU
lo             65536    26560       0               0                0             26560      0            0              0         LRU

netstat -lnp 查看监听端口

[root@localhost ~]# 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      1096/sshd 
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1405/master
tcp6       0      0 :::80                   :::*                    LISTEN      1325/httpd 
tcp6       0      0 :::22                   :::*                    LISTEN      1096/sshd 
tcp6       0      0 ::1:25                  :::*                    LISTEN      1405/master 

netstat -an 查看系统的网络连接状态并过滤出系统访问的链接数

[root@localhost ~]# netstat -an |awk '/^tcp/{++sta[$NF]} END {for(key in sta) print key,"\t",sta[key]}'
LISTEN 	 13
SYN_RECV 	 1
CLOSE_WAIT 	 7
ESTABLISHED 	 113
FIN_WAIT1 	 2
FIN_WAIT2 	 14
SYN_SENT 	 1
TIME_WAIT 	 119

netstat -lntp 只查看tcp网络状态,不包含socket进程文件的通信

[root@localhost ~]# netstat -lntp
(No info could be read for "-p": geteuid()=1001 but you should be root.)
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:8009            0.0.0.0:*            LISTEN      -  
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      - 
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      -  
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      -  
tcp        0      0 0.0.0.0:43188           0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      - 
tcp        0      0 127.0.0.1:32000         0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.1:8005          0.0.0.0:*               LISTEN      -   
tcp6       0      0 :::111                  :::*                    LISTEN      -  
tcp6       0      0 :::80                   :::*                    LISTEN      -  
tcp6       0      0 :::34033                :::*                    LISTEN      - 
tcp6       0      0 :::443                  :::*                    LISTEN      -  

-a: 显示所有的socket,包括监听的以及未监听的。 -n: 不使用域名和服务名,而使用IP和端口号。 -l: 仅列出在listen状态的网络服务。 -p: 显示建立连接的程序名和PID。 -e: 显示以太网统计。 -s: 显示每个协议的统计。 -t:显示TCP协议连接情况。 -u: 显示UDP协议连接情况。 -c: 每隔一个固定时间,执行netstat命令。 -r:显示核心路由表。 -i: 显示所有的网络接口信息

tcpdump抓包工具

默认没有tcpdump工具,安装yum install -y tcpdump

tcpdump  -nn -i  eth1   抓包过滤使用-nn直接显示端口号,-i指定网卡
[root@localhost ~]# tcpdump -nn -i enp0s3
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp0s3, link-type EN10MB (Ethernet), capture size 262144 bytes
12:21:58.531390 IP 192.168.1.223.22 > 192.168.1.112.3152: Flags [P.], seq 541600822:541601034, ack 2246602278, win 251, length 212
12:21:58.532248 IP 192.168.1.223.22 > 192.168.1.112.3152: Flags [P.], seq 212:408, ack 1, win 251, length 196
12:21:58.532612 IP 192.168.1.112.3152 > 192.168.1.223.22: Flags [.], ack 212, win 16359, length 0
12:21:58.532888 IP 192.168.1.223.22 > 192.168.1.112.3152: Flags [P.], seq 408:668, ack 1, win 251, length 260

上面抓取的内容会抓取整个网卡通过的数据流,所有输出显示的较多,输出的每一行格式为:当前系统时间  发送数据的起始IP  >  接收数据的IP   数据响应信息(如发送字节数,窗口值等)

tcpdump -nn port  80  只抓取80端口的数据流信息,其中可以看出访问页面及响应状态

[root@localhost ~]# tcpdump -nn port 80
12:29:16.489105 IP 192.168.1.112.7919 > 192.168.1.223.80: Flags [P.], seq 1:470, ack 1, win 16425, length 469: HTTP: GET /502.html HTTP/1.1
12:29:16.489210 IP 192.168.1.223.80 > 192.168.1.112.7919: Flags [.], ack 470, win 237, length 0
12:29:16.489997 IP 192.168.1.223.80 > 192.168.1.112.7919: Flags [P.], seq 1:180, ack 470, win 237, length 179: HTTP: HTTP/1.1 304 Not Modified

tcpdump -nn port 80 and host 192.168.1.112 只抓取特定ip过来的数据流信息 如192.168.1.112通过一个随机的7770端口向192.168.1.223请求访问报头,192.168.1.223通过80端口向192.168.1.112的7770端口发送响应数据

[root@localhost ~]# tcpdump -nn port 80 and host 192.168.1.112
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp0s3, link-type EN10MB (Ethernet), capture size 262144 bytes
12:18:56.185132 IP 192.168.1.112.7770 > 192.168.1.223.80: Flags [S], seq 1158024991, win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0
12:18:56.185209 IP 192.168.1.223.80 > 192.168.1.112.7770: Flags [S.], seq 1550338681, ack 1158024992, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0

tcpdump将抓包结果保存到文件 如抓取80的访问流信息,文件保存到指定的目录,使用tcpdump -r 记录文件 来查看

[root@localhost ~]# tcpdump -nn port 80 -c 100 -w /tmp/1.cap
tcpdump: listening on enp0s3, link-type EN10MB (Ethernet), capture size 262144 bytes
100 packets captured
100 packets received by filter
0 packets dropped by kernel

查看tcpdump抓包保存的记录文件内容,抓包产生的文件为数据流内容,直接使用cat命令是不可查看的,需要使用-r命令来读取文件内容

[root@localhost ~]# tcpdump -r /tmp/1.cap 
reading from file /tmp/1.cap, link-type EN10MB (Ethernet)
12:35:22.487066 IP 192.168.1.112.pushns > localhost.localdomain.http: Flags [S], seq 2437427588, win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0
12:35:22.487181 IP localhost.localdomain.http > 192.168.1.112.pushns: Flags [S.], seq 599616243, ack 2437427589, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
12:35:22.489080 IP 192.168.1.112.pushns > localhost.localdomain.http: Flags [.], ack 1, win 16425, length 0
12:35:22.493077 IP 192.168.1.112.pushns > localhost.localdomain.http: Flags [P.], seq 1:496, ack 1, win 16425, length 495: HTTP: GET /502.html HTTP/1.1

tshark抓包工具 linux默认没有安装tshark工具,需要使用yum安装:yum install -y 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"

可以查看出80端口的web访问状态

[root@localhost ~]# 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 'enp0s3'
"Jul 6, 2018 12:47:58.618927019 CST"	192.168.1.111	239.255.255.250:1900	M-SEARCH	*
"Jul 6, 2018 12:48:02.620355558 CST"	192.168.1.112	192.168.1.223	GET	/502.html
"Jul 6, 2018 12:48:04.367065418 CST"	192.168.1.103	239.255.255.250:1900	M-SEARCH	*
"Jul 6, 2018 12:48:19.200921492 CST"	192.168.1.112	192.168.1.223	GET	/50

tshark使用参数的详解请看转载的另一篇文章:http://blog.51cto.com/8844414/2140567