监控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