0

0

Linux tc qdisc fq / fq_codel / cake 的公平队列算法在多租户环境中的适用性

舞夢輝影

舞夢輝影

发布时间:2026-02-25 18:57:27

|

352人浏览过

|

来源于php中文网

原创

fq 和 fq_codel 在多租户带宽隔离中经常失效,因其设计目标是抗 bufferbloat 和提升单主机多连接公平性,而非租户级硬限;它们统一哈希所有流、无 per-tenant 速率控制、无法绑定 cgroup 或 namespace,且 drop 策略对短连接租户不公。

linux tc qdisc fq / fq_codel / cake 的公平队列算法在多租户环境中的适用性

fq 和 fq_codel 在多租户带宽隔离中为什么经常“失效”

它们不是为严格租户隔离设计的——fqfq_codel 的核心目标是抗 bufferbloat 和提升单主机上多连接的公平性,而非跨用户/租户的带宽硬限。当多个租户共享同一台宿主机、且流量都经由同一个 qdisc 实例出向时,它们会把所有流(不管属于哪个 uid、cgroup 或 namespace)统一哈希进几百个队列,再按流粒度轮询调度。这意味着:

  • 一个租户发起 100 个 TCP 流,另一个只发 2 个,前者天然拿到约 50 倍的调度机会
  • 没有 per-tenant 的 rate limit 或 weight 配置入口,无法绑定 cgroup v2 或 net_cls classid
  • 如果租户间存在长连接 + 短突发混合场景,fq_codel 的 drop 策略可能优先惩罚短连接租户(因其 queue 建立晚、CE 标记滞后)

cake 能否直接用于租户级限速

不能直接替代 tc htb + filter 组合,但比 fq/fq_codel 更接近可用:它内置了 natdiffserv4 模式,能基于五元组 + DSCP 分类,并支持 per-flow 速率平滑。不过关键限制在于:

  • cakebandwidth 参数是全局总带宽上限,不支持 per-class 或 per-filter 的子速率配置
  • 它识别 NAT 后的客户端 IP(需开启 nat),但无法感知容器 network namespace 或 pod UID —— 仍需配合 tc filter + flowid 把不同租户流量打上不同 classid
  • 在高并发小包场景(如微服务 mesh),cake 的内部分类开销比 htb 高约 15%~20%,实测 p99 延迟抖动更明显

真正可行的多租户带宽控制组合方案

必须分层:用 htb 做租户级硬限,用 fq_codelcake 做租户内流控。典型链路是:root qdisc = htb → 每个租户对应一个 htb class → 在每个 class 下挂 fq_codel(或 cake)作为 leaf qdisc。

医真AI+开放平台
医真AI+开放平台

医真AI+ 医学AI开放平台

下载
  • 租户标识靠 tc filter + match ip src / ip dstcgroup(需内核 ≥ 5.10 + CONFIG_NET_CLS_CGROUP=y)
  • 避免在 root 上直接挂 fq_codel:它不响应 htb 的 borrow/ceil 机制,会导致租户超发后无法被有效压制
  • 若用 cake 作 leaf,务必关闭其 nat 模式(设 nat off),否则与上层 filter 的匹配逻辑冲突

容易被忽略的内核和命名空间兼容问题

很多线上环境跑着旧内核或容器运行时,导致看似配置正确却无效果:

  • fq_codelquantum 默认值(300)在 10G+ 网卡上易引发小包吞吐瓶颈,建议设为 1500;而 cakertt 默认 100ms,在容器内网(通常 rtt 1ms,否则 delay-based drop 完全不触发
  • 使用 cgroup v2 限速时,tc filter 必须搭配 match u32 + classid,且 cgroup path 必须挂载到 /sys/fs/cgroup/net_cls(非 unified)—— systemd 默认不启用该子系统
  • Pod 级限速(如 Kubernetes)必须通过 CNI 插件注入 tc 规则,不能只在宿主机 root qdisc 上配置:容器网络栈独立于 host netns,host 上的 qdisc 对 pod 出向流量无效

真正卡住多租户限速的,从来不是算法选型,而是流量如何精准归类到租户维度。没做 tc filter 分流前,任何 fancy qdisc 都只是在对混合流“公平地乱发”。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

423

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

596

2023.08.10

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

707

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

22

2025.12.06

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

474

2023.08.14

Golang云原生微服务Kubernetes_Golang怎么集成Kubernetes开发云原生服务
Golang云原生微服务Kubernetes_Golang怎么集成Kubernetes开发云原生服务

Golang云原生微服务Kubernetes (K8s) 是指 使用 Go 语言(Golang)编写的云原生微服务,并利用 Kubernetes 平台进行容器化部署、自动化管理、弹性伸缩和高效编排的一整套现代应用架构方案。

27

2025.12.22

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1541

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

715

2023.06.29

batoto漫画官网入口与网页版访问指南
batoto漫画官网入口与网页版访问指南

本专题系统整理batoto漫画官方网站最新可用入口,涵盖最新官网地址、网页版登录页面及防走失访问方式说明,帮助用户快速找到batoto漫画官方平台,稳定在线阅读各类漫画内容。

127

2026.02.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 9.7万人学习

Git 教程
Git 教程

共21课时 | 3.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号