Linux实现CPU物理隔离

背景

在 Linux 上实现 CPU 的物理隔离(也称为 CPU 隔离或 CPU pinning),可以通过将特定的任务或进程绑定到特定的 CPU 核心来实现。这可以提高系统性能,尤其是在需要实时响应的应用中。以下是几种实现方法。

使用 taskset 命令

taskset 命令可以将进程绑定到指定的 CPU 核心。

1.启动新进程并绑定到特定 CPU 核心:

taskset -c 0,1 <command>

例如,绑定到 CPU 0 和 1:

taskset -c 0,1 my_program

2.将已有进程绑定到特定 CPU 核心:
获取进程的 PID:

ps -ef | grep my_program

然后使用 taskset 绑定:

taskset -cp 0,1 <PID>

使用 cgroups

cgroups(控制组)可以更灵活地管理系统资源,包括 CPU 核心的分配。

1.创建 cgroup 并设置 CPU 核心限制:

sudo cgcreate -g cpuset:/mygroup
sudo cgset -r cpuset.cpus="0-1" mygroup
sudo cgset -r cpuset.mems="0" mygroup

2.将进程加入 cgroup:启动新进程

sudo cgexec -g cpuset:mygroup my_program

3.将已有进程加入 cgroup:
获取进程的 PID:

ps -ef | grep my_program

然后将 PID 写入 cgroup 的 tasks 文件:

sudo sh -c 'echo <PID> >

案例

linxu是8核16线程,指定特定python脚本运行特定CPU,实现CPU的物理隔离.

使用 taskset 绑定 Python 脚本到特定 CPU 核
确定要绑定的 CPU 核:例如,如果你想将脚本绑定到第0和第1个CPU核,可以使用CPU编号0和1。

使用 taskset 运行 Python 脚本:假设你的Python脚本是script.py,可以使用以下命令将其绑定到CPU核0和1:

taskset -c 0,1 python3 script.py

这将会确保script.py只在CPU核0和1上运行。

如果你想更精细地控制绑定到特定的超线程,可以使用类似的方法。例如,假设你想将脚本绑定到超线程0、1、2和3,可以使用以下命令:

taskset -c 0,1,2,3 python3 script.py

检查绑定情况
可以使用htop或top命令来查看进程的CPU使用情况,并确认进程确实绑定到了指定的CPU核。

假设有8个脚本,脚本以process_split_{}.py命名,linux有16个CPU,每个脚本按照顺序绑定2个CPU,实现物理隔离,这样每个脚本只使用2个CPU同时运行任务,互相隔离。

创建Shell脚本:
新建一个名为run_scripts.sh的Shell脚本,内容如下:

bash
复制代码
#!/bin/bash

# 绑定CPU核并运行脚本
taskset -c 0,1 python3 process_split_0.py &
taskset -c 2,3 python3 process_split_1.py &
taskset -c 4,5 python3 process_split_2.py &
taskset -c 6,7 python3 process_split_3.py &
taskset -c 8,9 python3 process_split_4.py &
taskset -c 10,11 python3 process_split_5.py &
taskset -c 12,13 python3 process_split_6.py &
taskset -c 14,15 python3 process_split_7.py &

赋予Shell脚本执行权限:
在终端中运行以下命令,赋予Shell脚本执行权限:

chmod +x run_scripts.sh

运行Shell脚本:
现在可以运行这个Shell脚本,它将按照顺序启动所有Python脚本并绑定到指定的CPU核上:

./run_scripts.sh

python代码

import subprocess

# 定义脚本名称和绑定的CPU核对
scripts_and_cpus = [
    ("process_split_0.py", "0,1"),
    ("process_split_1.py", "2,3"),
    ("process_split_2.py", "4,5"),
    ("process_split_3.py", "6,7"),
    ("process_split_4.py", "8,9"),
    ("process_split_5.py", "10,11"),
    ("process_split_6.py", "12,13"),
    ("process_split_7.py", "14,15"),
]

# 启动每个脚本并绑定到指定的CPU核
for script, cpus in scripts_and_cpus:
    command = ["taskset", "-c", cpus, "python3", script]
    subprocess.Popen(command)

print("所有脚本已启动并绑定到指定的CPU核。")

当然使用cgroups 也可以实现对内存进行隔离。

相关推荐

  1. Linux实现CPU物理隔离

    2024-07-10 20:50:02       10 阅读
  2. docker内的资源隔离linux实现

    2024-07-10 20:50:02       36 阅读
  3. linux -- per-CPU变量

    2024-07-10 20:50:02       42 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 20:50:02       5 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 20:50:02       5 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 20:50:02       4 阅读
  4. Python语言-面向对象

    2024-07-10 20:50:02       7 阅读

热门阅读

  1. Redis 中的跳表(Skip List)

    2024-07-10 20:50:02       10 阅读
  2. 路由器是什么?

    2024-07-10 20:50:02       10 阅读
  3. redis实现延时队列

    2024-07-10 20:50:02       10 阅读
  4. Shell选择结构

    2024-07-10 20:50:02       13 阅读
  5. Poincaré图和SD2计算参考

    2024-07-10 20:50:02       9 阅读
  6. C#控件总结

    2024-07-10 20:50:02       9 阅读
  7. STM32(一):安装环境

    2024-07-10 20:50:02       9 阅读
  8. 数据中台真的适合你的企业吗?

    2024-07-10 20:50:02       9 阅读
  9. [AIGC] ClickHouse的表引擎介绍

    2024-07-10 20:50:02       13 阅读
  10. go 函数

    2024-07-10 20:50:02       11 阅读
  11. 玩转springboot之springboot项目监测

    2024-07-10 20:50:02       10 阅读