如何屏蔽 cpu 不受 linux 调度程序的影响(防止它调度线程到该 cpu 上)?

2023-12-25

可以使用sched_setaffinity将线程固定到 CPU,提高性能(在某些情况下)

来自 Linux 手册页:

限制进程在单个 CPU 上运行还可以避免 缓存失效导致的性能成本 进程停止在一个 CPU 上执行,然后在另一个 CPU 上重新开始执行 不同的CPU

此外,如果我想要更实时的响应,我可以将该线程的调度程序策略更改为SCHED_FIFO,并将优先级提高到某个高值(最高sched_get_priority_max),这意味着相关线程在准备就绪时应始终抢占在其 cpu 上运行的任何其他线程。

然而,此时,实时线程刚刚抢占的CPU上运行的线程可能已经驱逐了实时线程的大部分一级缓存条目。

我的问题如下:

  1. 是否可以阻止调度程序将任何线程调度到给定的 cpu 上? (例如:要么对调度程序完全隐藏 cpu,要么采用其他方式)
  2. 是否有一些线程绝对必须能够在该 CPU 上运行? (例如:内核线程/中断线程)
  3. 如果我需要在该 cpu 上运行内核线程,那么合理的最大优先级值是多少,这样我就不会耗尽内核线程?

答案是使用cpusets http://www.kernel.org/doc/man-pages/online/pages/man7/cpuset.7.html. The python cpuset实用程序 http://code.google.com/p/cpuset/使配置它们变得容易。

基本概念

3个CPU组

  • root:存在于所有配置中并包含所有 cpu(未屏蔽的)
  • system:包含用于系统任务的CPU - 需要运行但不“重要”的CPU(未屏蔽的)
  • user:包含用于“重要”任务的CPU - 我们想要在“实时”模式下运行的任务(shielded)

The shield命令管理这 3 个 cpuset。

在设置过程中,它将所有可移动任务移至非屏蔽 cpuset 中(system)并且在拆卸期间它将所有可移动任务移至rootcpuset。 设置完成后,子命令可让您将任务移至shield (user) cpuset,此外,还可以将特殊任务(内核线程)从root to system(因此从user中央处理器组)。

命令:

首先我们创建一个盾牌。当然,防护罩的布局将取决于机器/任务。例如,假设我们有一台 4 核非 NUMA 机器:我们想要专用3 芯到屏蔽, 然后离开1 个核心用于执行不重要的任务;因为它是非 NUMA,所以我们不需要指定任何内存节点参数,并且我们让内核线程在rootcpuset(即:跨所有 cpu)

$ cset shield --cpu 1-3

一些内核线程(那些未绑定到特定 cpu 的线程)可以移至systemcpuset。 (一般来说,移动已绑定到特定 cpu 的内核线程并不是一个好主意)

$ cset shield --kthread on

现在让我们列出盾牌中正在运行的内容(user)或非屏蔽(system) CPU 组: (-v对于详细信息,它将列出进程名称)(添加第二个-v显示超过80个字符)

$ cset shield --shield -v
$ cset shield --unshield -v -v

如果我们想停止屏蔽(拆解)

$ cset shield --reset

现在让我们在屏蔽中执行一个进程(以下命令'--'被传递给要执行的命令,而不是cset)

$ cset shield --exec mycommand -- -arg1 -arg2

如果我们已经有一个正在运行的进程,我们想要将其移至屏蔽中(请注意,我们可以通过传递逗号分隔的列表或范围来移动多个进程(该范围内的任何进程都将被移动,即使存在间隙))

$ cset shield --shield --pid 1234
$ cset shield --shield --pid 1234,1236
$ cset shield --shield --pid 1234,1237,1238-1240

先进理念

cset set/proc- 这些可以让您更好地控制 cpusets

Set

创建、调整、重命名、移动和销毁CPU组

Commands

创建一个cpuset,使用cpus 1-3,使用NUMA节点1并将其命名为“my_cpuset1”

$ cset set --cpu=1-3 --mem=1 --set=my_cpuset1

将“my_cpuset1”更改为仅使用 cpus 1 和 3

$ cset set --cpu=1,3 --mem=1 --set=my_cpuset1

销毁一个cpuset

$ cset set --destroy --set=my_cpuset1

重命名现有 cpuset

$ cset set --set=my_cpuset1 --newname=your_cpuset1

创建分层 cpuset

$ cset set --cpu=3 --mem=1 --set=my_cpuset1/my_subset1

列出现有的 cpuset(级别 1 的深度)

$ cset set --list

列出现有的 cpuset 及其子项

$ cset set --list --set=my_cpuset1

列出所有现有的 cpuset

$ cset set --list --recurse

Proc

管理线程和进程

Commands

列出 cpuset 中运行的任务

$ cset proc --list --set=my_cpuset1 --verbose

