tuna 是什么
tuna 是随 Red Hat 系工具链维护的调优命令行工具,用于查看并修改线程与中断(IRQ)的 CPU 亲和性、实时优先级等属性。它的原理是读写内核的线程亲和接口(sched_setaffinity、/proc/<pid>/status 的 Cpus_allowed_list)与中断亲和文件(/proc/irq/<n>/smp_affinity_list),因此改动立即生效但只作用于运行期。低延迟与 NUMA 场景常用它把工作线程、网卡队列中断钉在指定核心上,减少缓存失效与调度迁移。
基本信息
| 适用平台 | RHEL/CentOS/Fedora(tuna 包);Debian/Ubuntu 可 apt 安装 |
|---|---|
| 权限要求 | 修改亲和需 root(或 CAP_SYS_NICE) |
| 作用范围 | 当前内核全局;容器内受 cpuset 限制,宿主机视角更可靠 |
| 核心参数 | -t 线程、-q 中断号、-c CPU 列表、--move 执行移动 |
| 生效方式 | 运行时生效,重启或线程重建后失效 |
典型使用场景
- 低延迟/实时任务:把关键业务线程固定在独占核心上,避免被其他负载挤走
- 网络密集型服务:把各队列中断绑到专用核,配合关闭 irqbalance 稳定分布
- NUMA 优化:让进程与它访问的网卡中断落在同一节点,减少跨节点内存访问
- 容器环境核对:确认容器内进程的亲和掩码是否与宿主隔离策略一致
- 临时诊断:快速定位某条 kworker 或中断线程实际跑在哪个核上
常用操作
常用操作
tuna --show_threads | head -20 # 列出线程名、PID、亲和 CPU 与优先级
sudo tuna --show_irqs | grep -i eth # 查网卡各队列对应的 IRQ 号
sudo tuna -t 12345 -c 2-3 --move # 把 PID 12345 绑到 CPU2-3
sudo tuna -q 40 -c 2 --move --nohint # 把 IRQ 40 绑到 CPU2,--nohint 跳过交互提示
cat /proc/12345/status | grep Cpus_allowed_list # 移动后复核线程亲和掩码
tuna --show_irqs | head # 过一会儿复核中断亲和是否被 irqbalance 改回常用选项
| 选项 | 作用 | 注意 |
|---|---|---|
| --show_threads | 列出线程及其亲和 CPU、优先级 | 只读,不需要 root |
| -t/--threads | 指定线程(名称通配或 PID) | 名称通配会命中多个线程,先 dry-run 看清单 |
| -q/--irqs | 指定中断号或设备名 | 配合 --show_irqs 使用更直观 |
| -c/--cpus | CPU 列表,如 2-3,5 | 必须落在该进程的 cpuset 允许范围内 |
| --move | 真正执行移动 | 不加则只显示计划 |
| --nohint | 跳过交互确认/提示 | 脚本化时必需 |
tuna 的改动不持久:重启、线程重建、网卡重新加载都会丢。要固化需借助 systemd 的 CPUAffinity=、irqbalance 的 --banirq/--hintpolicy,或发行版提供的 IRQ 亲和 udev/网络脚本。
绑定前先记录原亲和性(tuna --show_threads 与 /proc/irq/<n>/smp_affinity_list),出问题时能立刻还原;只绑线程不绑中断往往让抖动更明显,因为中断会继续落在业务核上。