杰瑞科技汇

CPUcores如何使用?快速上手指南

什么是 cpucores 以及它的用途?

cpucores 的核心功能是 将指定的进程“钉”到特定的 CPU 核心上运行

想象一下,你有一台有 8 个核心的 CPU。cpucores 可以让你告诉某个程序:“嘿,你只能使用第 1、3、5 个核心,不能碰其他的”。

主要用途:

  1. 性能优化与隔离

    • 关键应用:对于一个需要高性能、低延迟的数据库服务(如 MySQL, PostgreSQL),你可以将它绑定到专用的 CPU 核心上,避免被其他无关进程(如编译代码、下载文件)抢占 CPU 资源,从而保证其稳定运行。
    • 实时应用:对于音视频处理、游戏服务器等对时间敏感的应用,绑定核心可以减少上下文切换带来的延迟。
  2. 资源管理与限制

    • 限制资源消耗:对于一个 CPU 密集型的后台任务(如视频转码、科学计算),你可能不希望它 100% 占用所有核心,导致系统卡顿,你可以将它限制在 2-3 个核心上,为其他应用留出足够的资源。
    • 多实例部署:当你在一台服务器上运行多个相同的服务实例时,可以将它们分别绑定到不同的 CPU 核心组上,以实现负载均衡和资源隔离。
  3. 测试与调试

    • 压力测试:你可以测试某个应用在单核、双核或多核环境下的性能表现。
    • 排查问题:如果怀疑某个应用存在多线程竞争问题,可以尝试将其绑定到单个核心上,观察问题是否消失。

安装 cpucores

cpucores 通常不是 Linux 发行版的默认软件包,但安装非常简单,它通常被包含在 util-linux 包中或者作为一个独立的工具。

在 Debian / Ubuntu / Mint 系统上:

# 使用 apt 安装
sudo apt update
sudo apt install util-linux

cpucores 命令通常包含在 util-linux 包中。

在 CentOS / RHEL / Fedora 系统上:

# 使用 yum 安装
sudo yum install util-linux
# 或者使用 dnf (在较新的系统上)
sudo dnf install util-linux

在 Arch Linux 系统上:

# 使用 pacman 安装
sudo pacman -S util-linux

安装完成后,你可以通过以下命令检查是否安装成功:

which cpucores
# 应该会输出 /usr/bin/cpucores
cpucores --version
# 或者
cpucores -V

核心概念:CPU 核心编号

在使用 cpucores 之前,你必须理解 Linux 如何编号 CPU 核心。

  • 逻辑核心:这是最常见的编号方式,一个物理 CPU 核心如果支持超线程技术,会被操作系统识别为两个逻辑核心,在一个 8 核 16 线程的 CPU 上,逻辑核心编号就是 015
  • 物理核心:这是指 CPU 实际上的物理芯片数量,在上面那个例子中,物理核心是 8 个。

查看你的 CPU 核心信息:

使用 lscpu 命令可以清晰地看到你的 CPU 配置。

lscpu

输出示例:

Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              16          # <--- 总的逻辑核心数
On-line CPU(s) list: 0-15         # <--- 在线核心的编号范围
Thread(s) per core:  2            # <--- 每个物理核心的线程数(超线程)
Core(s) per socket:  8            # <--- 每个插槽的物理核心数
Socket(s):           1            # <--- CPU 插槽数
NUMA node(s):        1
...

从上面的输出可以看出,这是一个 8 核心 16 线程的 CPU,逻辑核心编号为 015


cpucores 基本用法

cpucores 的基本语法是:

cpucores [选项] <核心列表> <命令> [命令参数...]
  • 核心列表:这是最重要的部分,你可以指定一个或多个核心编号。
    • 单个核心1
    • 多个连续核心0-3 (表示核心 0, 1, 2, 3)
    • 多个不连续核心0,2,4,6
    • 组合使用0-3,7,10-12
  • 命令:你想要在指定核心上运行的程序或脚本。
  • [命令参数...]:传递给该命令的任何参数。

实战示例

假设你的系统有 8 个逻辑核心(编号 0-7)。