在 cpuset 中执行任务

$ cset proc --set=my_cpuset1 --exec myApp -- --arg1 --arg2

移动任务

$ cset proc --toset=my_cpuset1 --move --pid 1234
$ cset proc --toset=my_cpuset1 --move --pid 1234,1236
$ cset proc --toset=my_cpuset1 --move --pid 1238-1340

移动任务及其所有同级任务

$ cset proc --move --toset=my_cpuset1 --pid 1234 --threads

将所有任务从一个 cpuset 移至另一 CPUset

$ cset proc --move --fromset=my_cpuset1 --toset=system

将未固定的内核线程移至 cpuset

$ cset proc --kthread --fromset=root --toset=system

强制将内核线程(包括那些固定到特定 cpu 的线程)移动到 cpuset 中(注意:这可能会给系统带来可怕的后果 - 确保您知道自己在做什么)

$ cset proc --kthread --fromset=root --toset=system --force

层次结构示例

我们可以使用分层 cpuset 来创建优先级分组

  1. 创建一个system具有 1 个 cpu 的 cpuset (0)
  2. 创建一个prio_low具有 1 个 cpu 的 cpuset (1)
  3. 创建一个prio_met具有 2 个 cpu 的 cpuset (1-2)
  4. 创建一个prio_high具有 3 个 cpu 的 cpuset (1-3)
  5. 创建一个prio_all具有所有 4 个 cpu (0-3) 的 cpuset(请注意,这与 root 相同;与 root 保持分离被认为是良好的做法)

为了实现上述目的,您创建 prio_all,然后在 prio_all 下创建子集 prio_high 等

