1、iostat:用于监视系统的输入输出设备(磁盘)和CPU的使用情况,特点是报告磁盘活动的统计情况和CPU的使用情况,通vmstat一样,它们的弱点都是不能对某一进程进行具体的分析,只能对系统的整体情况进行的分析:

而iostat的常用选项  iostat -x

注:iostatsar用的同一个安装包(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:显示PIDPPIDCSTIME栏: 

注意: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:抓取网卡eth0tcp协议且端口为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
===================================================================