AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 405092
Accepted
xioxox
xioxox
Asked: 2012-07-06 08:16:32 +0800 CST2012-07-06 08:16:32 +0800 CST 2012-07-06 08:16:32 +0800 CST

不错的水平不适用于 Linux

  • 772

我有一些高度浮点密集型进程执行很少的 I/O。一个叫做“xspec”,它计算一个数值模型并每秒将一个浮点结果返回给主进程(通过标准输出)。它在 19 级很好。我有另一个简单的过程“cpufloattest”,它只是在一个紧密的循环中进行数值计算。这不是很好。

我有一个禁用超线程的 4 核 i7 系统。我已经开始了每种类型的流程中的 4 个。为什么 Linux 调度程序 (Linux 3.4.2) 没有正确限制 niced 进程占用的 CPU 时间?

中央处理器:56.2%us、1.0%sy、41.8%ni、0.0%id、0.0%wa、0.9%hi、0.1%si、0.0%st
内存:总计 12297620k,已使用 12147472k,空闲 150148k,缓冲区 831564k
交换:总共 2104508k,已使用 71172k,免费 2033336k,缓存 4753956k

  PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ 命令                                         
32399 jss 20 0 44728 32m 772 R 62.7 0.3 4:17.93 cpufloattest                                    
32400 jss 20 0 44728 32m 744 R 53.1 0.3 4:14.17 cpufloattest                                    
32402 jss 20 0 44728 32m 744 R 51.1 0.3 4:14.09 cpufloattest                                    
32398 jss 20 0 44728 32m 744 R 48.8 0.3 4:15.44 cpufloattest                                    
 3989 jss 39 19 1725m 690m 7744 R 44.1 5.8 1459:59 xspec                                           
 3981 jss 39 19 1725m 689m 7744 R 42.1 5.7 1459:34 xspec                                           
 3985 jss 39 19 1725m 689m 7744 R 42.1 5.7 1460:51 xspec                                           
 3993 jss 39 19 1725m 691m 7744 R 38.8 5.8 1458:24 xspec                                           

如果我启动 8 个 cpufloattest 进程,调度程序会按照我的预期进行,其中 4 个很好(即 ​​4 个占用大部分 CPU,4 个占用很少)

linux nice scheduler
  • 5 5 个回答
  • 5099 Views

5 个回答

  • Voted
  1. Best Answer
    xioxox
    2012-07-07T00:04:53+08:002012-07-07T00:04:53+08:00

    我发现了导致此问题的原因。这是由于 CFS 调度程序的“自动分组”功能。如果我做

    echo 0 > /proc/sys/kernel/sched_autogroup_enabled 
    

    然后一切都如您所料。当 nice 0 进程运行时,nice 19 进程的 CPU 使用率下降到接近零。

    我会尝试找出自动分组究竟做了什么来打破我的用例并更新这个答案。

    编辑...我在 IRC 上和一些内核人员聊天,他们只是说如果它对我的工作量不起作用我应该禁用它并且它只是 Linus 喜欢的一个疯狂补丁。我不确定为什么自动分组不喜欢我的工作量,但这个答案是为遇到类似问题的人准备的。

    • 10
  2. mtk
    2016-12-05T23:32:29+08:002016-12-05T23:32:29+08:00

    要向已接受的答案添加更多详细信息...您看到的行为是由于 Linux 2.6.38(2010 年)中添加的自动分组功能。据推测,在所描述的场景中,这两个命令在不同的终端窗口中运行。如果它们在同一个终端窗口中运行,那么您应该已经看到 nice 值的影响。这个答案的其余部分详细说明了这个故事。

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

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

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

    假设有两个自动组竞争同一个 CPU(即,假设要么是一个 CPU 系统,要么是使用taskset(1) 将所有进程限制在 SMP 系统上的同一个 CPU 上)。第一组包含十个 CPU 绑定进程,来自以make -j10. 另一个包含单个 CPU 绑定进程:视频播放器。自动分组的效果是两组将各自获得一半的 CPU 周期。也就是说,视频播放器将获得 50% 的 CPU 周期,而不是仅仅 9% 的周期,这可能会导致视频播放质量下降。SMP 系统上的情况更为复杂,但总体效果是相同的:调度程序在任务组之间分配 CPU 周期,这样包含大量 CPU 绑定进程的自动组不会以占用 CPU 周期为代价系统上的其他作业。

    不错的价值和组调度

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

    如果启用了自动分组,那么(隐含地)放置在自动分组中的所有线程(即,由创建的相同会话setsid(2))形成一个任务组。因此,每个新的自动组都是一个单独的任务组。

    在组调度下,线程的 nice 值仅对同一任务组中的其他线程的调度决策有影响。就 UNIX 系统上 nice 值的传统语义而言,这会产生一些令人惊讶的结果。特别是,如果启用了自动分组,则nice(1)在进程上使用仅对相对于在同一会话(通常:同一终端窗口)中执行的其他进程的调度有影响。

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

    如果您想防止自动分组干扰nice此处描述的传统行为,那么,如已接受的答案中所述,您可以禁用该功能

    echo 0 > /proc/sys/kernel/sched_autogroup_enabled
    

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

    自动组不错的价值

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

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

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

    autogroup nice 设置与进程 nice 值具有相同的含义,但适用于根据其他自动组的相对 nice 值将 CPU 周期作为一个整体分配给自动组。对于自动组内的进程,它收到的 CPU 周期将是自动组的 nice 值(与其他自动组相比)和进程的 nice 值(与同一自动组中的其他进程相比)的乘积。

    • 7
  3. Janne Pikkarainen
    2012-07-06T21:43:34+08:002012-07-06T21:43:34+08:00

    可能不是您要找的东西,但是您尝试过 commandcpulimit吗?它在 Debian/Ubuntu 存储库中可用最少。

    cpulimit您可以调整允许任何进程占用总 CPU 时间的百分比。另一种可能是使用cgroups, 但cpulimit更直接且易于使用。

    • 1
  4. Andrew Smith
    2012-07-06T09:00:02+08:002012-07-06T09:00:02+08:00

    只需将 xspec 减少到单个进程,这样您将拥有 4:1 或 3:1 这将运行得很好。

    • 0
  5. siesta
    2012-07-06T20:57:00+08:002012-07-06T20:57:00+08:00

    我认为您的意思是将优先级设置得更高?在这种情况下你会想使用负值..

    在您的输出中,cpufloattest 的优先级高于 xspec。

    编辑:您可以使用 taskset 来设置一个进程来使用特定的处理器,但是,在这种情况下这不是必需的。

    • 0

相关问题

  • 多操作系统环境的首选电子邮件客户端

  • 你最喜欢的 Linux 发行版是什么?[关闭]

  • 更改 PHP 的默认配置设置?

  • 保护新的 Ubuntu 服务器 [关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve