一、监控IO性能
CPU、内存有剩余,但是系统负载还是很高,用vmstat查看发现b列或者wa列比较大,就说明磁盘有问题,那么就要更详细的查看磁盘。
iostat命令:在安装sysstat包时就会安装此命令。
用法:可以直接输入查看,也可以加数字1,类似vmstat。
# iostat
Linux 3.10.0-693.el7.x86_64 (yaowei-01) 2018年03月21日 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.13 0.00 0.39 0.63 0.00 98.85
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 2.75 90.60 4.51 125916 6262
sdb 0.18 2.58 0.00 3580 0
scd0 0.01 0.74 0.00 1028 0
dm-0 0.03 0.75 0.00 1036 0
# iostat -x(主要关注%util)
Linux 3.10.0-693.el7.x86_64 (yaowei-01) 2018年03月21日 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.12 0.00 0.35 0.55 0.00 98.98
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util(io等待)就比如读写数据都要等待,所占的时间百分比。这列很大,那读和写的两列就也会很大,若读和写两列不大,只有这列大,就说明硬盘可能有故障。
sda 0.01 0.02 2.11 0.32 79.69 3.99 69.07 0.04 14.68 16.69 1.27 5.74 1.39
sdb 0.00 0.00 0.16 0.00 2.27 0.00 28.99 0.00 6.74 6.74 0.00 5.08 0.08
scd0 0.00 0.00 0.01 0.00 0.65 0.00 114.22 0.00 8.00 8.00 0.00 7.11 0.01
dm-0 0.00 0.00 0.03 0.00 0.66 0.00 48.19 0.00 17.91 17.91 0.00 17.44 0.05
当磁盘io很忙很频繁,可以用iotop查看具体哪个进程在读写。
没有该命令就安装,yum install -y iotop。该命令类似top命令。
Total DISK READ : 0.00 B/s | Total DISK WRITE : 0.00 B/s
Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 0.00 B/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
1556 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.02 % [kworker/1:1]
1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % systemd --switched-root --system --deserialize 21
2 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kthreadd]
3 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/0]
5 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kworker/0:0H]
6 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kworker/u256:0]
7 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/0]
8 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [rcu_bh]
9 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [rcu_sched]
10 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [watchdog/0]
11 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [watchdog/1]
12 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/1]
13 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/1]
15 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kworker/1:0H]
17 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kdevtmpfs]
18 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [netns]
19 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [khungtaskd]
21 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kintegrityd]
22 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [bioset]
23 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kblockd]
24 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [md]
25 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kworker/0:1]
31 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kswapd0]
也是动态显示。主要看IO百分比,最高的会排在最上面。
二、free命令
free:查看内存使用情况。
内存的作用:缓解CPU和io的速度差距。
# free
total used free shared buff/cache available
Mem: 1867048 138416 1411044 8772 317588 1535652
Swap: 4194300 0 4194300
# free -h
total used free shared buff/cache available
Mem: 1.8G 135M 1.3G 8.6M 310M 1.5G
Swap: 4.0G 0B 4.0G
三行:1、说明,2、内存的使用情况,3、交换分区的使用情况。
关注的是第二行。
free -h:使用合适的单位显示。就和df -h一样。
free -m:指定单位为M。
free -g:指定单位为G。
total:内存总大小。total=used+free+buff/cache
used:真正使用的实际内存大小。
free:剩余物理内存大小(没分配,纯剩余)
shared:共享内存大小,不用关注它。
buff/cache:分配给buff和cache的内存总共大小。预分配出来的内存。
buffer:缓冲。CPU(数据)到内存,再到磁盘。
cache:缓存。磁盘到内存,再到CPU(数据)。
区分buffer和cache:数据经过CPU计算,即将写入磁盘,此时用的内存为buffer;CPU要计算时,需要把数据从磁盘中读出来,临时先放到内存中,这时用的内存就是cache。
available:剩余物理内存。包含free和buffer/cache剩余部分,就是还没有被buffer/cache使用的部分。查看内存剩余时主要关注它。
三、ps命令(重点)
ps:专门显示系统进程的命令。top命令也可查看,但是没ps那么方便。
# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 128164 6812 ? Ss 02:54 0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root 2 0.0 0.0 0 0 ? S 02:54 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 02:54 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 02:54 0:00 [kworker/0:0H]
root 6 0.0 0.0 0 0 ? S 02:54 0:00 [kworker/u256:0]
root 7 0.0 0.0 0 0 ? S 02:54 0:00 [migration/0]
ps -elf显示的信息和ps -aux基本一样。
进程参数:
PID:进程ID,这个ID很有用。Linux中,内核管理进程就靠pid来识别和管理某一进程。比如想终止某进程,则用命令“kill进pid”,有时这不能终止进程,需要加-9选项,即“kill -9进程pid”,这样使用严重时会丢数据,尽量别用。
STAT:进程状态。
进程状态:
D:不能中断的进程(通常为IO)
R(run):正在运行的进程。
S(sleep):已经中断的进程。通常大部分是这个状态。
T:已经停止或暂停的进程。比如sleep 10,按Ctrl+z暂停进程,就是这个状态。
W:(内核2.6xx以后不可用),没有足够的内存页分配。
X:已经死掉的进程(好像从不出现)
Z:僵尸进程,即杀不掉的垃圾进程。
<:高优先级进程。
N:低优先级进程。
L:在内存中被锁了内存分页。
s:主进程。
l:多线程进程。
+:在前台运行的进程,比如在当前终端执行ps aux就是前台进程。
小技巧:
连同管道符一起使用,用来查看某个进程或者它的数量。示例:
# ps aux |grep -c sshd
3
# ps aux |grep sshd
root 910 0.0 0.2 105996 4076 ? Ss 02:54 0:00 /usr/sbin/sshd -D
root 1593 0.0 0.2 145700 5192 ? Ss 03:51 0:00 sshd: [email protected]/0
root 1738 0.0 0.0 112676 984 pts/0 S+ 05:39 0:00 grep --color=auto sshd
查看进程在哪里启动:ls -l /proc/进程pid/
四、netstat查看网络状态
# netstat -lnp |head -n 10
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 910/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1122/master
tcp6 0 0 :::22 :::* LISTEN 910/sshd
tcp6 0 0 ::1:25 :::* LISTEN 1122/master
raw6 0 0 :::58 :::* 7 617/NetworkManager
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 2 [ ACC ] STREAM LISTENING 16239 559/VGAuthService /var/run/vmware/guestServicePipe
# netstat 查看网络状态
# netstat -lnp查看监听端口,LISTEN就是监听。当前系统启动了哪些端口
# netstat -an 查看系统的所有网络连接状况
# netstat -lntp 只看出tcp的,不包括socket
# ss -an 和netstat异曲同工
小技巧:
# netstat -an |awk '/^tcp/ {++sta[$NF]} END {for(key in sta) print key,"\t",sta[key]}'
LISTEN 4
ESTABLISHED 1 建立连接了正在传数据的,需关注,若数字很大,就说明系统很忙,1000以内算正常。
五、Linux下抓包
1. tcpdump工具
# yum install -y tcpdump
回车这个命令后出现密密麻麻的字符串,按Ctrl+C之前一直刷屏,刷屏越快说明网卡上的数据包越多。
# tcpdump -nn -i ens33
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
06:56:38.608645 IP 192.168.93.130.22 > 192.168.93.1.60875: Flags [P.], seq 3128737334:3128737546, ack 2106545077, win 251, length 212
06:56:38.608960 IP 192.168.93.1.60875 > 192.168.93.130.22: Flags [.], ack 212, win 2051, length 0
06:56:38.608961 IP 192.168.93.130.22 > 192.168.93.1.60875: Flags [P.], seq 212:408, ack 1, win 251, length 196
06:56:38.609091 IP 192.168.93.130.22 > 192.168.93.1.60875: Flags [P.], seq 408:684, ack 1, win 251, length 276
06:56:38.609278 IP 192.168.93.130.22 > 192.168.93.1.60875: Flags [P.], seq 684:848, ack 1, win 251, length 164
06:56:38.609387 IP 192.168.93.1.60875 > 192.168.93.130.22: Flags [.], ack 684, win 2049, length 0
06:56:38.609481 IP 192.168.93.130.22 > 192.168.93.1.60875: Flags [P.], seq 848:1124, ack 1, win 251, length 276
06:56:38.609552 IP 192.168.93.130.22 > 192.168.93.1.60875: Flags [P.], seq 1124:1288, ack 1, win 251, length 164
06:56:38.609630 IP 192.168.93.130.22 > 192.168.93.1.60875: Flags [P.], seq 1288:1452, ack 1, win 251, length 164
只需要关注第3列和第4列,它们显示的信息为哪个IP+端口号在连接哪个IP+端口号。后面的是该数据包的相关信息。
-i:后面跟设备名称,若想抓取其他网卡的数据包,后面则要跟其他网卡的名字。
-nn:作用是让第3列和第4列显示成“IP+端口号”的形式,若不加-nn选项则显示“主机名+服务名称”。
-c:指定抓包数量。
# tcpdump -nn -i ens33 -c 50
常用案例:
# tcpdump -nn -i ens33 port 22 //只抓22端口的包
# tcpdump -nn -i ens33 tcp and not port 22 //抓tcp的包,但是不要22端口的。
# tcpdump -nn -i ens33 port 22 and port 53 //抓22和53端口的包。
2.wireshark工具
# yum install -y wireshark
要执行的命令是tshark,centos默认没有,要安装。
# tshark -n -t a R http.request -T fields -e "frame.time -e "ip.src" -e "http.host"'-e "http.request" -e "http.request.url"
这条命令适用于web服务器,类似于web访问日志。若服务器没有访问日志,可以临时使用该命令查看当前服务器上的web请求。若机器没有开启web服务,则不会显示任何内容。
# tshark -n -i eth1 -R'mysql.query' -T fields -e "ip.src" -e "mysql.query"
抓取eth1网卡mysql的查询都有哪些,该方法仅适用于mysql端口为3306,若不是3306,使用下面的方法:
# # tshark -i eth1 port 3307 -d tcp.port==3301,mysql -z "proto,colinfo,mysql,query,mysql.query"
原文地址:http://blog.51cto.com/13576245/2089248