Linux系统的查看系统信息和常用监控命令

  1. 云栖社区>
  2. 博客>
  3. 正文

Linux系统的查看系统信息和常用监控命令

技术小胖子 2017-11-09 14:34:00 浏览976
展开阅读全文

这里的标题是系统监控命令,其实还包括一些常用的系统信息查看(不是性能信息),所以本篇文章分为两大块内容:


系统信息类:

这类信息属于静态的,硬件如果不发生变化或者系统不做升级一般不会改变。


uname:显示操作系统信息

1
2
3
4
5
uname -s 显示操作系统名称
uname -p 显示处理器架构
uname -r 显示内核版本
uname -n 显示计算机名称
uname -a 显示全部信息

wKiom1gQbFKDuixYAACE3SzgpqA909.jpg-wh_50


lsb_release:显示发行版信息

1
2
3
4
5
lsb_release -i 显示发行版名称
lsb_release -d 显示综合信息
lsb_release -r 显示发行版本号
lsb_release -c 显示代号
lsb_release -a 显示全部

wKioL1gQbY6Rxv1GAACk9qBVBJI695.jpg-wh_50


hostname:显示主机名信息

1
2
3
4
5
hostname  显示长格式主机名
hostname -s 显示短格式主机名
hostname -d 显示FQDN
hostname -I 显示所有IP地址
hostname HOSTNAME 设置主机名

wKiom1gQbsbBUWh7AABizEwm1lU868.jpg-wh_50


下面我们会用到一些proc目录的内容,所有对于下面来讲都是使用cat查看文件内容。/proc是一个伪文件系统,只有系统启动以后才会有内容,系统关闭了该目录就是空的,这里面都是记录一些跟系统硬件信息有关的内容。


/proc/cupinfo:查看CUP特性信息

1
2
cat /proc/cpuinfo
cat /proc/cpuinfo grep process | wc -l   统计CPU的物理核心数量

wKioL1gQc8KzJ_1KAADQEsM2e_U637.jpg-wh_50

wKioL1gQc_-gPyBiAAA3epP865o593.jpg-wh_50


sestatus:查看SELinux状态

1
sestatus -v

wKioL1iOmn-hG5NVAAC9_8tsxdU712.jpg

1
setenforce 0     设置SELinux为permissive模式,为临时关闭,1为enforcing模式表示强制使用

如果永久生效则需要修改vim /etc/selinux,不过这种方式需要重启。

wKiom1iOmyGwspNiAABOkTNHBks394.jpg

一般结合2种方法同时使用,既保证当前生效同时也保障重启后生效。


性能监控类:

这类信息属于动态的,随着计算机的运行而发生改变。


free:用于查看当前系统物理内存、交换分区和缓存使用情况,包括已用、可用和剩余,这个命令的参数相对简单,主要有刷新频率和显示单位设置

1
2
3
4
free -m 以MB为单位显示,但是不显示单位
free -k 以KB为单位显示
free -g 以GB为单位显示
free -t # 每#秒刷新一次

wKiom1gRYfWA_GkiAABMBaTXCz8835.jpg-wh_50

total 物理内存总额
used 已用多少(包含buffer和cached)
free 空闲多少(包含buffer和cached)
shared 多个进程间共享内存多少
buffers 缓存,但是用于提高写入效率,写入硬盘之前会把数据先写入到内核缓冲区,然后内核缓冲区再去同步到磁盘上,避免如果直接写入硬盘这种慢速设备而造成的堵塞。
cached 缓存,但是用于提高读取效率,经常用到的,或者最近使用过的数据缓存在这里,以备下次读取使用,如果过了一段时间没有使用,就会清空时间相对久的数据,这样腾出空间来存放最近使用过的数据。如果用户请求的数据不在缓存中,则去硬盘读取。
-/+ buffers/cached

因为buffers和cached本身都是临时的,所以当物理内存不够用的时候会清空buffers和cached来让进程使用,所以对于used来说如果包含buffers和cached那它是一个值,如果减去它则又是一个值。看上图:

845=280+163+401

1024=1589+163+401

你计算一下体会其中的变化

