SS命令和Netstat命令比较
在早期运维工作中,查看服务器连接数一般都会用netstat命令。其实,有一个命令比netstat更高效,那就是ss(Socket Statistics)命令! ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容。 ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。原因如下: 1)当服务器的socket连接数量变得非常大时,无论是使用netstat命令还是直接cat /proc/net/tcp,执行速度都会很慢。可能你不会有切身的感受,但请相信我,当服务器维持的连接达到上万个的时候,使用netstat等于浪费 生命,而用ss才是节省时间。 2)而ss快的秘诀在于它利用到了TCP协议栈中tcp_diag。tcp_diag是一个用于分析统计的模块,可以获得Linux内核中第一手的信息,这就确保了ss的快捷高效。当然,如果你的系统中没有tcp_diag,ss也可以正常运行,只是效率会变得稍慢(但仍然比 netstat要快)。
为了验证ss比netstat更快更高效,可以如下做几个实验看看效果: 几乎所有的Linux系统都会默认包含netstat命令,但并非所有系统都会默认包含ss命令。 netstat命令是net-tools工具集中的一员,这个工具一般linux系统会默认安装的;ss命令是iproute工具集中的一员; net-tools是一套标准的Unix网络工具,用于配置网络接口、设置路由表信息、管理ARP表、显示和统计各类网络信息等等,但是遗憾的是,这个工具自2001年起便不再更新和维护了。 iproute,这是一套可以支持IPv4/IPv6网络的用于管理TCP/UDP/IP网络的工具集
如果没有ss命令,可以如下安装: [root@wang ~]# yum install iproute iproute-doc
当服务器维持30000个socket连接时,使用netstat和ss命令统计连接数的耗时情况如下: [root@wang ~]# netstat -at | wc -l //耗时15.60秒 [root@wang ~]# ss -atr | wc -l //耗时5.40秒(未利用tcp_diag) [root@wang ~]# ss -atr | wc -l //耗时0.47秒(利用tcp_diag)
ss -a 查看机器的socket连接数 ss -l 查看机器的端口情况 ss -s 查看机器的网络连接数
1)查看当前服务器的网络连接统计。 在服务器产生大量sockets连接时,一般常会使用这个命令做宏观统计。 [root@wang ~]# ss -s
Total: 318 (kernel 419)
TCP: 62 (estab 16, closed 18, orphaned 0, synrecv 0, timewait 17/0), ports 198
Transport Total IP IPv6
* 419 - -
RAW 0 0 0
UDP 18 18 0
TCP 44 44 0
INET 62 62 0
FRAG 0 0 0
2)查看所有打开的网络端口 如果使用-pl参数的话,则会列出具体的程序名称 [root@wang ~]# ss -l State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:rquotad *:* LISTEN 0 128 *:46700 *:* LISTEN 0 100 *:sun-as-jmxrmi *:* LISTEN 0 128 *:40591 *:* LISTEN 0 128 *:sunrpc *:* LISTEN 0 128 *:webcache *:* ........ 3)想查看这台服务器上所有的socket连接 如果只想查看TCP sockets,那么使用-ta选项; 如果只想查看UDP sockets,那么使用-ua选项; 如果只想查看RAW sockets,那么使用-wa选项; 如果只想查看UNIX sockets,那么使用-xa选项。 [root@wang ~]# ss -a ...... ESTAB 0 0 101.201.114.106:54957 111.205.224.15:https TIME-WAIT 0 0 10.25.91.53:58645 10.44.183.73:11212 TIME-WAIT 0 0 10.25.91.53:35920 10.171.60.171:11212 TIME-WAIT 0 0 10.25.91.53:http 100.109.192.96:17837 ESTAB 0 0 101.201.114.106:57479 139.196.38.174:56516 TIME-WAIT 0 0 127.0.0.1:cslistener 127.0.0.1:42728
--------------------------netstat中的各种状态------------------------------
CLOSED 初始(无连接)状态。
LISTEN 侦听状态,等待远程机器的连接请求。
SYN_SEND 在TCP三次握手期间,主动连接端发送了SYN包后,进入SYN_SEND状态,等待对方的ACK包。
SYN_RECV 在TCP三次握手期间,主动连接端收到SYN包后,进入SYN_RECV状态。
ESTABLISHED 完成TCP三次握手后,主动连接端进入ESTABLISHED状态。此时,TCP连接已经建立,可以进行通信。
FIN_WAIT_1 在TCP四次挥手时,主动关闭端发送FIN包后,进入FIN_WAIT_1状态。
FIN_WAIT_2 在TCP四次挥手时,主动关闭端收到ACK包后,进入FIN_WAIT_2状态。
TIME_WAIT 在TCP四次挥手时,主动关闭端发送了ACK包之后,进入TIME_WAIT状态,等待最多MSL时间,让被动关闭端收到ACK包。
CLOSING 在TCP四次挥手期间,主动关闭端发送了FIN包后,没有收到对应的ACK包,却收到对方的FIN包,此时,进入CLOSING状态。
CLOSE_WAIT 在TCP四次挥手期间,被动关闭端收到FIN包后,进入CLOSE_WAIT状态。
LAST_ACK 在TCP四次挥手时,被动关闭端发送FIN包后,进入LAST_ACK状态,等待对方的ACK包。
主动连接端可能的状态有: CLOSED SYN_SEND ESTABLISHED
主动关闭端可能的状态有: FIN_WAIT_1 FIN_WAIT_2 TIME_WAIT
被动连接端可能的状态有: LISTEN SYN_RECV ESTABLISHED
被动关闭端可能的状态有: CLOSE_WAIT LAST_ACK CLOSED
在Linux下,如果连接数比较大,可以使用效率更高的ss来替代netstat。
查看tomcat的并发数:netstat -an|grep 10050|awk '{count[$6]++} END{for (i in count) print(i,count[i])}'
- Flask一步步搭建web应用
- (44) 剖析TreeSet / 计算机程序的思维逻辑
- (46) 剖析PriorityQueue / 计算机程序的思维逻辑
- (48) 剖析ArrayDeque / 计算机程序的思维逻辑
- 那些年在win下填过的Django坑
- Python爬虫一步步抓取房产信息
- (47) 堆和PriorityQueue的应用 / 计算机程序的思维逻辑
- 一篇文章完全理解virtualenv
- Python运用蒙特卡洛算法模拟植物生长
- (57) 二进制文件和字节流 / 计算机程序的思维逻辑
- 真正的 Tornado 异步非阻塞
- (58) 文本文件和字符流 / 计算机程序的思维逻辑
- Python爬虫—破解JS加密的Cookie
- Python通过抓包和使用cookie爬取微博完全讲解
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- java编程思想第四版第十章习题
- java编程思想第四版第十一章总结
- java编程思想第四版第十一章习题
- java编程思想第四版第十三章字符串 习题
- java编程思想第四版第十三章字符串 总结
- LoRa节点开发——代码详解修改LoRaWAN相关参数
- 01 . Redis简介及部署主从复制
- 07 . Kubernetes之Service
- LoRa节点开发——代码详解如何修改发射和接收信道(频率)
- 06 . Kubernetes之Pod控制器详细介绍及应用
- Python面试题
- 08 . Kubernetes之 ingress及Ingress Controller
- cpu占用过高排查
- LoRa节点开发——代码详解LoRaWAN发送与接收数据
- java编程思想第四版第十四章 类型信息习题