示例 1:在单个核心上运行一个命令

我们想让 stress-ng 这个压力测试工具只在核心 2 上运行,并让它产生 80% 的负载。

# 首先安装 stress-ng
sudo apt install stress-ng
# 在核心 2 上运行 stress-ng
cpucores 2 stress-ng --cpu 1 --timeout 10s --metrics-brief

解释

  • cpucores 2:告诉 cpucores,接下来的命令只能在核心 2 上执行。
  • stress-ng --cpu 1stress-ng 使用 1 个 CPU worker 来产生负载。
  • --timeout 10s:运行 10 秒后自动停止。
  • --metrics-brief:显示简短的性能指标。

如何验证? 打开另一个终端,使用 tophtop 命令,按 1 键可以显示每个核心的独立使用率,你会看到只有核心 2 的使用率很高,而其他核心基本是空闲的。

示例 2:在多个核心上运行一个服务

假设我们有一个名为 my_app_server 的程序,我们希望它只能在核心 3, 4, 5 上运行。

# 假设 my_app_server 在当前目录下
cpucores 3-5 ./my_app_server --config config.conf

这个命令会启动 my_app_server,并确保它的所有线程都被限制在核心 3、4、5 上。

示例 3:为现有进程设置 CPU 核心(高级用法)

cpucores 主要设计用于启动新进程并立即绑定,你可以结合 taskset 命令(通常与 cpucores 同在一个包中)来修改一个正在运行的进程。

步骤:

  1. 找到目标进程的 PID (Process ID)。
  2. 使用 taskset 将该进程移动到指定的核心上。

示例

  1. 启动一个后台进程,并记录它的 PID。

    stress-ng --cpu 4 --timeout 60s &
    # 记录下输出的 PID,[1] 12345
  2. 假设 PID 是 12345,我们想把它从所有核心移动到核心 67

    # 首先查看进程当前运行在哪些核心上
    taskset -p 12345
    # 输出可能是: pid 12345's current affinity list: 0-7
    # 修改进程的 CPU 亲和性
    sudo taskset -cp 6,7 12345
    # -c: 表示设置 CPU 亲和性
    # -p: 表示针对进程
    # 6,7: 目标核心
    # 12345: 进程ID
    # 再次查看,确认修改成功
    taskset -p 12345
    # 输出应为: pid 12345's current affinity list: 6,7

重要注意事项和最佳实践

  1. 不要绑定 0 号核心(除非必要): 在许多系统中,核心 0 通常被操作系统保留用于处理中断和系统任务,负载相对较高,将关键应用绑定到 0 号核心可能会适得其反,建议从核心 1 开始选择。

  2. 了解 NUMA 架构: 在现代多路服务器上,CPU 和内存被组织成 NUMA (Non-Uniform Memory Access) 节点,如果你在 NUMA 系统上工作,最好将进程绑定到同一个 NUMA 节点内的核心上,以避免昂贵的跨节点内存访问延迟,可以使用 numactl 工具进行更精细的控制。

  3. 谨慎使用 sudo: 如果你要绑定一个需要 root 权限才能运行的程序,或者修改一个 root 用户的进程,cpucorestaskset 也需要 sudo,但对于普通用户运行的程序,通常不需要 sudo

  4. 这不是 CPU 限制工具cpucores 只能限制进程能使用哪些核心,但不能直接限制这些核心上最多能使用多少百分比的 CPU 时间,如果你需要限制 CPU 使用率(限制进程最多只能用 50% 的 CPU),应该使用 cpulimit 这样的工具。

  5. 测试和监控: 在将关键服务投入生产环境前,务必在测试环境中充分验证绑定核心的效果,使用 top, htop, mpstat, perf 等工具来监控 CPU 使用情况和性能变化。

cpucores 是一个轻量但功能强大的工具,是 Linux 系统管理员和开发者在进行性能调优和资源管理时的得力助手,通过将进程与特定的 CPU 核心关联,你可以实现对系统资源的精细化控制,从而提升应用的性能和稳定性。

希望这份教程对你有帮助!

分享:
扫描分享到社交APP
上一篇
下一篇