linux taskset命令

简介: taskset命令用于设置或检索进程的CPU亲和性,可以将进程绑定到特定的CPU核心上运行。

命令语法

taskset [options] mask command [argument...]
taskset [options] -p [mask] pid

常用选项

选项 说明
-a, --all-tasks 操作所有任务(线程)
-p, --pid 操作已存在的PID
-c, --cpu-list 使用CPU编号列表而不是掩码
-V, --version 显示版本信息
-h, --help 显示帮助信息

CPU亲和性掩码格式

CPU亲和性可以使用两种格式指定:

  • 十六进制掩码: 如0x3表示CPU0和CPU1(二进制11)
  • CPU列表: 使用-c选项,如0,2,4-6

常用示例

1. 查看进程的CPU亲和性

# 查看PID为1234的进程的CPU亲和性
taskset -p 1234

# 输出示例:
pid 1234's current affinity mask: 3

输出3(二进制11)表示进程可以运行在CPU0和CPU1上。

2. 设置进程的CPU亲和性(掩码格式)

# 将PID为1234的进程绑定到CPU0上(掩码0x1)
taskset -p 0x1 1234

# 将PID为1234的进程绑定到CPU0和CPU2上(掩码0x5,二进制101)
taskset -p 0x5 1234

3. 设置进程的CPU亲和性(列表格式)

# 使用-c选项和CPU列表格式
taskset -cp 0,2 1234

# 绑定到CPU1到CPU3
taskset -cp 1-3 1234

# 绑定到CPU0, CPU2, CPU4
taskset -cp 0,2,4 1234

4. 启动时绑定进程到指定CPU

# 启动vim并绑定到CPU0
taskset 0x1 vim file.txt

# 启动nginx并绑定到CPU1和CPU2(使用列表格式)
taskset -c 1,2 /usr/sbin/nginx

5. 查看CPU核心数量

# 查看系统CPU信息
lscpu

# 或查看/proc/cpuinfo
grep -c processor /proc/cpuinfo

6. 绑定进程到所有CPU核心

# 假设系统有4个CPU核心
# 掩码0xF(二进制1111)表示所有4个核心
taskset -p 0xF 1234

# 或使用列表格式
taskset -cp 0-3 1234

实际应用场景

场景1:高性能计算应用绑定

# 将科学计算程序绑定到特定的CPU核心,避免上下文切换开销
taskset -c 2,3,6,7 ./scientific_app

场景2:数据库服务优化

# 将MySQL服务绑定到特定的CPU核心
taskset -cp 2-5 $(pgrep mysqld)

# 或启动时绑定
taskset -c 2-5 /usr/sbin/mysqld

场景3:实时进程绑定

# 将实时音频处理进程绑定到独立的CPU核心
taskset -c 3 nice -n -20 arecord -f cd -t raw | sox -t raw -r 44100 -s -w -c 2 - -t wav - | lame - audio.mp3

注意事项

  • CPU编号从0开始计数
  • 使用taskset需要root权限或具有CAP_SYS_NICE能力
  • 绑定进程到特定CPU可以提高缓存命中率,但过度绑定可能导致负载不均衡
  • 在NUMA架构系统中,还需要考虑内存访问的局部性
  • 子进程会继承父进程的CPU亲和性设置

相关命令

  • nice/renice - 调整进程优先级
  • chrt - 设置或检索进程的实时属性
  • numactl - 控制NUMA内存策略
  • lscpu - 显示CPU架构信息