其实就是站在不同角度来说,如果从操作系统来看buffers和cached确实被使用了,所以应该算作used,但是从进程来讲buffers和cached是可以被压缩清空的,所以used不应该包含着两部分内容。

Swap 交换分区,对于服务器来说偶尔少量使用swap不会影响整体性能,但是如果频繁使用SWAP,不管使用量有多少都应该注意,是否要增加物理内存。


top:实时查看进程占用资源状态,和windows的资源管理器一样,默认5秒刷新一次。

1
2
3
4
5
top
    -i #  指定刷新频率
    -u USERNAME 显示指定用户的进程
    -p PID 显示指定PID的进
    -H 线上每个线程的状态,否则按照进程来显示

wKioL1iOnArgIcR2AAFQxh-l7NQ940.jpg

说明
第一行

17:11:27 当前系统时间

up 11 days, 7:37  总共运行了11天7小时37分钟

2 users 当前有2个用户登陆

load average 负载情况,后面三个数是1分钟负载、5分钟负载、15分钟负载

第二行 进程汇总,总共113个进程,1个运行,112个休眠,0个停止,0个僵尸进程
第三行

CPU状态

us:用户态占用CPU百分比

sy:系统空间占用CPU百分比

ni:用户空间内改变过优先级的进程占CPU百分比

id:空闲百分比

wa:IO等待期间,CPU空闲百分比

hi:硬中断占用CPU百分比

si:软中断占用CPU百分比

第四行

内存情况

total:总物理内存

used:已用内存量

free:可用内存量

buffers:缓冲区空间(主要用于写)

cached:缓冲区空间(主要用于读)

Linux内存占用比Windows多这是一个假象,只是它们的内存管理机制不同而已,Linux中的可用空间应该是free+buffers+cached。

第五行

SWAP交换分区信息

total:总共

used:已用

free:可用


第七行

属性 说明
PID(默认) 进程ID
PPID 父进程ID
RUSER real用户名
UID 进程所有者的ID
USER(默认) 进程所有者
GROUP 进程所有者的组名
TTY 启动进程的终端名,不是从终端启动的则显示?
PR(默认) 进程优先级
NI(默认) 进程的NICE值,负数表示优先级高,正表示低
VIRT(默认) 进程使用的虚拟内存数量,单位KB。
RES(默认) 进程使用过的,未被换出的物理内存大小,就是说进程(包括程序、代码)使用的物理内存,目前还没有被换出到SWAP分区的大小。
SHR(默认) 和其他进程共享的内存数量
SWAP 进程使用的虚拟内存中,被换出的大小
CODE 可执行代码占用的物理内存大小
DATA 代码以外的数据段和栈所用物理内存大小
%CPU(默认) 上次更新到现在的CPU占比,这里的指的具体进程。
%MEM(默认) 进程目前使用的物理内存百分比
TIME 进程从启动到现在总共使用了多少CPU时间
TIME+(默认) 进程从启动到现在总共使用了多少CPU时间,单位1/100秒
COMMAND(默认) 命令或进程名称
S

进程状态

D:不可终端的

R:运行中

S:休眠

T:跟踪/停止

Z:僵尸进程

按1显示所有CPU核心的使用情况

按M按使用内存大小进行排序

按P按使用CPU使用率进行排序

按T按时间进行排序

按k,输入进程号可以杀死某个进程

top默认输出的内容就是上面的那些列,但是还可以输出更多,需要在top显示界面上按下“f”键盘,然后进入选取列的模式,按下列明前面的字母,当你看到它变成大写,则表示选中,并且前面多了一个星号,再次按下相同的键表示取消显示该列,同时星号消失

wKiom1iOnEmyqih7AADz3x8EqVY067.jpg

按下b之后的显示效果(下图)

wKioL1iOnHaTJ-GiAADo971rn9g268.jpg

然后按Esc返回

wKiom1iOnKuTNAwVAAFcFIjjgIs995.jpg


iostat:查看系统CUP、磁盘性能指标

-C 显示CPU使用情况

-d 显示磁盘使用情况 -k以KB为单位 -m以MB为单位 -g以GB为单位

-N 显示LVM信息

-x 显示详细信息

-p 显示分区情况

另外命令后面可以加2个数字,就是时间和次数比如:

