首页 > 其他分享 >Conntrack 监控,别等故障了再回来加监控

Conntrack 监控,别等故障了再回来加监控

时间:2024-06-13 18:21:51浏览次数:29  
标签:node stat Conntrack 00000000 Number nf 故障 conntrack 监控

这是专栏第 8 篇,介绍一下 node-exporter 的 conntrack 插件。这个插件大家平时关注可能较少,但是在一些场景下,比如防火墙、NAT 网关等,需要监控 conntrack 表的使用情况。我就遇到过一次生产事故,就是因为 conntract 表满了,导致新连接无法建立,所以这个插件还是很有用的。

conntrack 插件采集了那些指标

默认普通机器未必会启用 conntrack,所以你可能看不到这个插件的指标。我这里通过 systemctl start firewalld 把防火墙启动了,然后就有了 conntrack 的指标。

[root@aliyun-2c2g40g3m tarball]# curl -s localhost:9100/metrics | grep "node_nf_conntrack_"
# HELP node_nf_conntrack_entries Number of currently allocated flow entries for connection tracking.
# TYPE node_nf_conntrack_entries gauge
node_nf_conntrack_entries 44
# HELP node_nf_conntrack_entries_limit Maximum size of connection tracking table.
# TYPE node_nf_conntrack_entries_limit gauge
node_nf_conntrack_entries_limit 65536
# HELP node_nf_conntrack_stat_drop Number of packets dropped due to conntrack failure.
# TYPE node_nf_conntrack_stat_drop gauge
node_nf_conntrack_stat_drop 0
# HELP node_nf_conntrack_stat_early_drop Number of dropped conntrack entries to make room for new ones, if maximum table size was reached.
# TYPE node_nf_conntrack_stat_early_drop gauge
node_nf_conntrack_stat_early_drop 0
# HELP node_nf_conntrack_stat_found Number of searched entries which were successful.
# TYPE node_nf_conntrack_stat_found gauge
node_nf_conntrack_stat_found 0
# HELP node_nf_conntrack_stat_ignore Number of packets seen which are already connected to a conntrack entry.
# TYPE node_nf_conntrack_stat_ignore gauge
node_nf_conntrack_stat_ignore 0
# HELP node_nf_conntrack_stat_insert Number of entries inserted into the list.
# TYPE node_nf_conntrack_stat_insert gauge
node_nf_conntrack_stat_insert 0
# HELP node_nf_conntrack_stat_insert_failed Number of entries for which list insertion was attempted but failed.
# TYPE node_nf_conntrack_stat_insert_failed gauge
node_nf_conntrack_stat_insert_failed 0
# HELP node_nf_conntrack_stat_invalid Number of packets seen which can not be tracked.
# TYPE node_nf_conntrack_stat_invalid gauge
node_nf_conntrack_stat_invalid 2751
# HELP node_nf_conntrack_stat_search_restart Number of conntrack table lookups which had to be restarted due to hashtable resizes.
# TYPE node_nf_conntrack_stat_search_restart gauge
node_nf_conntrack_stat_search_restart 6261

什么是 Conntrack

要想理解这些指标,首先得知道什么是 Conntrack。Conntrack 是 Linux 内核中的一个模块,用来跟踪连接的状态。比如,你的机器是一个 NAT 网关,那么 Conntrack 就会记录内网 IP 和端口到外网 IP 和端口的映射关系。这样,当外网回包的时候,内核就能根据 Conntrack 表找到对应的内网 IP 和端口,把包转发给内网机器。我们可以通过 conntrack -L 命令查看 Conntrack 表的内容。

Conntrack 表是有限的,所以当表满了,新连接就无法建立。这时,就会出现 nf_conntrack: table full 的错误,导致生产故障。

常用告警规则

通常,我们需要配置如下告警规则:

100 * node_nf_conntrack_entries / node_nf_conntrack_entries_limit > 85

Conntrack 条目使用率超过 85% 就告警,及时做出应对,通常的应对措施是增大 Conntrack 表的大小,或者调整 Conntrack 的超时时间,或者直接设置某些连接不走 Conntrack。

conntrack 插件采集逻辑

具体逻辑在 conntrack_linux.go,只有 Linux 有此插件,其他系统没有。和其他 node-exporter 采集插件类似,还是提供了 initNewConntrackCollectorUpdate 等函数。采集逻辑在 Update 中。代码如下:

