进程友善度(优先级)设置对 Linux 没有影响

2024-01-09

我编写了一个测试程序,其中仅包含一个无限循环,其中包含一些 内部计算,并且不执行 I/O 操作。我尝试启动该程序的两个实例,其中一个具有高 尼斯值,另一个具有低尼斯值:

sudo nice -n 19 taskset 1 ./test
sudo nice -n -20 taskset 1 ./test

taskset 命令确保两个程序在同一内核上执行。 与我的预期相反,顶级报告称这两个项目都获得了大约 50% 的收益 计算时间。这是为什么?好的命令有效果吗?


您所看到的行为几乎肯定是由于 Linux 2.6.38(2010 年)中添加的自动分组功能造成的。大概当您描述运行这两个命令时,它们是在不同的终端窗口。如果你在same终端窗口,那么您应该已经看到了nice值的效果。这个答案的其余部分详细阐述了这个故事。

内核提供了一种称为自动分组的功能,以在面对多进程、CPU 密集型工作负载时提高交互式桌面性能,例如使用大量并行构建进程(即,make(1) -j flag).

创建新会话时会创建新的自动组 通过setsid(2);例如,当启动新的终端窗口时,就会发生这种情况。创建的新进程fork(2)继承其 父级的自动组成员资格。因此,一个进程中的所有进程 会话是同一自动组的成员。

启用自动分组后,自动分组的所有成员 被放置在同一个内核调度程序“任务组”中。 Linux 内核调度程序采用一种算法来均衡分配 跨任务组的 CPU 周期。可以通过以下示例描述这对于交互式桌面性能的好处。

假设有两个自动组竞争同一个CPU (即,假设单个 CPU 系统或使用taskset(1)将所有进程限制在 SMP 系统上的同一个 CPU 上)。 第一组包含来自内核的 10 个受 CPU 限制的进程 构建开始于make -j10。另一个包含一个 CPU 密集型进程:视频播放器。自动分组的效果是 两组将各接收一半的 CPU 周期。那是, 视频播放器将获得 50% 的 CPU 周期,而不是 只有 9% 的周期,这可能会导致视频质量下降 回放。 SMP 系统上的情况更为复杂,但 总体效果是相同的:调度程序分配 CPU 周期 跨任务组,这样一个自动组包含一个大的 受 CPU 限制的进程数量最终不会占用 CPU 周期 以牺牲系统上的其他作业为代价。

不错的价值和团体安排

当调度非实时进程时(例如,那些已调度的进程) 默认情况下SCHED_OTHER政策), 调度程序采用一种称为“组调度”的技术,在该技术下,线程在“任务组”中进行调度。 任务组是在各种情况下形成的,这里的相关案例是自动分组。

如果启用自动分组,则所有线程 (隐式)放置在自动组中(即相同的会话,如 由...制作setsid(2))组成一个任务组。每个新的自动组都是 因此是一个单独的任务组。

在组调度下,线程的nice值会影响 调度决策仅相对于同一线程中的其他线程 任务组。这会产生一些令人惊讶的后果 UNIX 系统上的nice值的传统语义。特别是,如果启用了自动分组(这是各种 Linux 发行版中的默认设置),则 雇用nice(1)对一个过程有影响 仅用于相对于其他进程执行的调度 同一会话(通常:同一终端窗口)。

相反,对于(例如)唯一的两个进程 不同会话中的 CPU 密集进程(例如,不同的终端 windows,每个作业都与不同的自动组相关联), 修改其中一个会话中进程的好值 对调度程序的决策没有影响 另一个会话中的进程。这可能是您看到的场景,尽管您没有明确提到使用两个终端窗口。

如果您想防止自动分组干扰传统的nice如此处所述的行为,您可以禁用该功能

echo 0 > /proc/sys/kernel/sched_autogroup_enabled

但请注意,这也会产生禁用自动分组功能旨在提供的桌面交互性优势的效果(见上文)。

