目录

常见的CPU调试工具

概述

taskset 是一个 Linux 命令行工具,用于设置或获取进程的 CPU 亲和性(CPU affinity)。CPU 亲和性决定了进程可以运行在哪些 CPU 核心上,这对于性能优化和资源管理非常有用。通过控制进程的 CPU 亲和性,可以提高缓存命中率、减少上下文切换的开销,并且在多核系统中更好地管理资源。

基本用法

设置进程的CPU亲和性

使用 taskset 启动一个新进程,并指定其可以运行的 CPU 核心。例如,要将一个新进程限制在 CPU 0 和 CPU 1 上运行,可以使用如下命令:

1
taskset -c 0,1 command

例如,限制 stress 工具在 CPU 0 和 1 上运行:

1
taskset -c 0,1 stress-ng --cpu 2 --timeout 60

获取已有进程的CPU亲和性

可以使用 -p 选项获取已有进程的 CPU 亲和性。例如,假设进程 ID(PID)为 1234:

1
taskset -p 1234

输出可能类似于:

1
pid 1234's current affinity mask: 3

这里的 3 是一个二进制掩码,表示进程可以在 CPU 0 和 1 上运行(因为二进制的 311)。

设置已有进程的CPU亲和性

可以使用 -p 选项设置已有进程的 CPU 亲和性。例如,将 PID 为 1234 的进程限制在 CPU 2 上运行:

1
taskset -p -c 2 1234

CPU 亲和性掩码

CPU 亲和性掩码是一个十六进制或二进制值,用于表示进程可以运行的 CPU 核心。例如:

  • 0x1 表示 CPU 0
  • 0x2 表示 CPU 1
  • 0x3 表示 CPU 0 和 CPU 1(因为二进制的 113

可以使用 -c 选项通过指定核心编号的方式来简化设置。例如:

1
taskset -c 0,1 my_command

相当于:

1
taskset 0x3 my_command

结合taskset和cgroup v2

以下是一个示例,展示如何结合 tasksetcgroup v2 来限制 stress 进程的资源,并指定其运行在特定的 CPU 核心上。

创建cgroup

1
sudo mkdir /sys/fs/cgroup/my_cgroup

启动stress进程并指定CPU核心

1
2
taskset -c 0,1 stress --cpu 2 --timeout 60 &
STRESS_PID=$!

将进程添加到cgroup

1
echo $STRESS_PID | sudo tee /sys/fs/cgroup/my_cgroup/cgroup.procs

限制CPU和内存使用

1
2
echo "50000 100000" | sudo tee /sys/fs/cgroup/my_cgroup/cpu.max
echo "100M" | sudo tee /sys/fs/cgroup/my_cgroup/memory.max

验证和监控资源使用

1
2
3
4
5
6
7
sleep 10  # 等待几秒钟,让限制生效

echo "CPU usage:"
cat /sys/fs/cgroup/my_cgroup/cpu.stat

echo "Memory usage:"
cat /sys/fs/cgroup/my_cgroup/memory.current

验证CPU亲和性

1
taskset -p $STRESS_PID

清理

1
2
sudo rmdir /sys/fs/cgroup/my_cgroup
pkill stress

Docker镜像

另外 Docker 镜像也是用于测试的好方法。

1
docker run --rm polinux/stress stress --cpu 2 --timeout 60s

总结

taskset 是一个强大的工具,用于控制进程的 CPU 亲和性。在结合 cgroup v2 时,可以进一步限制进程的资源使用,从而实现更精细的资源管理和性能优化。

注意
本文最后更新于 2024年7月29日,文中内容可能已过时,请谨慎参考。