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

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

时间:2024-06-12 12:55:55浏览次数:23  
标签: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 表的使用情况,及时做出应对。如果有问题欢迎大家留言一起探讨。

 

图片

 

扩展阅读

 

 

阅读 850 ​ 喜欢此内容的人还喜欢   告警恢复时终于可以显示恢复时的值了     我关注的号 SRETalk   不看的原因   Golang:bytes 格式和解析数字字节值(10K、2M、3G等)     我看过的号 Coding Big Tree   不看的原因   【后端】dockerhub镜像也遭受“无妄之灾”?     浪客问心   不看的原因   写留言       SRETalk  

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

相关文章

  • 一种改进盲解卷积算法在旋转机械故障诊断中的应用(MATLAB)
    滚动轴承故障形成后,故障区与其他零部件表面接触将产生循环平稳的瞬态脉冲。由于受到系统传递函数、轴转频和环境噪声的干扰,故障脉冲特征受到大幅衰减,在测得信号中表现十分微弱甚至完全不可见。盲解卷积算法通过搜索一个最优的有限脉冲响应滤波器来降低信号传输路径、轴转频和环......
  • 深入解析MySQL Threads_running:监控、诊断与性能优化策略
    基本概念​在MySQL中,Threads_running是一个用于监控数据库并发连接数的指标。它表示当前正在执行的线程数。当该值超过数据库能够处理的最大连接数时,可能会导致数据库性能下降甚至崩溃。线程数过多会由于上下文切换、锁等待等问题从而导致性能急剧下降。设置Threads_......
  • 卫星通讯传输技术助力电力运维巡检效率提升:EasyCVR实现远程监控与管理的新路径
    随着科技的快速发展,视频监控技术已广泛应用于各个领域。而卫星通讯作为一种高效、稳定的通信方式,为视频监控系统的远程传输提供了有力支持。一、方案背景随着电力行业的快速发展,电力运维巡检工作变得愈发重要。传统的巡检方式往往受到地域、环境等因素的限制,难以实现对电力设备......
  • Redis的监控与调优:工具使用和性能提升技巧
    I.引言A.介绍Redis的重要性,以及为什么需要对Redis进行监控和调优 Redis是一种内存数据结构存储系统,它支持多种数据类型,如字符串、列表、集合、哈希表等,并提供了丰富的操作命令。Redis的高性能和灵活性使其在许多场景中都发挥了重要作用,例如,作为缓存降低数据库的访问压......
  • .net8 aspire 启动不用https 报ASPIRE_ALLOW_UNSECURED_TRANSPORT故障
    故障显示System.AggregateException:“Oneormoreerrorsoccurred.(The'applicationUrl'settingmustbeanhttpsaddressunlessthe'ASPIRE_ALLOW_UNSECURED_TRANSPORT'environmentvariableissettotrue.Thisconfigurationiscommonlyset......
  • .NET 使用 OpenTelemetry metrics 监控应用程序指标
    上一次我们讲了OpenTelemetryLogs与OpenTelemetryTraces。今天继续来说说OpenTelemetryMetrics。随着现代应用程序的复杂性不断增加,对于性能监控和故障排除的需求也日益迫切。在.NET生态系统中,OpenTelemetryMetrics可用于实时监控和分析应用程序的性能指标。比如监控......
  • 【工作必备知识】Linux磁盘I/O故障排查分析定位 iostat 介绍
    【工作必备知识】Linux磁盘I/O故障排查分析定位iostat介绍大家好,我是秋意零。前言:今天,介绍Linux磁盘I/O故障排查时,必备命令iostat。该命令是监视系统I/O设备使用负载,它可以实时监视IO设备,从而帮助我们进行分析定位问题。iostat命令介绍iostat命令:监视系统I/O设备使......
  • 内存故障预测的重要性
    在互联网这片无垠的数字疆域里,服务器如同一座座坚不可摧的堡垒,支撑起数据的洪流与应用的风暴。然而,在这辉煌的背后,隐藏着硬件故障的暗流,它们伺机而动,随时可能引发一场灾难性的“数字海啸”。内存,作为服务器的神经中枢,其稳定性至关重要,而内存故障无疑是这场隐秘战中的头号敌人......
  • Zabbix 7.0 LTS - 企业级开源监控解决方案
    Zabbix7.0LTS-企业级开源监控解决方案Zabbix|TheEnterprise-ClassOpenSourceNetworkMonitoringSolution请访问原文链接:https://sysin.org/blog/zabbix-7/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgZabbix简介全方位监控获取整个IT基础架构栈......
  • jmeter性能优化之mysql监控sql慢查询语句分析
    接上次博客:基础配置多用户登录并退出jmx文件:百度网盘提取码:0000一、练习jmeter脚本检测mysql慢查询随意找一个脚本(多用户登录并退出),并发数设置300、500后分别查看mysql监控平台启动后查看,主要查看mysql连接情况下图查看:MaxUsedConnections最大176,分析查看:设置......