自动组不错的价值

可以通过以下方式查看进程的自动组成员资格 文件/proc/[pid]/autogroup:

$ cat /proc/1/autogroup
/autogroup-1 nice 0

该文件还可用于修改分配的CPU带宽 到自动组。这是通过在“nice”中写一个数字来完成的 range 到文件以设置自动组的好值。允许的 范围从+19(低优先级)到-20(高优先级)。

autogroup的nice设置与进程含义相同 不错的值,但适用于 CPU 周期的分配 自动分组作为一个整体,基于其他的相对好值 自动组。对于自动组内的进程,它所占用的 CPU 周期 收到的将是自动组的好值的乘积(比较 到其他自动组)以及该过程的良好价值(与 同一自动组中的其他进程)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

进程友善度(优先级)设置对 Linux 没有影响 的相关文章

  • 在Linux中断上下文中运行用户线程

    我正在编写一些定制的应用程序 并允许更改 Linux 内核中的中断处理程序代码 我有一个用户线程正在等待中断发生 如果发生中断 那么我要做的第一件事就是执行该用户线程 有什么办法让它发挥作用吗 Thanks 创建一个字符设备 这就是内核所做
  • linux x86 汇编语言 sys_read 调用的第一个参数应为 0 (stdin)

    我正在编写一个简单的汇编程序来从标准输入读取 如 scanf 这是我的代码 section bss num resb 5 section txt global start start mov eax 3 sys read mov ebx 0
  • 如何让“grep”从文件中读取模式?

    假设有一个很大的文本文件 我只想打印与某些模式不匹配的行 显然 我可以使用egrep v patter1 pattern2 pattern3 现在 如果所有这些模式都在一个文本文件中怎么办 最好的制作方法是什么egrep从文件中读取模式 g
  • 从多线程程序中调用 system()

    我们正在开发一个用 C 编写的多线程内存消耗应用程序 我们必须执行大量的 shellscript linux 命令 并获取返回码 读完之后article http www linuxprogrammingblog com threads a
  • 无需 cron 在后台发送邮件

    我想知道是否有一种方法可以运行 PHP 循环 以便在后台向订阅者发送几百封电子邮件 我的目标是格式化新闻通讯 单击发送 然后关闭浏览器或更改页面 当然 发送电子邮件的实际过程将在后台运行 不会因浏览器关闭而中断 我知道这可以通过 cron
  • 如何在特定 systemd 服务重新启动时触发自定义脚本运行

    我想知道如何安排自定义脚本在重新启动服务时运行 我的用例是 每当重新启动 Tomcat 服务时 我都必须运行多个命令 我想知道是否有一种方法可以编写脚本并安排它在重新启动 Tomcat 服务时运行 我已将 tomcat 脚本设置为 syst
  • Docker:处理 tar 文件时出错(退出状态 1):设置枢轴目录时出错:不是目录

    我是 Docker 新手 不知道是什么原因导致此错误或如何诊断它 任何有关此问题的具体帮助或有关首先检查何处以诊断此类问题的提示将不胜感激 我的 Dockerfile FROM java 8 Install maven RUN apt ge
  • Linux 桌面快捷方式和安装图标

    我需要添加什么到我的 spec文件来创建桌面快捷方式并在安装过程中为快捷方式分配一个图标 rpm 如果需要脚本 一个示例将非常有帮助 您在 Linux 下使用 desktop 文件作为图标 图标放置的位置取决于您使用的发行版和桌面环境 由于
  • 设置 Apache POI 的路径

    我想创建 Excel 文件并使用 java 程序在该文件中写入数据 That is here http www techbrainwave com p 554我在 java 文件所在的位置提取了 Apache POI 并将该路径包含在路径变
  • 如何使用 sed 仅删除双空行?

    我找到了这个问题和答案 https stackoverflow com questions 4651591 howto use sed to remove only triple empty lines关于如何删除三重空行 但是 我只需要对
  • SONAR - 使用 Cobertura 测量代码覆盖率

    我正在使用声纳来测量代码质量 我不知道的一件事是使用 Cobertura 测量代码覆盖率的步骤 我按照以下步骤操作http cobertura sourceforge net anttaskreference html http cober
  • 嵌入式Linux poll()不断返回

    我有一个特别的问题 当我知道没有什么可读时 民意调查不断返回 因此设置如下 我有 2 个文件描述符 它们构成fd设置民意调查监视 一种用于引脚从高到低的变化 GPIO 另一个用于代理输入 代理输入出现问题 处理的顺序是 启动main函数 然
  • 为什么我收到的数据包数据大小大于mss?

    我在两台 PC 上使用 ifconfig ethX mtu 300 修改了 MTU 并使用 netperf 测试网络 我用 WireShark 嗅探了 SYN 数据包中的 MSS 260 但我得到了一些大于 260 的数据包 为什么 嗅探器
  • 何时使用 pthread 条件变量?

    线程问题 看来 只有在其他线程调用 pthread cond notify 之前调用 pthread cond wait 时 条件变量才起作用 如果在等待之前发生通知 那么等待将被卡住 我的问题是 什么时候应该使用条件变量 调度程序可以抢占
  • 是否可以在Linux上将C转换为asm而不链接libc?

    测试平台为Linux 32位 但也欢迎 Windows 32 位上的某些解决方案 这是一个c代码片段 int a 0 printf d n a 如果我使用 gcc 生成汇编代码 gcc S test c 然后我会得到 movl 0 28 e
  • Android:ANT 构建失败,并显示 google-play-services-lib:“解析为没有项目的 project.properties 文件的路径”

    我正在尝试使用 ANT 构建我的应用程序 但在包含 google play services lib 库项目后 我惨遭失败 Step 1 我在 project properties 文件中设置了对库项目的引用 android library
  • 强制卸载 NFS 安装目录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • 应用程序无缘无故地被杀死。怀疑 BSS 高。如何调试呢?

    我已经在CentOs6 6中成功运行我的应用程序 最近 硬件 主板和内存 更新了 我的应用程序现在毫无理由地被杀死 root localhost PktBlaster PktBlaster Killed 文件和 ldd 输出 root lo
  • 如何在bash中使用jq从变量中包含的json中提取值

    我正在编写一个 bash 脚本 其中存储了一个 json 值 现在我想使用 Jq 提取该 json 中的值 使用的代码是 json val code lyz1To6ZTWClDHSiaeXyxg redirect to http examp
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C

