Linux taskset指令设置或查看进程的 CPU 亲和性

taskset 是 Linux 系统中的一个命令行工具,用于设置或查看进程的 CPU 亲和性(CPU affinity),即控制进程可以在哪些 CPU 核心上运行。通过将进程绑定到特定的 CPU 核心,可以减少因进程在核心间切换(上下文切换)带来的开销,从而优化性能,尤其适用于计算密集型任务或关键服务(如数据库、Web服务器)。

核心功能与工作原理

CPU 亲和性通过一个位掩码(bitmask) 或 CPU 列表 来指定。掩码的每一位对应一个逻辑 CPU,最低位对应 CPU0。例如,掩码 0x00000001 表示仅绑定到 CPU0,而 0x00000003(二进制 0011)表示绑定到 CPU0 和 CPU1。现代版本也支持使用 -c 参数直接指定 CPU 编号列表(如 0,2,5-11)。

基本命令语法

复制代码
taskset [options] mask command [arg]...   # 启动新进程并绑定
taskset [options] -p [mask] pid           # 操作已运行进程

常用选项:

  • -p, --pid:操作指定 PID 的现有进程。
  • -c, --cpu-list:以列表格式(如 0,1,3-5)指定 CPU,替代掩码。
  • -a, --all-tasks:对指定 PID 的所有线程生效。
  • -h, --help / -V, --version:显示帮助或版本信息。

典型使用示例

  1. 查看进程当前的 CPU 亲和性

    复制代码
    taskset -p <PID>

    输出显示十六进制掩码,如 pid 1234's current affinity mask: f 表示可在所有 CPU 上运行。

  2. 将已运行进程绑定到特定 CPU

    复制代码
    taskset -p <mask> <PID>          # 使用掩码
    taskset -pc <cpu-list> <PID>     # 使用 CPU 列表

    例如,将 PID 为 1234 的进程绑定到 CPU0 和 CPU1:

    复制代码
    taskset -p 0x03 1234
    # 或
    taskset -pc 0,1 1234
  3. 启动新进程时直接绑定

    复制代码
    taskset <mask> <command>
    taskset -c <cpu-list> <command>

    例如,启动 vim 并绑定到 CPU0:

    复制代码
    taskset -c 0 vim
  4. 绑定到多个 CPU 或范围

    复制代码
    taskset -c 0,2,4-6 ./myprogram   # 绑定到 CPU0,2,4,5,6
    taskset -c 0-7:2 ./myprogram     # 绑定到 CPU0,2,4,6(步长为2)

高级应用与注意事项

  • 与 isolcpus 内核参数结合 :可通过 GRUB 配置(如 isolcpus=2)隔离特定 CPU 核心,使其不被系统自动调度,然后使用 taskset 将关键进程(如 PostgreSQL)绑定到隔离核心,实现更极致的性能隔离。
  • 权限要求 :设置进程的 CPU 亲和性需要 CAP_SYS_NICE 权限,通常需要 sudo。
  • 性能考量:虽然绑定可以减少上下文切换,但过度绑定可能导致 CPU 负载不均,某些核心过载而其他空闲。因此需结合整体系统负载进行规划。
  • 工具安装 :taskset 通常包含在 util-linux-ng 软件包中,主流 Linux 发行版(如 Ubuntu、CentOS)默认已安装。

实际案例

在一个高流量电商服务器中,将 MySQL 进程绑定到 CPU0-1,Apache 进程绑定到 CPU2-3,可以减少进程间 CPU 切换,显著降低 Web 响应时间。

总之,taskset 是一个强大的性能调优工具,通过合理设置 CPU 亲和性,可以提升关键应用的响应速度和系统整体效率。

相关推荐
缓慢更新25 分钟前
AI 辅助生成单测:从接口定义到用例的流水线
java·服务器·前端·网络·数据库·人工智能
叼烟扛炮1 小时前
Linux 学习笔记(四十一):TCP 并发演进——从单进程到多线程服务器
linux·运维·服务器·网络·笔记·学习·tcp/ip
ynchyong1 小时前
Linux 有两个 “版本“
linux·发行版·内核版本
叼烟扛炮1 小时前
Linux 学习笔记(四十四):HTTP 协议解析与极简 Web 服务器实战
linux·服务器·学习
叼烟扛炮1 小时前
Linux 学习笔记(四十三):网络编程进阶——自定义协议解决 TCP 粘包与守护进程
linux·开发语言·网络·笔记·tcp/ip
Escalating_xu2 小时前
【Linux 网络编程】DNS 与 ICMP:从域名解析到 ping、traceroute,把“网络通不通”问清楚
linux·网络·php
开开心心就好3 小时前
音频降噪剪辑工具,音量裁剪一键处理
运维·服务器·前端·spring·ocr·音视频·1024程序员节
一枕槐安4874 小时前
大模型限流、重试、超时处理:API 调用健壮性方案
linux·服务器·php·大模型api·指数退避·限流控制·超时预算
黑十4 小时前
PyTorch 报 “no CUDA GPUs are available“ 怎么办?3 步排查
服务器·网络·人工智能·pytorch·python
西索斯coding4 小时前
gpt-image-2.5-sunburst 和 gemini-3.1-flash-image 差多少?60 组项目素材的成功成本评测框架
java·linux·gpt·ai