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

news/2024/10/4 7:20:39

这是专栏第 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 表的使用情况,及时做出应对。如果有问题欢迎大家留言一起探讨。

 

图片

 

扩展阅读

  • 专栏:通过node-exporter源码掌握机器监控指标
  • SRE 排障利器,接口请求超时试试 httpstat
  • 告警恢复时终于可以显示恢复时的值了
  • 面向故障处理的可观测性体系建设

 

 

阅读 850
 
写留言
 
 
 
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hjln.cn/news/44469.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

最全面的86五笔字根表

摘自:https://www.cnblogs.com/yanan7890/p/8744535.html86版五笔字 G 11 王旁青头戋(兼)五一F 12 土士二干十寸雨D 13 大犬三(羊)古石厂S 14 木丁西A 15 工戈草头右框七H 21 目具上止卜虎皮J 22 日早两竖与虫依K 23 口与川,字根稀?L 24 田甲方框四车力M 25 山由贝,下框…

杂题选讲 #1:二分图边着色

Vizing 定理 定义 考虑如下的问题:对一个无向图的边进行着色,要求相邻的边染不同种颜色。问 需要的最少的颜色数是多少。 解决上述问题需要借助 Vizing 定理(又称维金定理)。 在开始之前,我们先进行一些符号的规定。\(\Delta(G)\):无向图 \(G=(V,E)\) 的最大度数,即 \(\…

【日记】分墨器大道至简,还挺好用(342 字)

正文今天没见到任何客户,在柜台坐着玩手机玩了一天。倒是看了许多书,虽说也没看多少就是了。此外给植物换了水,同步了下文章,整理了一下数据什么的。因为钢笔都没墨水了,去拿新墨水时忽然看见商家送的分墨套装,想着旧墨水瓶里还剩下挺多吸不上来,挺浪费。这墨水毕竟不便…

Ton 区块链的官方 类ERC20-Token 智能合约代码-Transfer部分解析

作者:林冠宏 / 指尖下的幽灵。转载者,请: 务必标明出处。 掘金:https://juejin.im/user/1785262612681997 GitHub : https://github.com/af913337456/ 出版的书籍:《1.0-区块链DApp开发实战》 《2.0-区块链DApp开发:基于公链》Ton 区块链的官方 类ERC20-Token 智能合约代…

备忘:HP Gen8服务器创建Raid

HP Gen8服务器创建Raid(there are no physical disks attached)原文地址:https://blog.51cto.com/tianhunyongheng/1606948 HP最新的X86服务器是Gen8系列,这个系列使用了ACU工具来创建Raid,这是图形化界面,可以说是更友好了。 本来通常情况下如果是买了一台新的服务器…

流畅的python--第十一章 符合 Python 风格的对象

一个库或框架是否符合 Python 风格,要看它能不能让 Python 程序 员以一种简单而自然的方式执行任务。—— Martijn Faassen Python 和 JavaScript 框架开发者 得益于 Python 数据模型,自定义类型的行为可以像内置类型那样自 然。实现如此自然的行为,靠的不是继承,而是鸭子类…

【机器学习】支持向量机(个人笔记)

目录SVM 分类器的误差函数分类误差函数距离误差函数C 参数非线性边界的 SVM 分类器(内核方法)多项式内核径向基函数(RBF)内核 源代码文件请点击此处! SVM 分类器的误差函数 SVM 使用两条平行线,使用中心线作为参考系 \(L: \ w_1x_1 + w_2x_2 + b = 0\)。我们构造两条线,…

使用PyTorch Profiler进行模型性能分析,改善并加速PyTorch训练

如果所有机器学习工程师都想要一样东西,那就是更快的模型训练——也许在良好的测试指标之后 加速机器学习模型训练是所有机器学习工程师想要的一件事。更快的训练等于更快的实验,更快的产品迭代,还有最重要的一点需要更少的资源,也就是更省钱。 熟悉PyTorch Profiler 然后就…