随机推荐

  • android api与谷歌地图显示网格

    我正在创建一个使用谷歌地图 API v2 的 Android 应用程序 我相信我已经按照谷歌教程所述完成了所有操作 但我仍然只得到谷歌地图网格 没有地图 我使用 keystore debug 的 SHA1 创建了一个调试密钥 以下是我的设置
  • 如何编译加载到字符串中的erlang代码?

    我有一个生成的字符串 其中包含 erlang 模块的代码 有没有办法直接从字符串编译生成的模块 或者有没有办法将字符串转换为所需的格式compile forms 1 或者我必须先将其保存到临时文件中 然后使用compile file 1 或
  • fork() 中的写时复制如何处理多个 fork?

    根据维基百科 这可能是错误的 当发出 fork 系统调用时 会创建与父进程对应的所有页面的副本 并由操作系统为子进程加载到单独的内存位置 但在某些情况下不需要这样做 考虑当子进程执行 exec 系统调用 用于执行 C 程序中的任何可执行文件
  • 无法在 Next.js 13 和 Sanity v3 中使用 React 语法荧光笔

    您好 我的项目在使用 Sanity v3 和 React Syntax Highlighter 时遇到问题 当我使用Refactor用于在浏览器中显示我的代码的库 它可以通过查看教程来工作理智输入代码 https www sanity io
  • Tinymce - 插入 html 代码

    如果有人可以帮助我解决这个问题 我将不胜感激 我已经尝试解决了几天 但没有成功 我制作了将图像插入代码的自定义按钮 这是文本版本 a href Insert Image a 问题是我不允许使用引号 所以我必须使用 alt Some valu
  • 为什么字节码可能比本机代码运行得更快[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Java:为什么 NullPointerExceptions 不称为 NullReferenceExceptions?

    这是一个疏忽吗 还是跟JVM有关 Java 确实有指针 不能对其执行指针算术的指针 来自尊者JLS http docs oracle com javase specs jls se7 html jls 4 html jls 4 1 Java
  • 如何使用 ffmpeg 删除所有元数据?

    我有输入文件 infile mp3该文件包含元数据 艺术家 流派等 我尝试删除所有元数据以输出 wav file 是的 我找到了选项 地图元数据 1 但输出出乎我意料 ffmpeg i infile mp3 acodec pcm s16le
  • SQLite数据库最大存储容量

    SQLite 数据库中最多可以存储多少条记录 有什么限制吗 如果数据超出此限制 会给出什么类型的错误 整个系统会失败 还是会发生什么 基于this http developer android com guide topics data d
  • PhpStorm LESS 观察程序配置

    我正在使用 PhpStorm 8 处理一些 LESS 文件 variables less导入自styles less 当我保存时variables less only a variables css正在制作中 如何将观察者配置为仅转译sty
  • 是否有提交空选择多个的标准客户端行为?

    http www w3 org TR html401 interact forms html edef SELECT http www w3 org TR html401 interact forms html edef SELECT 不指
  • 使用 java 中的 scala.collection.immutable.Set 的示例

    有熟悉 Scala 的人知道我如何使用scala collection immutable Set http www scala lang org docu files api scala collection immutable Set
  • 实体框架 6 代码优先 - 存储库实现是一个好的实现吗?

    我即将使用存储库和工作单元实现 Entity Framework 6 设计 周围有很多文章 我不确定最好的建议是什么 例如 我真的很喜欢这里实现的模式 出于文章中建议的原因here http codefizzle wordpress com
  • 我应该在事务中包含 SELECT 吗?

    当使用数据库事务对多个更新进行分组时 我是否也应该在事务中包含 SELECT 例如 假设我 得到一个记录 使用记录中的数据检查该记录的编辑权限 更新一些记录 更新一些其他记录 我应该在 获取记录 阶段之前开始交易 还是在更新前后开始交易 我
  • iframe 中的 Javascript window.opener

    我正在尝试使用弹出窗口脚本文件中的 window opener 引用来访问弹出窗口的开启器 考虑 popup html 中包含的以下脚本 http localhost test popup html 当不涉及 iframe 时 此方法有效
  • 获取 li 元素的文本

    ul class leftbutton li Sample 1 li li Sample 2 li li Sample 3 li li Sample 4 li li Sample 5 li ul 我想获取 id menu selected
  • 创建类似于 iBook 或 Stanza 应用程序的 ePub 阅读器的最佳方法 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在 gnuplot 中为 xticlabels 提供自定义字符串参数?

    假设我有一个包含三列的数据文件 我希望能够更改 x 轴标签 经过一番谷歌搜索后我发现xticlabels 但问题是它似乎只接受列号作为参数 用于 ex 绘图xticlabels 3 用第三列标记标签 我希望能够把类似的东西 1 2作为该函数
  • 合并重复的数组项

    我有一个哈希数组 array keyword gt A total value gt 50 keyword gt B total value gt 25 keyword gt C total value gt 40 keyword gt A
  • 进程友善度(优先级)设置对 Linux 没有影响

    我编写了一个测试程序 其中仅包含一个无限循环 其中包含一些 内部计算 并且不执行 I O 操作 我尝试启动该程序的两个实例 其中一个具有高 尼斯值 另一个具有低尼斯值 sudo nice n 19 taskset 1 test sudo n