Skip to main content

Command Palette

Search for a command to run...

Linux Conntrack 的短板

Published
1 min read

原文:When Linux conntrack is no longer your friend

作者:Alex Pollitt

Linux 内核中,conntrack 的是网络栈的核心功能之一。它使得内核能够跟踪所有逻辑网络连接或者流量,因此能够鉴别构成流量的数据包,从而对每个数据流进行一致的处理。

Conntrack 是一个重要的内核功能,是一些关键用例的基础:

  • NAT 能够根据 Conntrack 的信息,对构成数据流的所有数据包进行翻译。例如当 Pod 访问 Kubernetes 服务的时候,kube-proxy 的负载均衡功能会使用 NAT 把连接重定向给指定的后端 Pod。Conntrack 负责对指定连接进行记录,发送到 Service IP 的数据包会被发送给同一个后端 Pod,从后端 Pod 返回的数据包会反向送回源 Pod。

  • Calico 这样的有状态防火墙,依赖 Conntrack 的信息来精确的将响应流量纳入白名单。用户如果编写了一个“允许 Pod 连接所有远端 IP”的策略,无需进行其它工作就能够允许所有的返回流量(如果没有这种功能,就必须加入一个不那么安全的规则:允许所有目标是该 Pod 的流量)。

另外 Conntrack 还能够提高性能(降低 CPU 和延迟),这是因为只有第一个数据包需要完成整个网络栈的处理,参见 Comparing kube-proxy modes 一文,其中包含了这方面的例子。

然而 Conntrack 也有其限制。

那么它哪里不行了?

Conntrack 的存储表有一个可配置的最大容量,如果满了,连接通常会被拒绝和丢弃。在多数负载情况下,这个表的容量是足够的,不会出现这种问题。但是有些场景下,Conntrack 也会不够用:

  • 最常见的情况是,如果你的服务器需要同时处理非常大数量的活动连接。例如你的 Conntrack 表设置为 128k 的容量,但是你的并发连接超过了 128k,这肯定会出问题。

  • 另外一种情况没那么常见——每秒处理极大数量的连接。这些连接就算再短,Linux 还会在超时(通常是 120 秒)期限内对其进行跟踪。例如如果你的 Conntrack 容量设置为 128k,尝试每秒钟处理 1100 个连接,这就会超出 Conntrack 表的限制(128k/120秒 = 1092 连接/秒)。

有个别的负载类型就符合这种条件。另外如果在一个恶劣环境中,用大量的半开连接冲击服务器,就能造成拒绝服务攻击的效果。两种情况下,Conntrack 都会成为系统中的瓶颈。有些情况下,通过提高 Conntrack 数据表容量或者降低 Conntrack 的超时时间(如果调节失误,可能会造成更多痛苦)就能解决问题。别的场景中,可能需要跨过 Conntrack 来处理这种威胁。

一个真实的案例

我们合作的某大型 SaaS 供应商,他们有一组运行于物理机(不是虚拟化,也不是容器化)上的 Memcached 服务器,每台服务器每秒都要处理 50k 以上的短连接。这可不是标准的 Linux 配置能够承受的。

他们曾经使用提高 Conntrack 数据表容量和降低超时时间的方式进行调整,但是这种调整非常脆弱,内存占用增长极大(GB 级),超时时间过短让 Conntrack 的益处(降低 CPU 和数据包延迟)也大为减少。

因此他们转向了 Calico,Calico 的网络策略允许指定部分流量绕过 Conntrack。这一措施让他们得到了期待的性能,并且还得到了 Calico 带来的安全优势。

绕开 Conntrack 的妥协之处

  • Do-not-track 策略通常是对称的。上面谈到的 SaaS 供应商案例,他们的工作负载是内部的,因此他们可以非常严格的在工作负载和 Memcached 之间进行白名单设置。

  • Do-not-track 策略是不知道连接的方向的。所以只要 Memcached 服务器知道 Memcached 客户端的源端口,他都可以尝试连接。但是如果为 Memcached 客户端定义了正确的策略,那么还可以在客户端拒绝这些连接。

  • Do-not-track 对每个数据包生效,而通常的网络策略只对数据流中的第一个数据包生效。这样会提高 CPU 的消耗。但是在短连接环境下,网络策略造成的消耗还是低于 Conntrack 过程的消耗的。例如 SaaS 供应商的例子中,每连接中的数据包都很少,所以使用策略处理每个数据包的过程中造成的多余开销也就可以接受了。

测试一下

我们测试了单一 Memcached 服务器 Pod 以及运行在远程节点上的多个客户端的场景,这种场景能方便的产生大量链接。Memcached Pod 所在的节点有 8 个 CPU 核心,Conntrack 表容量为 512k(主机的标准设置)。我们在几种方案中进行了比较:没有网络策略;Calico 通用网络策略;Calico Do-not-track 策略。