1
iostat -d -m 2 5     以MB为单位显示磁盘使用情况,每2秒刷新一次,显示5次。

指标解释

wKioL1iOnOuSXvrRAABNrFQ_PhE441.jpg

CPU属性值

指标 常用缩写 含义
%user us CPU处于用户模式下的运行时间百分比,也就是运行级别为3,也就是用户态,也就是用户空间
%nice ni CPU处于带NICE值得用户模式下的时间百分比(这个还不太理解)
%system sy CPU处于系统模式下的运行时间百分比,也就是运行级别为0,也就是内核态,也就是内核空间
%iowait wa

在一个采样周期内CPU因为IO导致的进程等待时间,CPU是快速设备,磁盘是慢速设备,如果某个进程要从磁盘获取或者写入数据,那么就会产生用户空间到内核空间,再到磁盘的IO,内核空间到磁盘的IO称谓磁盘IO,如果数据量比较大,显然磁盘要经过寻址等操作,比较消耗时间,这个时候进程就处于等待状态,同时CPU也会等着(不是说CPU傻傻等着进程,而是说CPU可以干别的事情,如果没有别的事情它就空闲下来了),所以iowait这个值就在这种状态下的闲置时间,所以要不就是所有进程都在等IO,或者等IO的时候没有其他进程可以运行。产生这个值的第一个前提条件是CPU是闲置的。

假设在IO数量一样的情况下:如果CPU比较繁忙,即使有大量IO需要等待,那么这个值也不会高,因为CPU没有空闲。在CPU繁忙过后,(还是原有的IO数量)有一部分IO等待落入了CPU空闲时间段,那么这个值就会升高,所以在IO量没有变化的情况下, iowait也会升高,升高原因仅仅是因为CPU空闲时间增加了。

所以单纯的看这个值升高并不能判断IO是否有瓶颈。还需要其他指标来辅助判断。

%steal st 虚拟CPU等待实际CPU的时间百分比,如果是虚拟机那么这个指标还是需要关注的,该指标持续保持高位,说明真正宿主机的物理CPU比较忙,而你的虚拟机里面的CPU总是在等待物理CPU时间片。一般情况是物理机运行了太多虚拟机或者某些虚拟机消耗CPU资源太多。
%idle id 空闲的CPU时间百分比,这个和iowait是有区别的,这个你可以理解为纯空闲,后台没有别的进程在等待IO完成。

磁盘属性值

wKioL1iOnXTCzyhBAADHmCy_-24852.jpg

指标 含义
rrqm/s 每秒进行merge的读操作数量,每秒有多少个读请求被Merged了,含义就是如果多个读请求并且请求的是相同数据,那么文件系统就会把这些请求合并。
wrqm/x 每秒进行merge的写操作数量,含义同上,只是换成了写请求。
r/s 每秒完成读IO的次数,单位时间内发生的总读请求数量
w/s 每秒完成写IO的次数,单位时间内发生的总写请求数量
rsec/s 每秒读取扇区数量,如果你使用-k\-m\-g的话,单位就会按照KB、MB、GB来显示。默认是扇区section,扇区换算成KB的话,就是这里值*512/1024,你可看到上图我红色勾出的上下对比。建议使用kb来看,这样就容易理解每秒读取多少KB数据。
wsec/s 每秒写入扇区数量,换算同上。
avgrq-sz 平均每次设备IO操作的数据大小,单位时间里在该队列中,每个请求的平均数据大小。
avgqu-sz 平均IO队列长度,单位时间内队列长度
await 平均每次IO操作的等待时间(单位:毫秒),每个IO请求的平均等候时间。如果这个值远大于svctm则说明队列太长了。
svctm

平均每次IO操作的服务时间(单位:毫秒),每个IO请求的平均花多少时间完成。这个参数在以后的sysstat版本中将会被删除。

%tuil

一秒钟有百分之多少的时间用于IO操作,实际上这个参数和CPU有关,也就是一秒内CPU有多少时间用于IO操作。如果该参数接近100%,说明该设备饱和或者说负载太高了。

另外如果发现IO过高,还可以通过vmstat -D来看到底有多少在等待。这个命令后面介绍。

