10.6 监控io性能

iostat命令

iostat命令被用于监视系统输入输出设备和CPU的使用情况。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况。同vmstat一样,iostat也有一个弱点,就是它不能对某个进程进行深入分析,仅对系统的整体情况进行分析。

  • iostat -x

[root@gaohanwei ~]# iostat -x Linux 3.10.0-514.el7.x86_64 (adai003) 2017年07月11日 _x86_64_ (1 CPU) avg-cpu:  %user   %nice %system %iowait  %steal   %idle           0.12    0.00    0.24    0.25    0.00   99.39 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.06    0.45    0.30    16.50     4.06    54.39     0.02   31.35   32.52   29.60   6.25   0.47 scd0              0.00     0.00    0.00    0.00     0.00     0.00     8.00     0.00  170.45  170.45    0.00 170.45   0.01

说明: util%:表示io等待占比,正常情况下该值和磁盘读写(r/w)成正比,如果该值很大,读写数值很小则说明磁盘存在问题,系统性能会受影响!

iotop命令

iotop命令是一个用来监视磁盘I/O使用状况的top类工具(动态)。iotop具有与top相似的UI,其中包括PID、用户、I/O、进程等相关信息。Linux下的IO统计工具如iostat,nmon等大多数是只能统计到per设备的读写情况,如果你想知道每个进程是如何使用IO的就比较麻烦,使用iotop命令可以很方便的查看。

[root@gaohanwei ~]# 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                     3694 be/4 root          0.00 B      0.00 B  0.00 %  0.02 % [kworker/0:0]    1 be/4 root          0.00 B      0.00 B  0.00 %  0.00 % systemd --swit~-deserialize 21    2 be/4 root          0.00 B      0.00 B  0.00 %  0.00 % [kthreadd]    3 be/4 root          0.00 B      0.00 B  0.00 %  0.00 % [ksoftirqd/0]  516 be/4 root          0.00 B      0.00 B  0.00 %  0.00 % crond -n  517 be/4 root          0.00 B      0.00 B  0.00 %  0.00 % login -- root ……

注: 在此关注‘IO>’这一列!

  • iotop常用快捷键

  • 左右箭头:改变排序方式,默认是按IO排序

  • r:改变排序顺序。

  • o:只显示有IO输出的进程。

  • p:进程/线程的显示方式的切换。

  • a:显示累积使用量。

  • q:退出。


10.7 free命令

free命令可以显示当前系统未使用的和已使用的内存数目,还可以显示被内核使用的内存缓冲区。

语法: free [options]

Options:

-b/k/m/g:分别以byte、KB、M、G为单位显示(默认以KB为单位)

-h:已适当的单位显示

-t:显示内存总和

[root@gaohanwei ~]# free              total        used        free      shared  buff/cache   available Mem:        1008392      116072      586356        6864      305964      724644 Swap:       2097148           0     2097148 [root@gaohanwei ~]# free -h              total        used        free      shared  buff/cache   available Mem:           984M        113M        572M        6.7M        298M        707M Swap:          2.0G          0B        2.0G

说明:

“total=used+free+buff/cache”

“available=free+buff/cache(空闲部分)”

buff(缓冲):当CPU向磁盘写入数据时,由于磁盘存储速率低于CPU,所以CPU工作时先将写好的数据存放在内存中,该部分内存即为缓冲内存。

cache(缓存):当CPU从磁盘读取数据时,由于磁盘输出速率低于CPU的读取速度,所以磁盘的数据会预先存放在内存中,该部分内存即为缓存内存。


10.8 ps命令

ps命令用于报告当前系统的进程状态。可以搭配kill指令随时中断、删除不必要的程序。ps命令是最基本同时也是非常强大的进程查看命令,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等,总之大部分信息都是可以通过执行该命令得到的。

用法

语法: ps [options]

Options:

a:显示现行终端机下的所有程序,包括其他用户的程序。

u:以用户为主的格式来显示系统状况。

x:显示所有程序,包括历史进程。

-e:显示所有进程(同a)

-f:显示UID、PPIP、C与STIME栏

-l:显示进程详细信息

  • ps aux

[root@gaohanwei ~]# ps aux USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND root         1  0.0  0.3 125100  3628 ?        Ss   10:28   0:01 /usr/lib/systemd/systemd root         2  0.0  0.0      0     0 ?        S    10:28   0:00 [kthreadd] ……

