通过TCP Allocate连接数告警了解promethous-NodeExporter数据采集及相关知识扩散
1.问题由来
近日有环境告警如下:TCP Allocate连接数过多
很多资料告诉我们使用:netstat –ant | grep ^tcp | wc –l命令查询,但查询的值与告警中获取的只相差很大,于是抱着学习的心态下载NodeExporter的源码进行查看进行一探究竟。
2.NodeExporter源码初探
通过查看node_exporter-1.1.2代码了解到node_sockstat_TCP_alloc调用的是node_exporter.go代码中parseSockstatProtocol
函数。
func parseSockstatProtocol(kvs map[string]int) NetSockstatProtocol {
var nsp NetSockstatProtocol
for k, v := range kvs {
// Capture the range variable to ensure we get unique pointers for
// each of the optional fields.
v := v
switch k {
case "inuse":
nsp.InUse = v
case "orphan":
nsp.Orphan = &v
case "tw":
nsp.TW = &v
case "alloc":
nsp.Alloc = &v
case "mem":
nsp.Mem = &v
case "memory":
nsp.Memory = &v
}
} return nsp
}
进一步分析调用可知TCP Alloc的值取自于/proc/net/sockstat文件。
// NetSockstat retrieves IPv4 socket statistics.
func (fs FS) NetSockstat() (*NetSockstat, error) {
return readSockstat(fs.proc.Path("net", "sockstat"))
}
那么第一个疑问解决了,知道了TCP Alloc的取值方法。
那么问题来了,为什么netstat –ant | grep ^tcp | wc –l和/proc/net/sockstat查看的不一样。
3.ss VS netstat
3.1.socket
socket
是用于与网络通信的Linux文件描述符。在Linux中,所有东西都是一个文件。在这种情况下,可以将socket视为写入网络而不是写入磁盘的文件。socket在TCP和UDP中有不同的风格。
3.2.procfs
Procfs
(proc filesystem)是Linux公开的一种文件系统,它就像窥探内核内存一样。它存在于/proc中,并在/proc/net/tcp和/proc/net/udp 中暴露TCP和UDP套接字的信息。
3.3.ss VS netstat
通过查找netstat相关资料《netstat》了解到如下信息,人们正在从netstat转向ss,因为netstat(实际上是网络工具)已被弃用。但为什么还要如此多的人在使用netstat,猜测是因为netstat也可能被安装在更多的地方。
On Linux, netstat (part of "net-tools") is superseded by ss (part of iproute2). The replacement for netstat -r is ip route, the replacement for netstat -i is ip -s link, and the replacement for netstat -g is ip maddr, all of which are recommended instead.
ss包含在iproute2包中,是netstat的替代品。它除了显示类似于netstat的信息。并且可以显示比其他工具更多的TCP和状态信息。对于跟踪TCP连接和套接字,它是一种新的、非常有用的和更快的(与netstat相比)工具,同时ss直接查询内核,响应速度比netstat快得多。。
关于netstat的替代如下:
$ netstat -r replaced by $ ip route
$ netstat -i replaced by $ ip -s lin
$ netstat -g replaced by $ ip maddr
而ss命令是怎么获取到相关参数的?通过查看ss源码发现s
s实际上是解析/proc/net/sockstat的输出
。
tcp_total在/proc/net/sockstat的输出中实际上是“alloc”;
tcp4_hash在/proc/net/sockstat的输出中实际上是“inuse”;
tcp_tws在/proc/net/sockstat的输出中实际上是“tw”;
因此,/proc/net/sockstat的输出必须与ss -s的输出一致
。
# cat /proc/net/sockstat && echo "----" && cat /proc/net/sockstat6 && echo "---" && ss -s
sockets: used 7095
TCP: inuse 2066 orphan 0 tw 193 alloc 3235 mem 290
UDP: inuse 6 mem 3
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0
----
TCP6: inuse 1072
UDP6: inuse 4
UDPLITE6: inuse 0
RAW6: inuse 0
FRAG6: inuse 0 memory 0
---
Total: 7095 (kernel 17923)
TCP: 3428 (estab 3079, closed 290, orphaned 0, synrecv 0, timewait 193/0), ports 0 Transport Total IP IPv6
* 17923 - -
RAW 0 0 0
UDP 10 6 4
TCP 3138 2066 1072
INET 3148 2072 1076
FRAG 0 0 0
让我们手动解析下/proc/net/sockstat和sockstat6的输出:
s.tcp4_hashed = 2066
s.tcp6_hashed = 1072
s.closed = 290
s.tcp_tws = 193
我们可得出如下公式:
alloc=s.tcp_total=s.tcp_total =s.tcp4_hashed + s.tcp6_hashed + s.closed - s.tcp_tws
减去s.tcp_tws是因为290个closed套接字中193个是tcp_tws状态。
关于/proc/net/sockstat的输出信息如下:
sockets: used:已使用的所有协议套接字总量
TCP: inuse:正在使用(正在侦听)的TCP套接字数量。
TCP: orphan:无主(不属于任何进程)的TCP连接数(无用、待销毁的TCP socket数)
TCP: tw:等待关闭的TCP连接数。
TCP:alloc(allocated):已分配(已建立、已申请到sk_buff)的TCP套接字数量。
TCP:mem:套接字缓冲区使用量(单位不详。用scp实测,速度在4803.9kB/s时:其值=11,netstat –ant 中相应的22端口的Recv-Q=0,Send-Q≈400)
4.什么是tcp alloc
在socket统计中,有两种类型的TCP套接字:allocated (已分配)的和inuse(使用状态)。
1,.allocated :所有的TCP socket状态都被计数为alloc。
2,inuse:除TCP_CLOSE之外的所有TCP socket状态都被计算为inuse(使用状态)。
在许多情况下,TCP套接字可以标记为TCP_CLOSE。然而,内核将TCP套接字的初始状态设置为“TCP_CLOSE”。
因此,如果名为Closed的列具有较高的数字,而名为timewait的列具有较低的数字,那么应用程序可能会创建TCP套接字,而不做其他任何事情。在许多情况下,内核可能会将一个TCP套接字标记为TCP_CLOSE。这种情况就是其中一种,也是最常见的情况。
5.NodeExporter采集内存和CPU的方式
5.1.NodeExporter采集内存使用率
在promethous中获取内存使用率的公式为:
(1 - (node_memory_MemAvailable_bytes{instance=~"$node"} / (node_memory_MemTotal_bytes{instance=~"$node"})))* 100
通过分析NodeExporter的源码node_exporter-1.1.2/node_exporter_test.go,可知内存读取/proc/meminfo文件:
func (fs FS) Meminfo() (Meminfo, error) {
b, err := util.ReadFileNoStat(fs.proc.Path("meminfo"))
if err != nil {
return Meminfo{}, err
} m, err := parseMemInfo(bytes.NewReader(b))
if err != nil {
return Meminfo{}, fmt.Errorf("failed to parse meminfo: %v", err)
} return *m, nil
}
从而可知promethous中node_memory_MemAvailable_bytes的值是取自/proc/meminfo的MemAvailable参数值,node_memory_MemTotal_bytes是取自/proc/meminfo的MemTotal参数值。
而内存使用率公式为:
(1-MemAvailable/MemTotal)*100
5.2.NodeExporter采集CPU使用率
在promethous中获取内存使用率的公式为:
100 - (avg by (instance) (irate(node_cpu_seconds_total{instance=~"$node",mode="idle"}[5m])) * 100)
通过分析NodeExporter的源码procfs-0.0.8/procfs-0.0.8/stat.go,可知内存读取/proc/stat文件:
func (fs FS) Stat() (Stat, error) {
fileName := fs.proc.Path("stat")
data, err := util.ReadFileNoStat(fileName)
if err != nil {
return Stat{}, err
} stat := Stat{}
如果通过shell脚本读取/proc/stat文件内容计算出CPU使用率可参考:LINUX 根据 /proc/stat 文件计算cpu使用率的shell脚本
通过TCP Allocate连接数告警了解promethous-NodeExporter数据采集及相关知识扩散的更多相关文章
- 解决DataSnap支持的Tcp长连接数受限的两种方法
如何解决DataSnap支持的Tcp长连接数受限的问题? 方案一: 采用代理服务器方式,基本流程为: 1.客户先连接代理服务器:2.获取可用的服务器IP和端口:3.关闭与代理服务器之间的连接:4.建立 ...
- 关于DDOS攻击中TCP半连接数与FD的关系
TCP最大连接数 在tcp应用中,server事先在某个固定端口监听,client主动发起连接,经过三路握手后建立tcp连接.那么对单机,其最大并发tcp连接数是多少? 理论最大值 在确定最大连接数之 ...
- linux修改TCP最大连接数
环境 操作系统: oracle-linux7.3 修改系统支持的最大TCP连接 最大tcp连接数和系统允许打开的最大文件数,用户允许打开的最大文件数,TCP网络连接可用的端口范围有关,取上述的最小值: ...
- 测试Linux下tcp最大连接数限制
现在做服务器开发不加上高并发根本没脸出门,所以为了以后吹水被别人怼“天天提高并发,你自己实现的最高并发是多少”的时候能义正言辞的怼回去,趁着元旦在家没事决定自己写个demo搞一搞. 这个测试主要是想搞 ...
- Linux下TCP最大连接数受限问题
一. 文件数限制修改1.用户级别查看Linux系统用户最大打开文件限制:# ulimit -n1024 (1) vi /etc/security/limits.confmysql soft nofil ...
- 单机单网卡最大 tcp 长连接数是 65535 吗
在Linux里,如果是作为客户端或者负载均衡器的节点连接多个服务器,在connect()服务器之前, 调用bind()先绑定IP地址(通常是在多网卡的场景),即使使用bind(IP, port=0), ...
- zabbix 监控TCP状态连接数
1.zabbix客户端,监控TCP状态脚本,并保存到的定路径.(/usr/local/zabbix-agent/shells) # cat zabbix_linux_plugin.sh #!/bin/ ...
- 读书笔记——网络编程与开发技术(3)基于TCP/IP协议的网络编程相关知识
TCP/IP协议:数据链路层,网络层,传输层,应用层. IP地址分为5类:A类.B类.C类.D类.E类. (A类.B类.C类是基本类,D类多用于多播传送,E类为保留类.) "*"表 ...
- TCP相关知识
1. TCP与TCP/IP协议族 TCP是TCP/IP协议族中运输层的一个协议.TCP/IP,即传输控制协议/网间协议,是一个工业标准的协议集,包含了运输层.网络层和链路层的协议,其结构如下图所示:其 ...
随机推荐
- 使用Three.js和React把冰墩墩部署在网页上!实现人手一墩!
前言 最近冰墩墩一墩难求,大家开始通过各种方式打造自己的冰墩墩,各种冰墩墩开始出现,粘土冰墩墩,橘子冰墩墩,3D打印冰墩墩.这次通过前端的方式展示一个3D冰墩墩,现在开始吧. 声明:本文涉及奥运元素3 ...
- MacOS常用命令行工具
转自:https://blog.csdn.net/u014102846/article/details/77964493 https://ohmyz.sh/ https://github.com/ro ...
- SQL server 查询当前数据库所有表的行数
SELECT OBJECT_NAME(ii.id) TableName ,rows FROM sysindexes ii INNER JOIN sysobjects oo ON ( oo.id = i ...
- PHP面试常考之会话控制
你好,是我琉忆,欢迎您来到PHP面试专栏.本周(2019.2-25至3-1)的一三五更新的文章如下: 周一:PHP面试常考之会话控制周三:PHP面试常考之网络协议周五:PHP面试常考题之会话控制和网络 ...
- Solution -「CF 599E」Sandy and Nuts
\(\mathcal{Description}\) Link. 指定一棵大小为 \(n\),以 \(1\) 为根的有根树的 \(m\) 对邻接关系与 \(q\) 组 \(\text{LCA}\ ...
- Solution -「USACO 2020.12 P」Spaceship
\(\mathcal{Description}\) Link. Bessie 在一张含 \(n\) 个结点的有向图上遍历,站在某个结点上时,她必须按下自己手中 \(m\) 个按钮中处于激活状态 ...
- Note -「单位根反演」学习笔记
\(\mathcal{Preface}\) 单位根反演,顾名思义就是用单位根变换一类式子的形式.有关单位根的基本概念可见我的这篇博客. \(\mathcal{Formula}\) 单位根反演的 ...
- [Python]小白入门时遇到的各种问题
Q:关于Python2.X和Python3.X各种版本有什么区别,小白应该选哪个? A: 1.背景及简要介绍 Python 2 发布于 2000 年年底. 随着 Python 2 的不断发展,更多的功 ...
- RFC3918协议测试——网络测试仪实操
一.简介1.RFC3918简介历史· 在1999年3月成为正式标准 功能· 评测网络互连设备或网络系统的性能· 网络设备: 交换机,路由器- 内容· 定义了一整套测试方法,为不同厂家的设备/系统提供了 ...
- 用python写九九乘法表
用python来写九九乘法表,九九乘法表的结构是这样子的: 第一行是1 * 1 = 1,第二行是1 * 2 = 2 | 2 * 2 = 4...以此类推.注意到没,每一行的第一个乘的数字在从1到当行变 ...