当前位置: 首页 > news >正文

Linux实现CPU物理隔离

文章目录

  • 背景
  • 使用 taskset 命令
  • 使用 cgroups
  • 案例

背景

在 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 也可以实现对内存进行隔离。

http://www.lryc.cn/news/396734.html

相关文章:

  • springer latex模板参考文献不显示
  • 使用Vue3、Pinia和Vite5打造高度还原的抖音仿制项目
  • stm32基本定时器
  • 网络安全基础-1
  • SSH远程访问及控制
  • Qt 绘图详解
  • Python 爬虫与 Java 爬虫:相似之处、不同之处和选项
  • 视频监控汇聚平台LntonCVS视频监控系统解决智慧产业园的安全应用方案
  • MAVLink代码生成-C#
  • 二四、3d人脸构建
  • 鸿蒙开发:Universal Keystore Kit(密钥管理服务)【加解密(C/C++)】
  • Python的入门知识(上)
  • 2024春秋杯网络安全联赛夏季赛-PWN
  • 怎么提高音频声音大小?提高音频声音大小的四种方法
  • 从数据仓库到数据湖(下):热门的数据湖开源框架
  • 对话AI原生 | 千帆AppBuilder重构企业AI原生应用开发体验
  • CF253C Text Editor 题解
  • Spring Boot 创建定时任务
  • Vue使用Echarts(入门级)
  • 2025届秋招提前批信息汇总(计算机类)
  • Scala Collection(集合)
  • Go 语言 UUID 库 google/uuid 源码解析:UUID version4 的实现
  • 开发个人Go-ChatGPT--6 OpenUI
  • Spring中的工厂模式详解及应用示例
  • Electron 简单搭建项目
  • 旗晟智能巡检机器人:开启工业运维的智能化新篇章
  • vue3的常用 Composition API有哪些?
  • 深度优先算法-DFS(算法篇)
  • C++模块化之内部类
  • k8s-第九节-命名空间