$ cset set --cpu=0 --set=system
$ cset set --cpu=0-3 --set=prio_all
$ cset set --cpu=1-3 --set=/prio_all/prio_high
$ cset set --cpu=1-2 --set=/prio_all/prio_high/prio_med
$ cset set --cpu=1 --set=/prio_all/prio_high/prio_med/prio_low
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何屏蔽 cpu 不受 linux 调度程序的影响(防止它调度线程到该 cpu 上)? 的相关文章

  • 打印本周星期一的日期(在 bash 中)

    我想获取本周星期一的 YYYYMMdd 格式的日期 例如 今天是 20110627 从明天到周日 我仍然想打印周一 今天 的日期 然后下周重复这个过程 monday date dmonday Y m d last monday date d
  • Linux下单个目录下文件过多会怎样?

    如果一个目录中有大约 1 000 000 个单独的文件 大部分大小为 100k 其中没有其他目录和文件 是否会以任何其他可能的方式降低效率或产生缺点 ARG MAX 会对此提出异议 例如 rm rf 在目录中时 会说 参数太多 想要执行某种
  • 如何将命令输出作为多个参数传递给另一个命令

    我想将命令的每个输出作为多个参数传递给第二个命令 例如 grep pattern input returns file1 file2 file3 我想复制这些输出 例如 cp file1 file1 bac cp file2 file2 b
  • BeagleBone Black 如何用作大容量存储设备?

    是否可以使用 BB 作为大容量存储设备 我希望将其连接到可以从 USB 连接 例如 USB 闪存驱动器 读取文件的音频播放器并充当包含一个特定文件夹的数据存储设备 及其子文件夹 从文件系统 如果可能 在连接到开发板的闪存驱动器上 正如设备规
  • grep 彩色线条

    我编写了一个简单的 PHP shell 脚本 它解析文件并输出某些元素 它产生大量的输出 采用不同的 bash 颜色 绿色表示正常 黄色表示警告 红色表示错误等 在开发过程中我想过滤掉一些行 例如 所有包含红色文本的行 我可以使用grep
  • 浏览器如何异步执行Javascript并渲染

    这是jsfiddle上的代码
  • Linux 中的 Windows NAmed Pipes 替代品

    我们正在将现有的 Windows 代码移植到 Linux 我们使用 ACE 作为抽象层 我们使用 Windows 命名管道与多个客户端进行通信并执行重叠操作 linux 下这个相当于什么 我检查了linux命名管道 FIFO 但它们似乎只支
  • C++ OpenCV imdecode 慢

    我将图像的字节数组从 C 发送到 C 库 我使用 OpenCV 版本 3 3 1 解码图像 BMP 图像解码速度很快 但 JPEG 图像解码速度很慢 如何加快 JPEG 图像的解码时间 多线程 GPU 解码性能 Resolution For
  • 点击界面没有出现

    我决定添加一个点击界面并在我的代码中使用它 但我能够得到它的状态 sudo ip f link tuntap add tap10 mode tap sudo ip link set tap10 up 之后当我执行 ip link 时 tap
  • 在 Windows / Linux 中创建 Mac 包

    我自己努力制作一个 r 包 我按照 stackoverflow 中上一个问题的说明进行操作如何为外行开发软件包 http cran r project org bin windows Rtools 以下是我根据上一个问题采取的步骤 在新的
  • 如何在C程序中直接改变显存映射来绘制像素(无需库函数)

    是否可以通过使用 C 程序更改 RAM 中屏幕 视频即监视器 内存映射中的值来显示黑点 我不想使用任何库函数 因为我的主要目标是学习如何开发简单的操作系统 我尝试访问起始屏幕内存映射 即 0xA0000 在 C 中 我尝试运行该程序 但由于
  • 重新链接匿名(未链接但打开)文件

    在 Unix 中 可以创建匿名文件的句柄 例如 使用 creat 创建并打开它 然后使用 unlink 删除目录链接 留下一个带有 inode 和存储的文件 但没有可能的方法重新打开它 此类文件通常用作临时文件 通常这就是 tmpfile
  • 与简单的文件请求相比,您预计 Web 服务请求的响应时间开销是多少?

    我正在开发一个 asp net Web 服务应用程序 以向使用 jQuery ajax 发出请求的小部件提供 json 格式的数据 我一直在使用 FireBug Net 视图来检查数据请求需要多长时间 在我最初的原型中 我只是请求静态 js
  • 非规范化如何提高数据库性能?

    我听说过很多关于非规范化的内容 它是为了提高某些应用程序的性能而进行的 但我从来没有尝试过做任何相关的事情 所以 我只是好奇 规范化数据库中的哪些地方会使性能变差 或者换句话说 非规范化原则是什么 如果我需要提高性能 如何使用此技术 非规范
  • 如何在 PHP 数组中的另一个已知(通过键或指针)元素之后有效地插入元素?

    给定一个数组 a array abc 123 k1 gt v1 k2 gt v2 78 tt k3 gt v3 当其内部指针指向其元素之一时 如何在当前元素之后插入元素 如何在键已知元素 例如 k1 之后插入元素 表现护理 您可以通过使用拆
  • 设置 Vim 背景颜色

    当我尝试更改背景颜色时 vimrc或者直接在 Vim 中使用以下命令 set background dark 这根本不影响我的背景 也没有light选项 不过 当我运行 gvim 时 看起来还不错 有没有办法在不更改 Konsole 设置的
  • 使用 hcitool 扫描低功耗蓝牙?

    当我运行此命令时 BLE 设备扫描仅持续 5 秒 sudo timeout 5s hcitool i hci0 lescan 输出显示在终端屏幕中 但是 当我将输出重定向到文件以保存广告设备的地址时 每次运行该命令时 我都会发现该文件是空的
  • 在Linux中创建可执行文件

    我计划做的一件事是编写 非常简单的 Perl 脚本 并且我希望能够在不从终端显式调用 Perl 的情况下运行它们 我明白 要做到这一点 我需要授予他们执行权限 使用 chmod 执行此操作非常简单 但它似乎也是一个稍微费力的额外步骤 我想要
  • ARM 的内核 Oops 页面错误错误代码

    Oops 之后的错误代码给出了有关 ARM EX 中的恐慌的信息 Oops 17 1 PREEMPT SMP在这种情况下 17 给出了信息 在 x86 中它代表 bit 0 0 no page found 1 protection faul
  • 为什么这个函数在额外读取内存时运行速度如此之快?

    我目前正在尝试了解 x86 64 上某些循环的性能属性 特别是我的 Intel R Core TM i3 8145U CPU 2 10GHz 处理器 具体来说 在循环体内添加一条额外的指令来读取内存几乎可以使性能提高一倍 而细节并不是特别重

