1、iostat:用于监视系统的输入输出设备(磁盘)和CPU的使用情况,特点是报告磁盘活动的统计情况和CPU的使用情况,通vmstat一样,它们的弱点都是不能对某一进程进行具体的分析,只能对系统的整体情况进行的分析:
而iostat的常用选项 iostat -x
注:iostat同sar用的同一个安装包(sysstat), 主要看%util(重要):表示IO等待,有多少时间占用cpu.
[root@localhost ~]# iostat -x
Linux 3.10.0-514.26.2.el7.x86_64 (localhost) 08/02/2018 _x86_64_ (1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.13 0.00 0.08 0.01 0.00 99.79
Device: r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 0.00 0.33 0.02 1.84 11.28 0.00 4.97 7.80 4.96 0.34 0.01
注释:%util表示IO等待占比,表示磁盘有多少时间是占用cpu的,该值通常与r/w成正比,如果该值很大,读写值很慢,说明磁盘存在问题,如果该值超过50%了,说明磁盘很忙:
2、iotop:用来监视磁盘IO使用情况的top类工具(动态),iotop与top相似(用户、PID、进程)等相关信息,linux下的IO统计工具(iostat/nmon)只能统计到设备的读写情况,如果想知道每个进程是如何使用IO的就比较麻烦,而使用iotop就可以很方便的查看:
在此我们主要关注I/O这一列就可以了:
[root@localhost ~]# iotop
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
1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % systemd --
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/u2: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]
12 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kdevtmpfs]
13 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [netns]
注释:快捷键使用:
方向键左右键:改变排序的方式,默认IO排序(如果往左则按硬盘的r/w排序,用户,PID排序等,往右则按程序名称排序):
r/R:改变排序顺序:如用方向左键切换到TID排序,默认是从小到达排序,用r/R则是按从大到小排序:
o/O:只显示有I/O输出的程序呦:
p/P:进程/线程之间的切换(第一列): PID(进程)=====TID(线程)
a/A:显示累积I/O使用量:总的大小:
q/Q:退出:
3、free:查看当前系统内存的总大小以及使用情况,还可以显示被内核使用的内存缓存区:
语法:free options:
options:
-b/k/m/g:分别以byte、KB、MB、GB为单位显示:
-h:表示以合适的单位显示:
-t:显示内存总和:
[root@localhost ~]# free
total used free shared buff/cache available
Mem: 1016396 83436 74668 340 858292 763900
Swap: 0 0 0
[root@localhost ~]# free -h #以合适的单位显示:
total used free shared buff/cache available
Mem: 992M 81M 72M 340K 838M 746M
Swap: 0B 0B 0B
注释:
total:表示内存的总大小:
used:表示已使用的物理内存大小:
free:表示剩余物理内存大小(没有被分配的,纯剩余):
shared:共享内存大小,不用关注它:
buff/cache:它俩只是内存的一部分,而内存是用来缓解CPU和I/O(磁盘)之间的差距(cpu计算速度快,而磁盘处理数据是慢):
buff:数据经过cpu计算后,存放在内存中,等待写入磁盘,存放的内存就是buff:: 如: cpu快(00000)----->内存(buff)----->磁盘(慢)
cache:磁盘处理数据后,存在在内存中,等待cpu读取计算,存放的内存就是cahce::如:磁盘慢(00000)----->内存(cache)---->cpu(快)
计算内存大小的隐藏公式:
总大小:total=used+free+buff/cache
available=free+buff/cache(未使用的那部分内存)
4、ps命令:用于查看当前系统的进程的状态,是最基本及最强大的进程查看命令,可以用来查看那些进程正在运行,进程处于什么状态,那些进程占用了过多的资源(内存)等,大部分信息都可以通过此命令查询到:
语法:ps options
options:
a:表示当前系统下通过tty/pts的登录用户情况(PID/TTY/状态/启动时间/正在运行的程序):
u:详细显示当前各个终端下用户的%cpu、%mem、VSZ、RSS的具体情况:
x:显示当前系统中的所有进程(历史进程):
e:它的用法功能同a相同:显示进程的详细信息:
l:用法同u相同:
f:显示PID、PPID、C与STIME栏:
注意:ps aux ===== ps elf #这两者的作用和显示均相同,看个人使用习惯:如下:
[root@localhost ~]# ps -elf
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
1 S root 2 0 0 80 0 - 0 kthrea 2017 ? 00:00:02 [kthreadd]
1 S root 3 2 0 80 0 - 0 smpboo 2017 ? 00:00:54 [ksoftirqd/0]
1 S root 5 2 0 60 -20 - 0 worker 2017 ? 00:00:00 [kworker/0:0H]
1 S root 6 2 0 80 0 - 0 worker 2017 ? 00:00:58 [kworker/u2:0]
1 S root 7 2 0 -40 - - 0 smpboo 2017 ? 00:00:00 [migration/0]
1 S root 8 2 0 80 0 - 0 rcu_gp 2017 ? 00:00:00 [rcu_bh]
[root@localhost ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2 0.0 0.0 0 0 ? S 2017 0:02 [kthreadd]
root 3 0.0 0.0 0 0 ? S 2017 0:54 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 2017 0:00 [kworker/0:0H]
root 6 0.0 0.0 0 0 ? S 2017 0:58 [kworker/u2:0]
root 7 0.0 0.0 0 0 ? S 2017 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S 2017 0:00 [rcu_bh]
用户 进程ID cpu率 内存率 虚拟内存
注释:有时则需要重点关注START状态这一列:
START:
D:不能中断的进程(通常是磁盘I/O):
R:run,正在运行的进程,某一个时间段内,也包括了等待CPU时间片的进程:
S:sleep,已经中断的进程(系统大部分进程都是这个状态):
T:暂停得进程,如正在用运行的一个命令(sleep 10),按ctrl+z结束后,就会显示此状态:
+:表示前台进程:
Z:僵尸进程(杀不死的进程,会占用一点点系统资源,很少出现,),有时当主进程意外死亡后,剩下子进程飘着产生的:
<:高优先级的进程,优先使用cpu的进程:
N:低优先级的进程:
s:主进程:
l:(小写L)多线程进程:
L:在内存中被锁了分页的进程:
注:需要了解下进程和线程的区别呢:
最大的区别:
1、进程里面包含了线程、线程则是进程的子单元:
2、同一个进程下的线程全部共享此进程的内存,而进程之间是相互隔离呢:
3、一个进程里有多个线程,线程则共享进程的内存:
下面举几个简单的列子:
[root@localhost ~]# sleep 1000 #开启一个任务,并用crtl+z暂停:
^Z
[1]+ Stopped sleep 1000
[root@localhost ~]# ps aux |grep sleep #并用ps查看发现此进程处于T(暂停)状态:
root 30134 0.0 0.0 107892 608 pts/0 T 20:50 0:00 sleep 1000
测试1:
[root@localhost ~]# sleep 1000 & #此时在创建一个进程,并放在后台去运行:
[1] 30151
[root@localhost ~]# ps aux |grep sleep #发现处于中断的进程:
root 30151 0.0 0.0 107892 608 pts/0 S 20:56 0:00 sleep 1000
root 30153 0.0 0.0 112644 968 pts/0 R+ 20:57 0:00 grep --color=auto sleep
[root@localhost ~]# jobs #但用jobs查看时发现是处于运行状态:
[1]+ Running sleep 1000 &
测试2:
[root@localhost ~]# vmstat 1 100 & #后台运行vmstat命令,1秒1次,运行100次:
0 0 0 70900 121464 739408 0 0 0 0 32 139 0 0 100 0 0
0 0 0 70900 121464 739408 0 0 0 0 61 183 1 0 99 0 0
0 0 0 70932 121464 739408 0 0 0 0 58 178 0 0 100 0 0
0 0 0 70932 121464 739408 0 0 0 0 37 152 0 1 99 0 0
0 0 0 70932 121464 739408 0 0 0 0 52 169 0 0 100 0 0
此时我们打开第二个终端查看,发现也处于S(中断)状态:
[root@localhost ~]# ps aux |grep vmstat
root 30284 0.0 0.1 148304 1360 pts/0 S 21:06 0:00 vmstat 1 100
root 30290 0.0 0.0 112644 964 pts/2 R+ 21:06 0:00 grep --color=auto vmstat
如上图所示:虽然sleep和vmstat都在后台去运行了,但不是显示run状态(同一时刻cpu只能处理一个进程,也就是说只能有一个进程在运行),而ps查看时只是在某一时刻抓取一下,所以不一定能抓到R的时候,看你自己的运气了:
5、监控网络状态:netstat
语法:netstat options
options:
-l:listening,只显示监听的端口:
-n:numberic:显示连接时用IP地址,而不适用用域名服务器显示:
-p:programs:显示正在使用socket的程序识别码和程序名称:
-a:all,显示所有连接,列出所有端口:
-t:显示tcp协议的连接情况:
-u:显示udp协议的连接情况:
以上选项可组合:最常用的有
netstat -lnp
netstat -an
netstat -s #列出所有端口的统计信息:
netstat -pt #列出所有pid和进程名称:
netstat -rn #显示路由信息,等同于route -n:
netstat -ie #显示网络接口详细信息,等同与ifconfig :
[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:52588 0.0.0.0:* LISTEN 26231/sshd
udp 0 0 0.0.0.0:68 0.0.0.0:* 11374/dhclient
udp 0 0 0.0.0.0:28752 0.0.0.0:* 11374/dhclient
udp 0 0 172.17.192.247:123 0.0.0.0:* 824/ntpd
udp 0 0 127.0.0.1:123 0.0.0.0:* 824/ntpd
udp 0 0 0.0.0.0:123 0.0.0.0:* 824/ntpd
udp6 0 0 :::50807 :::* 11374/dhclient
udp6 0 0 :::123 :::* 824/ntpd
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 2 [ ACC ] STREAM LISTENING 5501588 14066/AliYunDun /tmp/Aegis-<Guid(5A2C30A2-A87D-490A-9281-6765EDAD7CBA)>
unix 2 [ ACC ] STREAM LISTENING 9608 1/systemd /run/systemd/private
proto则为socket的使用文件:
[root@localhost ~]# netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:52588 0.0.0.0:* LISTEN
tcp 0 0 172.17.192.247:52588 111.196.246.149:22566 ESTABLISHED
tcp 0 52 172.17.192.247:52588 111.196.246.149:22546 ESTABLISHED
tcp 0 0 172.17.192.247:35644 106.11.248.51:80 ESTABLISHED
tcp 401 0 172.17.192.247:60936 140.205.140.205:80 CLOSE_WAIT
tcp 391 0 172.17.192.247:33040 106.11.68.13:80 CLOSE_WAIT
tcp 401 0 172.17.192.247:39106 140.205.140.205:80 CLOSE_WAIT
udp 0 0 0.0.0.0:68 0.0.0.0:*
udp 0 0 0.0.0.0:28752 0.0.0.0:*
udp 0 0 172.17.192.247: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 :::50807 :::*
udp6 0 0 :::123 :::*
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ACC ] STREAM LISTENING 5501588 /tmp/Aegis-<Guid(5A2C30A2-A87D-490A-9281-6765EDAD7CBA)>
unix 2 [ ACC ] STREAM LISTENING 9608 /run/systemd/private
也可以只看tcp或者udp的连接:如下:
[root@localhost ~]# netstat -lntp #只看当前系统tcp的连接:
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:52588 0.0.0.0:* LISTEN 26231/sshd
[root@localhost ~]# netstat -lnup #只看当前系统udp的连接:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
udp 0 0 0.0.0.0:68 0.0.0.0:* 11374/dhclient
udp 0 0 0.0.0.0:28752 0.0.0.0:* 11374/dhclient
udp 0 0 172.17.192.247:123 0.0.0.0:* 824/ntpd
udp 0 0 127.0.0.1:123 0.0.0.0:* 824/ntpd
udp 0 0 0.0.0.0:123 0.0.0.0:* 824/ntpd
udp6 0 0 :::50807 :::* 11374/dhclient
udp6 0 0 :::123 :::* 824/ntpd
注:只查看当前系统的tcp协议状态的命令:
[root@localhost ~]# netstat -an | awk '/^tcp/ {++sta[$NF]} END {for(key in sta) print key,"\t",sta[key]}'
LISTEN 1
CLOSE_WAIT 3
ESTABLISHED 3
6、ss命令:(socket statistics):用来显示处于活动链接的socket的信息,用来导出socket的统计信息,他可以显示根netstst类似的内容,但它能显示比其他工具更详细的TCP状态信息,而且比netstst更快速高效,缺点就是不会显示进程名称:
语法:ss options:
如果不指定任何选项,ss默认会列出所有已经建立、并不处在listen监听下的TCP套接字:
options:
-a:列出所有套接字:(监听或非监听状态下).
-n:不解析服务的名称,以数字方式显示:
-l:只列出监听listen的套接字:
-t:显示tcp的套接字:-u:显示udp的套接字:
-s:显示概要统计(来自不同来源的套接字信息):
-p:显示使用套接字的进程:
[root@localhost ~]# ss -an
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
*
nl UNCONN 0 0 15:-4107 *
nl UNCONN 0 0 15:1
u_dgr UNCONN 0 0 * 10488 *:*
tcp ESTAB 0 0 172.17.192.247:52588 111.196.246.149:22566
tcp ESTAB 0 7500 172.17.192.247:52588 111.196.246.149:22546
tcp ESTAB 0 0 172.17.192.247:35644 106.11.248.51:80
tcp CLOSE-WAIT 401 0 172.17.192.247:60936 140.205.140.205:80
tcp CLOSE-WAIT 391 0 172.17.192.247:33040 106.11.68.13:80
tcp CLOSE-WAIT 401 0 172.17.192.247:39106 140.205.140.205:80
[root@localhost ~]#
7、抓包工具tcpdump:
tcpdump是一个用来截取网络分组,并输出分组内容的工具,是一款sniffer工具,它可以打印经过网络接口的数据包头信息,也可以-c指定包的大小,并使用-w选项保存包,方便后面分析:
语法:tcpdump options
options:注意:多个参数之间需要加and才可以:
-i:指定监听的网卡名称:默认会检测eth0:
-nn:表示以IP地址和端口显示(默认是以主机名+服务名称显示),第一个n表示IP地址显示,第二个n表示以端口号显示:
-c:指定包的数量:
-w:指定包的保存位置:
-r: 临时查看数据包中的数据流: tcpdump -r /tmp/1.cap
host 后面可以加主机名或者IP地址,比如:tcpdump host 111.192.246.149:
port 后面可以加端口号,也可以是非的意思:如:port 22 或 not port 22:
src
dst
[root@localhost ~]# tcpdump -nn -i eth0 #抓取eth0的网卡数据包:
01:18:58.042264 IP 172.17.192.247.52588 > 111.196.246.149.22546: Flags [P.], seq 26148:26376, ack 1, win 316, options [nop,nop,TS val 1184456346 ecr 3355274], length 228
01:18:58.050622 IP 111.196.246.149.22546 > 172.17.192.247.52588: Flags [.], ack 26376, win 16560, options [nop,nop,TS val 3355275 ecr 1184456345], length 0
01:18:58.050634 IP 172.17.192.247.52588 > 111.196.246.149.22546: Flags [P.], seq 26376:26604, ack 1, win 316, options [nop,nop,TS val 1184456354 ecr 3355275], length 228
01:18:58.050693 IP 172.17.192.247.52588 > 111.196.246.149.22546: Flags [P.], seq 26604:26992, ack 1, win 316, options [nop,nop,TS val 1184456354 ecr 3355275], length 388
01:18:58.050721 IP 172.17.192.247.52588 > 111.196.246.149.22546: Flags [P.], seq 26992:27220, ack 1, win 316, options [nop,nop,TS val 1184456354 ecr 3355275], length 228
^C
129 packets captured
130 packets received by filter
0 packets dropped by kernel
2:抓取网卡eth0的tcp协议且端口为52588的数据流:
[root@localhost ~]# tcpdump -nn -i eth0 tcp port 52588
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
01:20:43.675407 IP 172.17.192.247.52588 > 111.196.246.149.22546: Flags [P.], seq 2951989875:2951990087, ack 2490216460, win 316, options [nop,nop,TS val 1184561979 ecr 3365836], length 212
01:20:43.675547 IP 172.17.192.247.52588 > 111.196.246.149.22546: Flags [P.], seq 212:456, ack 1, win 316, options [nop,nop,TS val 1184561979 ecr 3365836], length 244
01:20:43.681979 IP 111.196.246.149.22546 > 172.17.192.247.52588: Flags [.], ack 456, win 16274, options [nop,nop,TS val 3365838 ecr 1184561975], length 0
01:20:43.681993 IP 172.17.192.247.52588 > 111.196.246.149.22546: Flags [P.], seq 456:684, ack 1, win 316, options [nop,nop,TS val 1184561985 ecr 3365838], length 228
01:20:43.682053 IP 172.17.192.247.52588 > 111.196.246.149.22546: Flags [P.], seq 684:1056, ack 1, win 316, options [nop,nop,TS val 1184561985 ecr 3365838], length 372
01:20:43.682080 IP 172.17.192.247.52588 > 111.196.246.149.22546: Flags [P.], seq 1056:1284, ack 1, win 316, options [nop,nop,TS val 1184561985 ecr 3365838], length 228
3:抓取网卡eth0的tcp协议且非52588的端口,并抓10个包,包括在/tmp目录下:
[root@localhost ~]# tcpdump -nn -i eth0 tcp port 52588 -c 5 -w /tmp/1.cap
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
5 packets captured
5 packets received by filter
0 packets dropped by kernel
8:抓包工具tshark:
首先在使用前需要安装这个安装包: yum install -y whireshark
1、可以用用查看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 'eth0'
^C1 packet dropped
0 packets captured
#因为我的服务器没有web服务,所以是无法显示:
2、mysql的查询:
[root@localhost ~]# tshark -n -i eth0 -R 'mysql.query' -T fields -e "ip.src" -e "mysql.query"
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'
^C1 packet dropped
0 packets captured
#抓取mysql的查询:
有时候mysql的端口发生变化,如果此时想再抓取查询的话:则需要使用如下命令:通过制定端口的方式来查询:
[root@localhost ~]# tshark -i eth0 port 3307 -d tcp.port==3307,mysql -z
tshark: Invalid -z argument "port".
-z argument must be one of :
3、统计http的状态:
[root@localhost ~]# tshark -n -q -z http,stat, -z http,tree
Running as user "root" and group "root". This could be dangerous.
Capturing on 'eth0'
^C18 packets captured
===================================================================
HTTP/Packet Counter value rate percent
-------------------------------------------------------------------
Total HTTP Packets 0
HTTP Request Packets 0
HTTP Response Packets 0
???: broken 0
1xx: Informational 0
2xx: Success 0
3xx: Redirection 0
4xx: Client Error 0
5xx: Server Error 0
Other HTTP Packets 0
===================================================================
===================================================================
HTTP Statistics
* HTTP Status Codes in reply packets
* List of HTTP Request methods
===================================================================