说明:上面的指标都在同一个单位时间内所统计和计算出来的。因为有了r/s每秒读总请求书你才能算出rsec/s每秒读取了多少扇区数量,那就可以算出avgrq-sz,因为读请求在队列了,队列长度是知道的,每个请求数据大小也知道,所以就可以算出这个平均大小,另外avgqu-sz平均队列长度也知道,还有就是await,处理完这些请求,每个请求等候了多少时间也就可以算出来,同时每个请求完成花费多少时间也会知道。

普通模式下的显示:没有使用-x参数

wKiom1iOnb6D0Z49AACsqPdzsAU377.jpg上图中的Blk_read/s (单位是块 block)就是在详细模式下的rsec/s (单位是扇区),Blk_wrtn/s就是wsec/s。后面的Blk_read和Blk_wrtn表示读写总数据量。另外tps的意思是在该设备上每秒发生的传输次数,一次传输也就一次IO,多个重复请求会被合并。块和扇区的大小都是512KB。

对于上图中看到的DM-0之类的是Device Mapper设备,这个是用来LVM之后才显示成这样的,可以通过2个命令进行查看

1
2
ll /dev/mapper
df -h

wKioL1iOnfaB5UqYAABfCLv0AE4966.jpg


vmstat:命令是虚拟内存统计,但是它可以查看的还包括CPU信息、磁盘信息等

为了尽量避免物理内存不够用而出现系统假死、缓慢等问题,就引入了虚拟内存概念,虚拟内存就是在硬盘上用一部分区域来做内存使用。进程和进程相关数据都会在内存中,但是物理内存是有限的,不可能无限的往里面塞数据,但是如果目前需要运行一个进程,但是已经没有物理内存怎么办?为了避免这种请求就使用虚拟内存,系统会把最近经常使用的数据放在内存中,把不经常用到的暂时存放在swap也就是虚拟内存中,这样就可以腾出空间来给其他进程和数据使用,如果之前暂存的数据又需要了呢?那么就再读取到内存中。这就内存的换进换出机制。

换进:page-in,从swap分区读入到内存

换出:page-out,从内存写入到swap分区

1
2
3
vmstat   查看基本信息
vmstat -a 查看活动和非活动内存
上面2个命令除了在内存属性方面的指标有所不同之外,其他均相同

wKiom1iOnmvBF-5hAABZvZqeXYs321.jpg

分类 标签 说明
procs(进程) r 运行和等待CPU时间片的进程数,如果总是大于1,则表示CPU资源不足
b 表示等待资源的进程数量,比如等待IO、内存等。
memory(内存)
swpd 虚拟内存使用了多少,如果长期大于0表示物理内存不够
free 空闲物理内存有多少
buff 有多少buffer
cache 有多少cache
inact

最近没有使用过的数据,在需要物理内存的时候,内核会把这部分非活动内存数据写入到swap中。

活动和非活动的概念和HTTP连接类似,HTTP活动连接就是当前有数据交互的,非活动连接就是没有数据连接但是还没有断开。

active

最近经常使用的数据

inact和active这个数据是从/proc/meminfo中的Inactive和Active中获得的。

swap si 由内存写入到swap交换区的数量
so 由swap交换区读入内存的数量
io bi

块设备接收的数据总量,典型的是硬盘写入。

Linux把IO设备分为块设备和字符设备:

块设备:可以随机访问,比如硬盘、软盘、光盘等

字符设备:必须顺序访问,比如键盘

bo 块设备发送的数据总量,典型的是读取硬盘
system in 一段时间内发送中断数量
cs 每秒产生上下文切换次数,其实也就是进程切换,因为CPU是分时间片执行的,对每个进程来说都会占用部分时间片,如果这一次时间片用完了,但是进程任务没有结束,那么就要等待下一次,CPU就要去执行其他进程,由于每个进程都有数据、参数、变量等,而且CPU执行运算也需要这些必要信息,所以切换进程也是就要切换这些必要信息,这些必要信息就是上下文。
cpu us
参见上面的iostat命令
sy
id
wa
st


1
vmstat -f 查看系统从启动到现在fork的数量

