通过TCP Allocate连接数告警了解prometheus-NodeExporter数据采集及相关知识扩散

2023-05-16

1.问题由来

近日有环境告警如下:TCP Allocate连接数过多

很多资料告诉我们使用:netstat –ant | grep ^tcp | wc –l命令查询,但查询的值与告警中获取的只相差很大,于是下载NodeExporter的源码进行查看进行一探究竟。

 源文件:https://www.cnblogs.com/yaohong/p/16046499.html

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查看的不一样。

源文件:https://www.cnblogs.com/yaohong/p/16046499.html

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源码发现ss实际上是解析/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)

 源文件:https://www.cnblogs.com/yaohong/p/16046499.html

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。这种情况就是其中一种,也是最常见的情况。

源文件:https://www.cnblogs.com/yaohong/p/16046499.html

5.NodeExporter采集内存和CPU的方式

5.1.NodeExporter采集内存使用率

在prometheus中获取内存使用率的公式为:

(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
}

从而可知prometheus中node_memory_MemAvailable_bytes的值是取自/proc/meminfo的MemAvailable参数值,node_memory_MemTotal_bytes是取自/proc/meminfo的MemTotal参数值。

而内存使用率公式为:

(1-MemAvailable/MemTotal)*100

5.2.NodeExporter采集CPU使用率