说明: STAT表示进程状态。

  • 进程状态:

  • D:不能中断的进程

  • R:run状态的进程

  • S:sleep状态的进程

  • s:主进程

  • T:暂停的进程

  • Z:僵尸进程

  • <:高优先级进程

  • N:低优先级进程

  • L:内存中被锁定了内存分页

  • l:多线程进程

  • +:前台进程

  • ps -elf

[root@gaohanwei ~]# ps -elf F S UID        PID  PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD 4 S root         1     0  0  80   0 - 31275 ep_pol 10:28 ?        00:00:01 /usr/lib/system 1 S root         2     0  0  80   0 -     0 kthrea 10:28 ?        00:00:00 [kthreadd]

进程/线程

进程

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。

状态分类

进程执行时的间断性,决定了进程可能具有多种状态。事实上,运行中的进程可能具有以下三种基本状态:

  • 就绪状态(Ready):进程已获得除处理器外的所需资源,等待分配处理器资源;只要分配了处理器进程就可执行。就绪进程可以按多个优先级来划分队列。例如,当一个进程由于时间片用完而进入就绪状态时,排入低优先级队列;当进程由I/O操作完成而进入就绪状态时,排入高优先级队列。

  • 运行状态(Running):进程占用处理器资源;处于此状态的进程的数目小于等于处理器的数目。在没有其他进程可以执行时(如所有进程都在阻塞状态),通常会自动执行系统的空闲进程。

  • 阻塞状态(Blocked):由于进程等待某种条件(如I/O操作或进程同步),在条件满足之前无法继续执行。该事件发生前即使把处理机分配给该进程,也无法运行。

线程

线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。

在单个程序中同时运行多个线程完成不同的工作,称为多线程

分类

  • 用户级线程:管理过程全部由用户程序完成,操作系统内核心只对进程进行管理。

  • 系统级线程(核心级线程):由操作系统内核进行管理。操作系统内核给应用程序提供相应的系统调用和应用程序接口API,以使用户程序可以创建、执行、撤消线程。

进程和线程关系:


10.9 查看网络状态

netstat命令

netstat命令用来打印Linux中网络系统的状态信息,可让你得知整个Linux系统的网络情况。

语法: netstat [options]

Options:

-a:=all 显示所有连线中的socket

-l:=listening 显示监控中的服务器的socket

-n:=numeric 直接使用IP地址

-p:=programs 显示正在使用socket的程序识别码和程序名称

-t:=tcp 显示tcp传输协议的连接状况

  • netstat -lnp 查看监听端口

[root@gaohanwei ~]# 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      1839/sshd           tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1979/master         tcp6       0      0 :::22                   :::*                    LISTEN      1839/sshd           tcp6       0      0 ::1:25                  :::*                    LISTEN      1979/master         udp        0      0 127.0.0.1:323           0.0.0.0:*                           488/chronyd         udp6       0      0 ::1:323                 :::*                                488/chronyd         raw6       0      0 :::58                   :::*                    7           543/NetworkManager   Active UNIX domain sockets (only servers) Proto RefCnt Flags       Type       State         I-Node   PID/Program name     Path unix  2      [ ACC ]     SEQPACKET  LISTENING     11807    1/systemd            /run/udev/control unix  2      [ ACC ]     STREAM     LISTENING     17879    1979/master          private/rewrite :proto为unix的是系统内的socket文件。 ……

  • netstat -an 查看系统网络连接状况

[root@gaohanwei ~]# 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:22              0.0.0.0:*               LISTEN     tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN     tcp        0     52 192.168.8.125:22        192.168.8.1:61445       ESTABLISHED tcp6       0      0 :::22                   :::*                    LISTEN     tcp6       0      0 ::1:25                  :::*                    LISTEN     udp        0      0 127.0.0.1:323           0.0.0.0:*                           udp6       0      0 ::1:323                 :::*                               raw6       0      0 :::58                   :::*                    7           Active UNIX domain sockets (servers and established) Proto RefCnt Flags       Type       State         I-Node   Path unix  2      [ ACC ]     SEQPACKET  LISTENING     11807    /run/udev/control unix  2      [ ACC ]     STREAM     LISTENING     17879    private/rewrite ……

  • netstat -lntp 只看tcp协议连接,不看socket