随机推荐

  • Base64:无效长度必须是四的倍数:颤振错误

    我获得了图像 Base64 编码的图像数据 但我获得的其中一张图像未上传 并给出了以下形式的错误 无效长度必须是四的倍数 另外 我的其他图像出现一会儿然后消失一会儿 他们来了又走 这个问题有解决办法吗 Widget image String
  • 在 ASP.NET MVC 中扩展 HiddenFor 模板

    我想Html HiddenFor可以使用类似的模板Html DisplayFor or Html EditorFor 不幸的是该方法不接受TemplateName和其他人一样 我知道 解决方法是使用具有 HiddenFors 的 Displ
  • iOS AirPlay:只有当镜像打开时,我的应用程序才会收到外部显示器的通知?

    我正在尝试在我的应用程序中启用 AirPlay 支持 我不做视频 我想将外部显示器用作 第二个显示器 我的问题是 如果我从 AirPlay 按钮中选择 AppleTV 我的应用程序不会收到通知 我的应用程序唯一收到通知的时间是当我离开应用程
  • Intent.ACTION_PICK 的行为不同

    我正在使用以下代码从图库中选择图像 当我用三星 Galaxy S4 测试它时 它直接进入图库 这正是我真正想要的 但是 当我在 LG Optimus II 设备上测试我的代码时 它显示一个对话框 提供选择图库或图片的选项 换句话说 它又增加
  • WIX 安装程序工具集 - SQL Server 和 IIS 快速安装 [已关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有带有一些自定义 UI 屏幕的 WIX 安装程序 其中有一个自定义 UI 屏幕 上面有两个单选按钮 我
  • 使唯一的键大小写不敏感

    这是我使用 mysql 5 时的 mysql 表模式 Table structure for table DATA USER ROLE DROP TABLE IF EXISTS DATA USER ROLE 40101 SET saved
  • 如何在运行 powershell 进程时阻止 Windows 10 计算机进入睡眠/休眠状态?

    我有一个 powershell 进程 它从远程服务器读取记录并将其复制到本地数据库中 运行时 可能会运行 8 12 小时 如何防止计算机在此期间关闭 或进入睡眠 休眠模式 我知道我可以调整 电源和睡眠设置 以将计算机设置为从不睡眠 但这不是
  • ElementTree 和 unicode

    我在 xml 文件中有这个字符
  • 使用 flutter 的带有每日步数计数器的计步器

    我正在尝试使用 flutter 构建一个基本的健身应用程序 该应用程序有两个主要功能 每日步数计数器 历史数据图表 每天的步数 我用计步器插件 https pub dev packages pedometer从手机的传感器检索数据 我的问题
  • 处理 Kafka 流中的异常

    已经浏览了多个帖子 但其中大多数与处理错误消息相关 而不是处理它们时的异常处理 我想知道如何处理流应用程序收到的消息并且处理消息时出现异常 异常可能是由于多种原因造成的 例如网络故障 RuntimeException 等 有人可以建议什么是
  • 当 div (ng) 禁用时 ng-click 仍然会触发

    问题是ng click适用于这样的事件如果cancelTicket false它仍然在燃烧ng click 我怎样才能阻止呢 div class btn block save changes padding 10 style display
  • 事件循环中有哪些类型的队列?

    我面临着提及render queue在不同的文章中 example https blog usejournal com welcoming javascript 57e1051d9d example https medium com ati
  • 如何改变约束

    SQL 如何更改约束 下面是我的约束之一 CONSTRAINT ACTIVEPROG FKEY1 FOREIGN KEY ActiveProgCode REFERENCES PROGRAM ActiveProgCode 我想添加 ON DE
  • 这段代码片段中是如何进行递归的?

    看看调用堆栈和监视 现在当我按 F10 时 监视 中的行值更改为 对象对象 因此一切都发生了 直到此时我才理解流程 之后发生的事情不清楚 现在 为什么即使我在第 8 行提供断点 代码也不会在第 8 行停止 This is the quest
  • 在 REST 中,为每个资源表示创建单个内容类型还是具有单独的内容类型?

    如果我想遵循为 REST API 使用自定义内容类型的做法 我是否应该为整个项目定义单个自定义内容类型 或者为每个资源表示 发送到 返回的内容 定义自定义内容类型 REST API 在我的项目中使用 也就是说 如果我正在构建一个 Books
  • 在 ReactJS 中处理未定义值的最佳方法?

    我正在使用 ReactJS 访问 API 当 React 组件访问 API 提供的对象中可能 未定义 的属性时 阻止 React 组件崩溃的最佳方法是什么 错误的一个例子是 类型错误 无法读取未定义的属性 项目 您似乎正在尝试访问该属性it
  • 运行鼻子测试时出错

    我最近重新安装了nose对我的代码运行测试 https nose readthedocs org en latest https nose readthedocs org en latest I used sudo pip install
  • Cordova / Ionic:在设备上模拟或运行时未处理 $http 请求

    上周一切都很顺利 当我在设备上运行应用程序或使用 Genymotion 进行模拟时 对 api 的所有调用都正常工作 要么返回数据 要么失败 但至少显示一些内容 我正在使用 ionic run android 我添加更新全局科尔多瓦离子 n
  • 如何禁用 AdMob 日志?

    我知道发布带有日志的应用程序不是一个好的做法 因此我禁用了所有日志调用 现在 AdMob 每次显示广告时都会记录日志 我该如何取消呢 我似乎在文档中找不到有关此主题的任何信息 并且我读到您可以使用ProGuard http proguard
  • 如何屏蔽 cpu 不受 linux 调度程序的影响(防止它调度线程到该 cpu 上)?

    可以使用sched setaffinity将线程固定到 CPU 提高性能 在某些情况下 来自 Linux 手册页 限制进程在单个 CPU 上运行还可以避免 缓存失效导致的性能成本 进程停止在一个 CPU 上执行 然后在另一个 CPU 上重新