在prometheus中获取内存使用率的公式为:

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脚本

 源文件:https://www.cnblogs.com/yaohong/p/16046499.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过TCP Allocate连接数告警了解prometheus-NodeExporter数据采集及相关知识扩散 的相关文章

  • 触发“对等方重置连接”

    我想测试当发生 对等方重置连接 错误时我们的应用程序 嵌入式 ftp 服务器 中发生的日志记录 这个帖子 https stackoverflow com questions 1434451 connection reset by peer很
  • 为什么我收到的数据包数据大小大于mss?

    我在两台 PC 上使用 ifconfig ethX mtu 300 修改了 MTU 并使用 netperf 测试网络 我用 WireShark 嗅探了 SYN 数据包中的 MSS 260 但我得到了一些大于 260 的数据包 为什么 嗅探器
  • 使用 boost 异步发送和接收自定义数据包?

    我正在尝试使用 boost 异步发送和接收自定义数据包 根据我当前的实现 我有一些问题 tcpclient cpp include tcpclient h include
  • Erlang gen_tcp 连接问题

    简单的问题 这段代码 client gt SomeHostInNet localhost to make it runnable on one machine ok Sock gen tcp connect SomeHostInNet 56
  • 当我使用“control-c”关闭发送对等方的套接字时,为什么接收对等方的套接字不断接收“”

    我是套接字编程的新手 我知道使用 control c 关闭套接字是一个坏习惯 但是为什么在我使用 control c 关闭发送进程后 接收方上的套接字不断接收 在 control c 退出进程后 发送方的套接字不应该关闭吗 谢谢 我知道使用
  • ADO.NET SQLServer:如何防止关闭的连接持有S-DB锁?

    i Dispose http msdn microsoft com en us library system data sqlclient sqlconnection close aspx一个 SqlConnection 对象 但是当然它并
  • Grafana 仪表板不显示 pod 名称,而是显示 pod_name

    我已经在 kubernetes 集群上部署了应用程序 并使用 prometheus 和 grafana 进行监控 对于使用 Grafana 仪表板进行 kubernetes pod 监控 Kubernetes集群监控 通过Prometheu
  • ADB TCPIP 连接问题

    我有两台 Galaxy S3 其中一个已扎根 另一个则未扎根 因此 当我尝试通过本地网络连接它们时 计算机可以看到已root的计算机 但是正常的就卡在tcpip这一步了 所以 我写 adb tcpip 5555 It says restar
  • 通过 TCP/.NET SSLStream 发送文件很慢/无法正常工作

    我正在编写一个与 SSL 配合使用的服务器 客户端应用程序 通过SSLStream 它必须做很多事情 不仅仅是文件接收 发送 目前 它的工作原理是 只有一个连接 我总是使用从客户端 服务器发送数据SSLStream WriteLine 并使
  • 了解 netty 通道缓冲区和水印

    我正在尝试了解网络缓冲区和水印 作为一个测试用例 我有一个 netty 服务器 它向客户端写入数据 客户端被阻止 基本上每次读取之间有 10 秒的睡眠时间 在正常 I O 下 如果接收方被阻塞 TCP 发送方将受到限制 由于流量控制 发送速
  • Docker 容器是否有自己的 TCP/IP 堆栈?

    我试图了解来自连接到主机的线路并定向到 Docker 容器内的应用程序的网络数据包在幕后发生了什么 如果它是一个经典的 VM 我知道到达主机的数据包将由虚拟机管理程序 例如 VMware VBox 等 传输到 VM 的虚拟 NIC 并从那里
  • 用 C 语言进行非阻塞 udp 套接字编程:我能得到什么?

    我在理解从非阻塞 UDP 套接字返回什么recv recvfrom 时遇到问题 与 TCP 相比更具体一点 如果我错了 请纠正我 阻塞套接字 TCP 或 UDP 在缓冲区中有一些数据之前不会从 recv 返回 这可以是一定数量的字节 TCP
  • prometheus中每个节点的CPU使用率

    理想情况下 我必须找出每个节点上 Pod 的 CPU 使用率百分比 但我试图找出每个节点的CPU使用率 我已经编写了查询 但它给了我超过 100 可以是 150 200 即使包含多个 cpu 的情况 我取了平均值 您能帮我理解下面的查询有什
  • 服务器套接字在 Close_Wait 中挂起

    场景如下 我正在从 C 服务器应用程序向客户端发送大量数据 突然数据流停止 客户端没有数据更新并且端口被阻塞 发生这种情况时 服务器端症状是 Close Wait 在该端口 netstat 操作将在日志中阻塞 错误代码 135 无法从客户端
  • TCL类C10K事件服务器开发进展如何?

    TCL 是一种很好的简单编程语言 但似乎没有得到认可和 或尊重它deserves http antirez com articoli tclmisunderstood html 我 1995 年在大学时就学过它 但很快就忘记了 直到最近才再
  • 我首次设置 AWS EB 时创建的默认安全组是什么?

    我对几个组所扮演的角色感到困惑 这些组似乎已自动添加到我的 AWS 安全组列表中 并以我收集的默认配置进行连接 并且想知道它们是如何工作的 以及它们的安全性如何 改变 具体来说 有三个神秘之处 launch wizard 1其中有一条入站规
  • SO_REUSEPORT 可以在 Unix 域套接字上使用吗?

    Linux 内核 gt 3 9 允许通过设置在内核负载平衡的进程之间共享套接字SO REUSEPORT http lwn net Articles 542629 http lwn net Articles 542629 这如何用于类型的套接
  • 在本地主机上使用相同的 IP 和端口创建套接字

    我在 Linux 上看到奇怪的行为 我看到远程端和本地端都显示相同的 IP 和端口组合 以下是 netstat 输出 netstat anp 网络统计grep 6102 tcp 0 0 139 185 44 123 61020 0 0 0
  • Jmeter TCP Sampler - 如何重用线程之间的连接?

    我在 JMeter 的 ThreadGroup 下设置了一个 TCP 采样器 数据是从 CSV 文件中选取的 第一行数据用于认证 后续行为实际参数数据 像下面这样的东西 AAAAAAA21 BBBBBBBCCCCCCCDDDDDDD BBB
  • 对卡在 CLOSE_WAIT 状态的连接进行故障排除

    我有一个在 Windows 上的 WebLogic 11g 中运行的 Java 应用程序 几天后它变得没有响应 我注意到的一个可疑症状是大量连接 大约 3000 个 出现在netstat即使服务器空闲 也具有 CLOSE WAIT 状态 由