[root@gaohanwei ~]# netstat -lntp 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      1839/sshd           tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1979/master         tcp6       0      0 :::22                   :::*                    LISTEN      1839/sshd           tcp6       0      0 ::1:25                  :::*                    LISTEN      1979/master      

补充: 查看tcp协议状态的命令:

[root@gaohanwei ~]#  netstat -an | awk '/^tcp/ {++sta[$NF]} END {for(key in sta) print key,"\t",sta[key]}' LISTEN 4 ESTABLISHED 1

ss命令

ss命令用来显示处于活动状态的套接字信息。ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容。但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效,缺点是不会显示进程的名称。

语法: ss [options]

Options:

-a:显示所有套接字(socket)

-n:不解析服务器名称,以数字方式显示

[root@gaohanwei ~]# ss -an Netid State      Recv-Q Send-Q  Local Address:Port                 Peer Address:Port               nl    UNCONN     0      0                   0:0                                *                   nl    UNCONN     0      0                   0:-1442840033                     *                


10.10 Linux下抓包

tcpdump命令

tcpdump命令是一款sniffer工具,它可以打印所有经过网络接口的数据包的头信息,也可以使用-w选项将数据包保存到文件中,方便以后分析。

语法: tcpdump [options]

Options:

-i:指定网卡名,使用指定的网络送出数据包

-c:指定数量

-w:指定存放位置

-r:=read,从指定文件查看数据包数据

用法

  • tcpdump -nn -i ens33 (第一个n表示以数字形式显示IP,如果不加该选项会显示成主机名)

  • tcpdump -nn ens33 port 22 (not port 22)指定端口为22的(非22的)

  • tcpdump -nn ens33 port 22 and host 192.168.8.1 指定多个条件(host:主机,后面跟主机名或IP)

  • tcpdump -nn -i ens33 -c 10 -w /tmp/1.cap 指定抓包数量和存放位置

[root@gaohanwei ~]# tcpdump -nn -i ens33 -c 10 -w /tmp/1.cap tcpdump: listening on ens33, link-type EN10MB (Ethernet), capture size 65535 bytes 10 packets captured 12 packets received by filter 0 packets dropped by kernel查看1.cap文件信息:[root@gaohanwei ~]# file /tmp/1.cap /tmp/1.cap: tcpdump capture file (little-endian) - version 2.4 (Ethernet, capture length 65535)

注: 1.cap内容无法使用cat命令查看,可使用tcpdump -r命令查看

  • tcpdump -r 1.cap 查看指定数据包内容

[root@gaohanwei ~]# tcpdump -r /tmp/1.cap reading from file /tmp/1.cap, link-type EN10MB (Ethernet) 18:42:15.311230 IP adai003.ssh > 192.168.8.1.61445: Flags [P.], seq 1594109651:1594109799, ack 208567947, win 295, length 148 18:42:15.311978 IP 192.168.8.1.61445 > adai003.ssh: Flags [.], ack 148, win 16316, length 0 18:42:16.296782 IP adai003.ssh > 192.168.8.1.61445: Flags [.], seq 148:3068, ack 1, win 295, length 2920

说明: 包内内容为使用tcpdump打包时的数据。

tshark命令

该命令也是用于抓包的。

使用前需要安装该工具‘wireshark’:

[root@gaohanwei ~]# yum install -y wireshark

用法

  • 查看指定网卡80端口的1个web服务的访问情况(类似于web的访问日志):

[ 命令: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" ]

[root@gaohanwei ~]#  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"

  • 抓取mysql的查询

方法1:[root@gaohanwei ~]# tshark -n -i ens33 -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 'ens33' 0 packets captured方法2:[root@gaohanwei ~]# tshark -i ens33 port 3307  -d tcp.port==3307,mysql -z "proto,colinfo,mysql.query,mysql.query"

注: 因无相关进程运行所以一无所获!

  • 抓取指定类型的MySQL查询

[root@gaohanwei ~]# tshark -n -i ens33 -R 'mysql matches "SELECT|INSERT|DELETE|UPDATE"' -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 'ens33' 8 packets dropped 0 packets captured

  • 统计http的状态

[root@gaohanwei ~]# tshark -n -q -z http,stat, -z http,tree Running as user "root" and group "root". This could be dangerous. Capturing on 'nflog' ……

注: 这个命令,直到你ctrl + c 才会显示出结果!

  • tshark 增加时间标签

[root@gaohanwei ~]# tshark -t ad   [root@gaohanwei ~]# tshark -t a