什么是fork呢?Linux中进程是树状结构的,init是根节点,其他进程都有父进程,某个进程的父进程就是启动这个进程的进程,这个进程叫做父进程的子进程。fork的作用就是复制一个和当前进程一样的进程,新进程的所有数据、参数、变量等都和原来一样,这个新进程则是当前进程的子进程。这个复制过程就是fork。为什么要复制呢?简单来说就是为了处理并发请求。不过在最初的时候虽然复制了,但是子进程和父进程都指向父进程的物理空间,虽然他们的虚拟地址空间不同,这就是说复制并不是真的独立复制一份放到子进程专属的物理空间,那么什么时候才真的复制呢?就是子进程需要改变数据的时候,才会把用到数据复制过来。

wKioL1iOntTzMxDwAAAYDxYhvok527.jpg

上面的信息是从/proc/stat里面的processes字段来的,你获取的数量可能不会完全一致,因为是实时变化的,但总之数据是来源于/proc/stat里面

wKiom1iOnxGjzsDFAAAaeG0Gwc0353.jpg


1
vmstat -d  显示磁盘统计

在对小碎文件的读写方面磁盘的瓶颈在于寻址时间,而对于大文件来说瓶颈则在于带宽。

wKiom1iOn1zTOtA-AADLEJKndec263.jpg

类别 属性 说明

reads/writes


total
成功完成了多少次读写
merged
合并的读写请求次数
sectors
读写扇区次数
ms 读或写花费的总毫秒啊数
IO cur
当前有多少进程在等待IO
sec IO花费总秒数

注:reads和writes是两个单独的,但是他们的属性都一样,所以我上面就合并来做介绍。

说明:dm-0只类的是device mapper,这是因为使用了LVM的原因,ram0-15这个是虚拟块设备,用途是把内存中的一块区域当硬盘来用,也就可以把内存的一部分挂载到ram0-15中的任意设备上(默认16个)。至于大小,这取决你使用的工具以及设置,ramdisk的默认大小是4096KB。另外loop0-7,这个也是虚拟块设备,是个伪设备,这个是干嘛用的呢?比如你有一个ISO光盘镜像文件,你就可以通过losetup挂载到一个loop目录中。

ram设备的用途可以是拿出一块空间来做虚拟硬盘,然后挂载到/tmp目录,然后让程序都在使用这个临时目录,这样可以加速程序运行。因为毕竟这个目录存放都是临时的。

另外该命令还可以指定显示几次以及每次间隔时间

1
vmstat 1 5    1是频率单位秒  5是次数

wKioL1iOn4ihyqjxAABasSbWur0290.jpg

1
vmstat -S k|K|m|M   指定单位  k是1000 K是1024

wKiom1iOn7uwJZaQAABYZwy4NXU990.jpg


ps:列出当前系统运行的进程,不过这个是一个静态数据,也就是执行该命令时的那一刻的进行状态,如果想动态的监控则需要使用top命令

1
2
3
4
5
6
7
8
9
10
11
ps a 显示当前终端下的所有进程
   -a 显示同一终端下的所有进程
   -A 显示所有进程
   -u 指定用户的所有进程
   -p PID 显示某一进程使用的CPU时间
   -aux 显示所有包含其他使用者的进程
   -e 显示所有进程
   -f 完整格式列表
   -F 显示额外信息
   -H 显示层次关系,也就是父进程和子进程
   -d 刷新频率 -n 刷新几次


1
ps -aux 显示所有进程,包含当前用户和其他用户

wKioL1iOn-Ow54_9AADiDjbERsY397.jpg

属性 说明
USER 用户名
PID 进程ID
%CPU 占用CPU时间比例,cputime/realtime  当前进程运行的时间长度/从开机到现在CPU运行长度
%MEM 内存使用比
VSZ 进程所使用的虚拟内存(线性地址)的大小,单位是:k
RSS 进程使用的实际内存大小,也叫做非交换物理内存。这里的数据一定不能交换到SWAP上去,从进程开始到结束。
TTY 与进程关联的终端
STAT

进程状态

R:运行

S:睡眠,比如受到阻塞,可中断

I:空闲

Z:僵尸进程

D:不可中断

s:session leader

l:多线程进程

+:前台进程

N:低优先级进程

<:高优先级进程