随机推荐

  • 如何保存token-localStorage存储

    1 原理 原理是通过vue router的beforeEach钩子 xff0c 在每次路由到一个地址的时候先判断该路由是否携带了meta信息 xff0c 且该信息中的requireAuth是否为true xff0c 如果为true表示该路由
  • 在Tomcat服务器部署jar包

    在Tomcat服务器部署jar包 1 输出jar包 在eclipse环境下 xff0c 进入Run Configuration界面 xff0c 在Maven Build下选择demo 将Goals的内容改成package 2 将jar包部署
  • PTA 程序设计天梯赛(1~20题)

    文章目录 1 Hello World 5 分 2 打印沙漏 20 分 3 个位数统计 15 分 4 计算摄氏温度 5 分 5 考试座位号 15 分 6 连续因子 20 分 7 A B 20 分 8 计算指数 5 分 9 计算阶乘和 10 分
  • 关于动态(长度不定)结构体数组的两种处理方法

    讲解这个问题 xff0c 以一个例子入手 xff1a PAT xff08 A xff09 1080 Graduate Admission 方法一 xff1a 定义一个结构体数组 xff0c 为该数组开辟一块大的存储空间 xff0c 然后进行
  • 关于C++中string头文件的用法

    注意 xff1a 这里需要声明一点 xff0c 头文件string和string h是不同的 下面的代码是string的使用例子 xff0c 在string头文件下 xff0c 函数中 xff0c 是可以采取string str 61 34
  • 基于VS2010下利用MFC编写软件控制安捷伦信号源

    程控信号源 最近接触关于写 自动化测试软件 xff0c 里面用到了 xff0c 需要实现频谱仪 信号源的程序控制 所以 xff0c 就把每天遇到的问题 xff0c 和学到的知识 xff0c 进行一个总结思考 信号源程控实现 xff1a 信号
  • Qt中emit的用法:发射信号

    emit是为了调用对应的槽函数 xff0c 用来发射信号
  • OAI:Ubuntu20.04不支持OAI

    遇到一个无法解决的问题 xff0c 将ubuntu从18 04升级到了20 04 xff0c 发现ubuntu20 04不支持OAI啊 xff01
  • OAI:eNB模块和UE模块的示波器显示

  • 力扣网页PC端无法进入(问题得到解决)

    最近发现在不同地方 xff0c 使用不同WiFi时 xff0c 有些地点出现力扣网页PC端无法加载的问题 按照网上方法进行了调试 xff0c 发现帖子推荐改hosts文件 xff0c 将自己电脑https leetcode cn com 的
  • Linux临时动态调整kvm虚拟机内存

    一 运维内容描述 同事反馈在用的虚拟机内存不足 xff0c 需要调整 查看一个虚拟机的内存情况 xff0c 最大是8G内存 xff0c 当前内存显示是4G 虚拟机调整最大内存是需要关闭虚拟机的 xff0c 但现在虚拟机上部了服务 xff0c
  • stringstream的用法

    1 用stringstream来分割指定的字符字符串 xff0c 代码如下 xff1a span class token comment 用stringstream来分割指定的字符字符串 span span class token macr
  • C++字符串输入问题

    经常写核心代码模式 xff0c 对于输入输出很多情况下 xff0c 不怎么会写了 所以 xff0c 做个总结 对于如下输入 xff1a span class token comment 输入 xff1a span span class to
  • 中国系统面试0819

    一面 xff1a 30min C 43 43 xff1a 1 C 43 43 的三大特性 xff0c 以及在项目中是如何是用到的 xff08 封装 继承 多态 xff09 2 STL了解哪些 xff0c 在项目中如何使用的 xff0c 举例
  • C语言实现多态

    利用C语言实现多态 xff1a c语言多态的实现 xff0c 需要用到函数指针 函数名实际上是该函数代码存储空间的首地址 xff0c 这个地址可以通过函数指针来存放 通过改变函数指针存储的地址就可以实现多态 span class token
  • 深入浅析Mysql联合索引原理 之 最左匹配原则。

    前言 之前在网上看到过很多关于mysql联合索引最左前缀匹配的文章 xff0c 自以为就了解了其原理 xff0c 最近面试时和大牛交流中 xff0c 发现遗漏了些东西 xff0c 这里自己整理一下这方面的内容 最左前缀匹配原则 在mysql
  • kubernetes Value:将磁盘挂载到容器,PV,PVC

    6 1 介绍卷 6 1 1 卷的类型 emptyDir 用于存储临时数据的简单空目录 hostPath 用于将目录从工作节点的文件系统挂载到pod nfs 挂载到pod中的NFS共享卷 还有其他的如gitRepo gcepersistenD
  • 记一次容器内执行ansible命令卡住

    1 由来 最近在使用kylin v10系统 xff0c 发现当在此系统下运行的容器内执行 ansible localhost m setup 命令会卡住不动 xff0c 于是和同事一起经过如下排查最终找到解决问题的办法 2 环境 2 1 系
  • k8s pod报错Process failed to launch spawn E2BIG

    一 问题描述 近期遇到k8s环境中一个pod无法正常启动 xff0c 启动报错 xff0c PM2 ERROR Process failed to launch spawn E2BIG 二 问题分析 2 1 了解报错相关知识 查阅资料发现
  • 通过TCP Allocate连接数告警了解prometheus-NodeExporter数据采集及相关知识扩散

    1 问题由来 近日有环境告警如下 xff1a TCP Allocate连接数过多 很多资料告诉我们使用 netstat ant grep tcp wc l命令查询 xff0c 但查询的值与告警中获取的只相差很大 xff0c 于是下载Node