func (c *conntrackCollector) Update(ch chan<- prometheus.Metric) error {
	value, err := readUintFromFile(procFilePath("sys/net/netfilter/nf_conntrack_count"))
	if err != nil {
		return c.handleErr(err)
	}
	ch <- prometheus.MustNewConstMetric(
		c.current, prometheus.GaugeValue, float64(value))

	value, err = readUintFromFile(procFilePath("sys/net/netfilter/nf_conntrack_max"))
	if err != nil {
		return c.handleErr(err)
	}
	ch <- prometheus.MustNewConstMetric(
		c.limit, prometheus.GaugeValue, float64(value))

	conntrackStats, err := getConntrackStatistics()
	if err != nil {
		return c.handleErr(err)
	}

	ch <- prometheus.MustNewConstMetric(
		c.found, prometheus.GaugeValue, float64(conntrackStats.found))
	ch <- prometheus.MustNewConstMetric(
		c.invalid, prometheus.GaugeValue, float64(conntrackStats.invalid))
	ch <- prometheus.MustNewConstMetric(
		c.ignore, prometheus.GaugeValue, float64(conntrackStats.ignore))
	ch <- prometheus.MustNewConstMetric(
		c.insert, prometheus.GaugeValue, float64(conntrackStats.insert))
	ch <- prometheus.MustNewConstMetric(
		c.insertFailed, prometheus.GaugeValue, float64(conntrackStats.insertFailed))
	ch <- prometheus.MustNewConstMetric(
		c.drop, prometheus.GaugeValue, float64(conntrackStats.drop))
	ch <- prometheus.MustNewConstMetric(
		c.earlyDrop, prometheus.GaugeValue, float64(conntrackStats.earlyDrop))
	ch <- prometheus.MustNewConstMetric(
		c.searchRestart, prometheus.GaugeValue, float64(conntrackStats.searchRestart))
	return nil
}

首先是读取 /proc/sys/net/netfilter/nf_conntrack_count 和 /proc/sys/net/netfilter/nf_conntrack_max 文件,获取当前 Conntrack 表的条目数和最大条目数。然后调用 getConntrackStatistics 函数获取 Conntrack 的统计信息,比如 found、invalid、ignore、insert、insertFailed、drop、earlyDrop、searchRestart 等。最后将这些指标发送到 ch 通道。

getConntrackStatistics 读取的是 /proc/net/stat/nf_conntrack 文件的内容并做解析,我们看看 /proc/net/stat/nf_conntrack 的内容:

[root@aliyun-2c2g40g3m tarball]# cat /proc/net/stat/nf_conntrack
entries  clashres found new invalid ignore delete delete_list insert insert_failed drop early_drop icmp_error  expect_new expect_create expect_delete search_restart
00000022  00000000 00000000 00000000 00000b0c 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000012  00000000 00000000 00000000 00001591
00000022  00000000 00000000 00000000 0000008b 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 0000034f

各个字段的含义,我们查阅一下权威文档:https://man7.org/linux/man-pages/man8/rtstat.8.html

/proc/net/stat/ip_conntrack, /proc/net/stat/nf_conntrack
	Conntrack related counters. ip_conntrack is for backwards
	compatibility with older userspace only and shows the same
	data as nf_conntrack.

	entries Number of entries in conntrack table.

	searched Number of conntrack table lookups performed.

	found Number of searched entries which were successful.

	new Number of conntrack entries added which were not
	expected before.

	invalid Number of packets seen which can not be tracked.

	ignore Number of packets seen which are already connected
	to a conntrack entry.

	delete Number of conntrack entries which were removed.

	delete_list Number of conntrack entries which were put to
	dying list.

	insert Number of entries inserted into the list.

	insert_failed Number of entries for which list insertion
	was attempted but failed (happens if the same entry is
	already present).

	drop Number of packets dropped due to conntrack failure.
	Either new conntrack entry allocation failed, or protocol
	helper dropped the packet.

	early_drop Number of dropped conntrack entries to make
	room for new ones, if maximum table size was reached.

	icmp_error Number of packets which could not be tracked
	due to error situation. This is a subset of invalid.

	expect_new Number of conntrack entries added after an
	expectation for them was already present.

	expect_create Number of expectations added.

	expect_delete Number of expectations deleted.

	search_restart Number of conntrack table lookups which had
	to be restarted due to hashtable resizes.

这个文件的数值是 16 进制表示的,所以 node-exporter 中会转换成十进制的数值,另外我的系统上来看,数值有多行,node-exporter 代码里会把这些数值累加起来。

小结

本节介绍了 node-exporter 的 conntrack 插件,这个插件用来监控 Conntrack 表的使用情况,通常用于防火墙、NAT 网关等场景。Conntrack 表是有限的,当表满了,新连接就无法建立,所以需要监控 Conntrack 表的使用情况,及时做出应对。如果有问题欢迎大家留言一起探讨。