第一个测试中,我们限制每秒 4000 个连接,以此来方便的观察 CPU 方面的差异。无策略和正常策略的测试用例,其结果没有差异,而 Do-not-track 策略降低了 20%。

第二个测试中,我们尽量的提高连接数量,这样就可以观察到 Memcached 能够处理的每秒最大连接数量了。如前所述,无策略和普通策略的情况里,受到 Conntrack 数据表容量的影响,只能达到每秒 4000 多连接的能力(512k / 120s = 4,369 connections/s)。而 Do-not-track 策略下,连接数达到了 60k 每秒,没有出现问题。我们相信,可以通过更多的客户端来产生更高的负载数量,但是这一数字已经证实了我们提到的观点了。

结论

Conntrack 是一个重要的内核功能。大多数场景下,它都能发挥很好的作用。然而有些小众场景中,Conntrack 的开销会大于其收益。在这种情况下,Calico 的网络策略可以通过选择性的绕过 Conntrack,并提高网络安全性。而对其他流量,Conntrack 还是你的好朋友。

More from this blog

龙虾恐慌:AIOps 又要改名了?

ChatGPT 开始,把 AI 拉近到普罗大众的面前,让无数人感受到 AI 的亲民魅力。而龙虾,则把大模型驱动的自动化能力,突然间变得水灵灵、活泼泼地走进千家万户。它不只是“风口上的猪”,而是风口本身。热度高到让 Mac mini 一度断货,不知道这在不在库克的预料之内。 每代人都有每代人的鸡蛋,春节期间,我就领了我的鸡蛋。翻出古老的 MacBook Air M1,充值各种大模型。当然了,这个工具

Mar 9, 20261 min read

再见 2025

我猜不少人以为这个号废了吧?并没有,只是今年变化有点大,一直有种抄起键盘,无从说起的感觉,所以一直偷懒到今天,2025 的最后一天。 今年是我的第四个本命年,去年末一期播客里,大内说本命年不是灾年,是变化年,有危也有机。可是讲真啊,只看到危,没看到机。 各种因缘际会,从鹅厂跳槽到前东家,已经接近四年,第一个合同期已经进入尾声。除了前两年还在云原生领域嗷嗷叫,后两年基本都是些鸡零狗碎的东西了,用老东家的术语说是——偏离主航道,可谓是前景暗淡了。 一旦确定要滚蛋,反倒心思轻松起来,每天骑着我的小红车...

Jan 5, 20261 min read

辅助编程?dora 说:我知道你很急可是请你别急

从 OpenGPT 把大模型的火烧旺了之后,这三年来,相信很多组织或摩拳擦掌、或躬身入局,希望借助聪明能干的大模型,或想偿还技术宅,或想降本增效,或想弯道超车。一时间,沉寂许久的 AIxx 又活过来了,LLM Ops、Vibe Coding、中医大模型、GPT 算命等等,全都老树发新芽,焕发了勃勃生机。那么视角拉回从业者最关注的饭碗相关的领域之一——AI 辅助开发,产生了什么触动,应该如何拥抱呢? DORA 的年度报告中给出了很有意思的结论——强者恒强。 执行摘要部分总结了几个有趣的点: 问题...

Oct 6, 20251 min read

[译]dora:ai 辅助软件开发状态报告

执行摘要 在 2025 年,科技领导者面临的核心问题已不再是“是否要采用 AI”,而是“如何实现其价值”。 DORA 的研究基于超过 100 小时的定性访谈和来自全球近 5,000 名技术专业人士的问卷调查。研究揭示了一个关键事实:AI 在软件开发中的主要角色是“放大器”。它会放大高效能组织的优势,也会凸显组织的缺陷。 关键结论:AI 是放大器 AI 投资的最大回报并非来自工具本身,而是来自组织底层系统的战略性建设: 高质量的内部平台 清晰的工作流 团队的协同能力 缺少这些基础,AI ...

Oct 2, 202514 min read

僭越了,有人在用 Rust 写 Kubernetes

一个新语言问世,最爱做的事情之一,就是重写存量软件了。 云原生喝酒 SIG 重点扶持项目——rk8s(https://github.com/rk8s-dev/rk8s) 也可以归在这个范畴里,只不过这个项目重写的东西比较大,是 Kubernetes。 从 2025 年 1 月第一个 Commit 开始,到现在有了 200 多次 Commit,十几万行代码。当然距离 Kubernetes 的几百万行代码还差得远——老马就是喜欢整这种大无畏项目。 另外该项目也是国内第一个脱离 Cargo 转向使用 ...

Sep 27, 20253 min read

【伪】架构师

342 posts