START 进程启动日期和时间
TIME 进程使用的总CPU时间
COMMAND 执行的命令
PSR
当前进程运行在哪个CPU上,它是从0开始的,0表示第一个CPU。
PPID
父进程ID
C
CPU利用时间
STIME
启动时间


1
ps -eo 显示用户自定义的列

wKioL1iOoBTA6moWAAAqG__Yovk046.jpg

显示进程运行在哪个CPU上

1
ps -axo psr,command

wKioL1jjDSzhRJNeAABFx6IA-Fs690.jpg

1
ps -axjf 用树形来显示所有进程

wKiom1iOoECiv1U-AACELiR5GZs091.jpg

说明:如果COMMAND下面显示的内容由[]括起来表示是系统内核功能,只是显示成进程的样子便于管理。另外我们还会总是看到一个/bin/init的进程,而且PID为1,这个是系统启动创建的第一个进程它会一直存在直到关闭系统,而且init进程是内核直接创建的,也是内核唯一创建的,以后其他的任何进程无论是系统进程还是用户进程简单来说都init创建的。这个内容以后再说。

1
ps -d 3 -n 3   #每3秒刷新一次,一共显示3次


常用组合如下:

1
2
3
ps -aux
ps -eF   #显示PID PPID PSR COMMAND
ps -eFH  #按层次关系显示


netstat:网络监控命令

1
netstat

wKioL1ihWOOg7v_rAADBSCec7_4398.jpg

不加任何参数将会输出2部分内容:

  • Active Internet connections 活动的internet连接,包含TCP和UDP。

  • Active UNIX domain sockets 活动UNIX本地套接字连接


参数
说明
-a
显示所有选项
-t
仅显示TCP相关选项
-u
仅显示UDP相关选项
-n
尽量不显示名称,而用数字代替,比如主机名换成IP显示
-l
仅列出在Listen监听的服务状态
-p
显示建立相关网络的程序名和进程号,也就是本机哪个进程开启的这个网络链接
-r
显示路由表,作用和 route -n一样
-e
显示扩展信息
-s
按不同协议输出统计信息,因为协议不同,所以输出的统计选项也不同
-c
每隔固定时间刷新


下面看一下输出内容,也就是最全的(路由信息、网卡信息不包含)

1
netstat -anetp

wKiom1ihXk3h6CktAAEt0YpcPP8144.jpg



说明
Proto
协议
Recv-Q
连接到该套接字的用户程序还没有拷贝的字节数
Send-Q
远程主机未确认的字节数
Local Address
套接字在本地IP地址和端口
Foreign Address
套接字远程的IP地址,也就是客户端或者上层代理的IP和端口
State
网络连接状态
User
运行该进程的账户,也就是该服务器网络套接字属于谁
Inode

PID/Progam name
服务器端监听或者处理该端口请求的程序

网络连接状态说明--重点

状态
说明
LISTEN
首先服务器需要打开一个socket进行监听,监听来自远方TCP端口的连接请求
SYN_SENT
表示主动连接,客户端能通过应用程序调用connect()函数进行active open。于是客户端TCP发送一个SYN以请求建立一个连接,之后状态为SYN_SEND,表示已发送一个SYN到服务器端,等待SYN 1+ACK 0响应。
SYN_RECV
服务器端收到客户端的SYN 1+ACK 0,然后状态变为SYN_RECV。表示服务器收到了客户端发来的SYN,然后自己也响应了给客户端一个SYN 1+ACK 1,然后等待客户端确认。 这时候客户端过来的连接(属于半连接状态)被放在一个SYN队列里面,SYN泛洪攻击也是这样的,就是服务器响应了SYN+ACK之后,客户端就不在发送ACK了,然后继续发送SYN,直到把服务器的最大连接数量耗尽。 半连接队列长度是由内核参数tcp_max_syn_backlog来决定的。
ESTABLISHED
代表一个打开的连接,客户端收到服务器发送的SYN 1+ACK 1,就变为这个状态,然后向服务器发送ACK,如果服务器收到这个ACK,那么它也变为这个状态。这个状态就是表示连接以及建立,正在或即将传输数据。服务器收到ACK以后就会把半连接从上面提到的SYN队列中删除,然后放到ACCEPT队列中,这时这个半连接的状态就变成了ESTABLISHED。
FIN_WAIT1
主动关闭端(可以是服务器也可以是客户端)应用程序调用了close,于是其TCP发出FIN主动关闭请求,也就是四次断开的第一次,之后就进入了FIN_WAIT1状态,等待远程主机的ACK请求。
CLOSE_WAIT