监控/可观测性领域的知识太过驳杂,想要找个乙方帮忙建设整套可观测性体系?欢迎联系我们啊:https://flashcat.cloud/contact/

标签:node,stat,Conntrack,00000000,Number,nf,故障,conntrack,监控
From: https://www.cnblogs.com/ulricqin/p/18246504

相关文章

  • SFC命令的基本用法,以及处理基本系统文件问题的能力,为系统维护和故障排除提供基础支持;S
    SFC命令初级应用大纲1.理解SFC命令命令简介:了解SFC(SystemFileChecker)命令的作用和基本原理。掌握SFC命令的基本语法和用法。2.执行基本系统文件检查运行SFC扫描:学习如何以管理员身份在命令提示符或Powershell中运行SFC扫描。理解SFC扫描的过程和输出。解......
  • 阿里云运维第一步(监控):开箱即用的监控
    作者:仲阳这是云的时代,现在云计算已经在各行各业广泛的应用。但是上云对于大多数客户来说,依然有很大的学习成本,如下图仅是阿里云都有几百款产品,怎么选择?怎么用?对于客户来说都是问题。“用好云、管好云”不仅仅是口号,还是我们的目标。来自于:https://developer.aliyun.com/ebook/8......
  • 淘宝天猫sku实时监控
    淘宝天猫sku实时监控可以通过以下步骤实现:获取需要监控的商品的SKUID。使用数据抓取工具(如Python的requests库)发送网络请求,获取商品的实时数据。解析返回的数据,提取所需的信息,如商品价格、库存数量等。将提取到的数据与预设的阈值进行比较,如果符合条件,发送提醒信息。设置定时......
  • 记一次 .NET某工厂报警监控设置 崩溃分析
    一:背景1.讲故事前些天有位朋友在微信上丢了一个崩溃的dump给我,让我帮忙看下为什么出现了崩溃,在Windows的事件查看器上显示的是经典的访问违例,即c0000005错误码,不管怎么说有dump就可以上windbg开干了。二:WinDbg分析1.程序为谁崩溃了在Windows平台上比较简单,可以用......
  • 【90%人不知道的状态识别/故障诊断新方法】注意熵Attention Entropy及其5种多尺度熵-M
    目录引言数据集特征提取分类器诊断流程友情提示Matlab代码下载点击链接跳转:引言注意熵(AttentionEntropy,翻译可能不准确哈,请谅解)于2023年发表在顶级期刊IEEEtrans系列-IEEETransactionsonAffectiveComputing(影响因子:11.2)。注意熵首次提出并运用于心跳间隔时......
  • 如何用程序向微信发送消息,实现程序的运行监控
    程序如下importrequestsimportjsonimportosdefget_token(appID,appsecret):url_token='https://api.weixin.qq.com/cgi-bin/token?'res=requests.get(url=url_token,params={"grant_type":'client_credential'......
  • 云平台DNS故障导致网站访问卡顿异常排查过程,wireshark、strace等工具在实际问题排查过
    一、问题现象    项目上使用华为私有云,前段时间华为升级云平台后,云上用户反馈业务系统出现卡顿,之前几秒可以刷新出来的页面现在需要几十秒。提供了一个比较明显的url和curl调用方法。10.213.x.xxx:8082/files/logincurl-H"Content-Type:application/json"-H"T......
  • 再也不用担心流量超过上限了!Windows 11中监控数据使用情况的几种方法
    序言如果你使用按流量计费的连接或担心超过数据上限,在Windows上监控你的数据使用情况可能是有益的。这允许你调整你的使用模式,以确保你有效地使用数据。方法如下。使用任务管理器密切关注数据使用情况在任务管理器中,你可以实时监控计算机上的应用程序使用的数据量。这可以帮......
  • 国标GB28181安防视频监控EasyCVR平台级联时上级平台不显示通道是什么原因?
    国标GB28181安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台部署轻快,可支持的主流标准协议有GA/T1400、国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。有用户反馈,GA/T1400协议/安防综合管理系统/视频汇聚EasyCVR......
  • 意外停电致hadoop所有namenode节点无法启动故障处理
    环境hadoop(版本:3.3.5)集群由3个datanode(dn)节点组成,其中2个namenode(nn)节点,采用QJM(QuorumJournalManager)方案组建高可用服务。问题描述与处理单位意外断电导致hdfs服务不可用,尝试重启服务:myhadoop.shstopmyhadoop.shstart多次执行jpsall观察各服务启动情况,发现na......