被动关闭端(可以是服务器有可以是客户端)收到了对方发来的FIN后,进入该状态,然后发出ACK+1以回应FIN请求(它的接收也作为文件结束符传递给上层应用程序)。这个状态实际上是说客户端告诉服务器我没有请求或者数据要发送了,等待看看服务器或者说是进程还有没有数据要发送,如果有则继续发送,如果没有的话,就发送反向关闭指令。

如果服务器大量连接是这个状态就要去查看程序,很有可能是程序设计的问题。

FIN_WAIT2
主动关闭端收到ACK+1后,就进入的FIN_WAIT2状态,也就等服务器是否还有数据发来,如果服务器没有数据了,那么服务器就发送的反向关闭指令。也就是反向关闭连接指令FIN1+ACK1。实际上是告诉客户端我的数据发送完了,可以关闭连接了。
LAST_ACK
被动关闭端,发送反向结束连接请求FIN 1+ACK 1,然后进入LAST_ACK状态,等待主动关闭端发送ACK。
TIME_WAIT

主动关闭端收到FIN 1 +ACK 1后,并进入TIME_WAIT状态,然后发送ACK+1,等待一段时间(2MSL)以确保服务器收到了ACK+1,然后自己进入CLOSED状态。这个阶段主要是客户端为了再次确认一下服务器是否可以关闭连接,因为网络毕竟是不可靠的。

对于服务器有大量TIME_WAIT这个问题通常调整sysctl来解决。

CLOSING
比较少见,表示等待远程TCP对连接中断的确认。
CLOSED

被动关闭端在收到ACK包以后,就进入closed状态,连接结束。

UNKNOWN
未知的Socket状态

四次断开示意图:

wKiom1iyjuGhgs5pAAFA_9ckM9E178.gif

为什么TIME_WAIT要等2MSL时长?

服务器发送FIN给客户端,之后自己进入LAST_ACK阶段,客户端收到FIN之后会发送ACK并进入TIMW_WAIT阶段,如果服务器没有收到客户端最后的ACK,那么它将会重发FIN,所以一个包的最大生存时间就是1MSL,客户端等2倍就是为了防止这种情况发生,这样就有时间来接收服务器重发的FIN信号。

常用的命令组合:

查看当前正在监听的TCP端口有哪些

1
netstat -alnt

查看当前所有TCP端口的状态

1
netstat -nat

查看当前所有的TCP端口状态并列出进程ID    

1
netstat -natp

查看特定进程的网络连接状态

1
netstat -natp | grep PID

查看源IP中处于TIME_WAIT状态数量最多的前20名IP

sort排序,默认正向排序

uniq -c 去处重复项,-c是统计个数

sort -rn 再次排序反向排序,同时以纯数字进行,默认是纯文本。

head -n 20 显示前20名

1
netstat -nat | grep TIME_WAIT | awk '{print $5}' sort uniq -c | sort -rn | head -n 20

wKioL1ihfmah6Ap5AACJi1Tl3cQ794.jpg

查看访问80端口最多的前20个IP,其实道理和上面的类似。

1
netstat -natp | grep 8080 | awk '{print $5}' awk -F: '{print $1}' sort uniq -c | sort -rn | head -n 20

wKiom1ihf1DQL4quAABt8tN-I6o934.jpg

查看连接状态统计信息

1
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

wKioL1kKoIDi9GOLAAA4l89oPvw280.jpg注意:netstat命令是一个比较古老的命令,它执行效率相对ss命令来说比较慢,所以现在都使用ss命令代替,ss命令的语法格式基本和netstat命令类似。


SS:网络监控命令






      本文转自linuxjavachen  51CTO博客,原文链接:http://blog.51cto.com/littledevil/1865989,如需转载请自行联系原作者




网友评论

登录后评论
0/500
评论
技术小胖子
+ 关注