c – 如何为流程的“经理”和“工人”线程划分优先级(或设置调度策略)?

我正在运行一个进程(在基于Linux 3.x的操作系统上),其中:

>一些线程是’管理器’线程(为简单起见,假设他们决定哪些工作线程应该做什么,但不做任何I / O,并且他们需要的CPU时间总共短于/短于工人线程’)
>更多的线程是’工人’线程:他们在计算方面做了很多提升,我在任何时候被抢先都没有问题.

可能存在超额预订(即,使用HT的英特尔处理器上的工作线程数超过核心的两倍).现在,我看到的是’经理’线程没有足够频繁地获得处理器时间.他们并非完全’挨饿’,我只是想给他们一个提升.所以,我自然而然地想到设置不同的线程优先级(我在Linux上) – 但后来我注意到线程调度程序的不同选择及其效果.此时我感到困惑,或者更确切地说 – 我不清楚:

>我应该为经理选择哪种调度策略,为工人选择哪种调度策略?
>我应该将线程优先级设置为什么(如果有的话)?
>我是否需要偶尔让我的线程屈服()?

笔记:

>我故意不再谈论语言或线程池机制.我想在更一般的环境中提出这个问题.
>请不要对CPU核心做出假设.可能有很多,或者可能只有一个,也许我需要每个核心上的工人(或工人和经理).
>工作线程可能会也可能不会执行I / O.但是,对于他们没有做任何I / O的情况的答案是受欢迎的.
>除了运行我的应用程序之外,我真的不需要系统非常灵敏.我的意思是,我宁愿能够在那里使用SSH,让我的打字回复给我,没有明显的延迟,但没有真正的限制.

最佳答案
UPD 12.02.2015:我做了一些实验.

理论

将“管理器”线程调度程序更改为RT(提供SCHED_DEADLINE / SCHED_FIFO策略的实时调度程序)有明显的解决方案.在这种情况下,“管理器”线程将始终具有比系统中大多数线程更大的优先级,因此它们几乎总是在需要时获得CPU.

但是,还有另一种解决方案可以让您继续使用CFS调度程序.您对“工人”线程的目的描述与批处理调度类似(在古代,当计算机很大时,用户必须将他的工作放到队列中并等待数小时才能完成). Linux CFS通过SCHED_BNCH策略和对话作业通过SCHED_NORMAL策略支持批处理作业.

内核代码(kernel/sched/fair.c)中也有用的注释:

/*
 * Batch and idle tasks do not preempt non-idle tasks (their preemption
 * is driven by the tick):
 */
if (unlikely(p->policy != SCHED_NORMAL) || !sched_feat(WAKEUP_PREEMPTION))
    return;

因此,当“管理器”线程或其他事件唤醒“工作者”时,后者只有在系统中有空闲CPU或“管理器”耗尽其时间片(调整它改变任务的权重)时才会获得CPU.

如果不更改调度程序策略,似乎无法解决您的问题.如果“工人”线程很忙并且“经理”很少醒来,他们会得到相同的vruntime奖金,所以“工人”总是会抢占“经理”线程(但你可能会增加他们的体重,所以他们会更快地耗尽他们的奖金).

实验

我有一台带有2个Intel Xeon E5-2420 CPU的服务器,它为我们提供了24个硬件线程.为了模拟两个线程池,我使用了自己的TSLoad工作负载生成器(并在运行实验时修复了几个错误:)).

有两个线程池:具有4个线程的tp_manager和具有30个线程的tp_worker,两者都运行busy_wait工作负载(仅用于(i = 0; i https://gist.github.com/myaut/ad946e89cb56b0d4acde

3.12(带调试配置的vanilla)

EXP  |              MANAGER              |     WORKER
     |  sched            wait    service | sched            service
     |  policy           time     time   | policy            time
33   |  NORMAL          0.045    2.620   |     WAS NOT RUNNING
34   |  NORMAL          0.131    4.007   | NORMAL           125.192
35   |  NORMAL          0.123    4.007   | BATCH            125.143
36   |  NORMAL          0.026    4.007   | BATCH (nice=10)  125.296
37   |  NORMAL          0.025    3.978   | BATCH (nice=19)  125.223
38   |  FIFO (prio=9)  -0.022    3.991   | NORMAL           125.187
39   |  core:0:0        0.037    2.929   | !core:0:0        136.719

3.2(股票Debian)

EXP  |              MANAGER              |     WORKER
     |  sched            wait    service | sched            service
     |  policy           time     time   | policy            time
46   |  NORMAL          0.032    2.589   |     WAS NOT RUNNING
45   |  NORMAL          0.081    4.001   | NORMAL           125.140
47   |  NORMAL          0.048    3.998   | BATCH            125.205
50   |  NORMAL          0.023    3.994   | BATCH (nice=10)  125.202
48   |  NORMAL          0.033    3.996   | BATCH (nice=19)  125.223
42   |  FIFO (prio=9)  -0.008    4.016   | NORMAL           125.110
39   |  core:0:0        0.035    2.930   | !core:0:0        135.990

一些说明:

>所有时间都以毫秒为单位
>最后一个实验用于设置亲和力(由@PhilippClaßen建议):经理线程绑定到Core#0,而工作线程绑定到除Core#0之外的所有核心.
>管理器线程的服务时间增加了两倍,这可以通过内核内的并发来解释(处理器具有超线程!)
>使用SCHED_BATCH不错(TSLoad不能直接设置权重,但很好的可以间接设置)稍微减少等待时间.
> SCHED_FIFO实验中的负等待时间是可以的:TSLoad保留30us所以它可以做初步工作/调度程序有时间进行上下文切换/等等.看起来SCHED_FIFO非常快.
>保留单核并不是那么糟糕,因为它消除了核心内并发性,服务时间显着减少

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


linux常用进程通信方式包括管道(pipe)、有名管道(FIFO)、信号(signal)、消息队列、共享内存、信号量、套接字(socket)。管道用于具有亲缘关系的进程间通信,有名管道的每个管道具有名字,使没有亲缘关系的进程间也可以通信。信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除
Linux性能观测工具按类别可分为系统级别和进程级别,系统级别对整个系统的性能做统计,而进程级别则具体到进程,为每个进程维护统计信息。

按实现原理分,可分为基于计数器和跟踪以及剖析。含义如下:

计数器:内核维护的统计数据,通常为无符号整型,用于对发生的事件计数,比如,网络包接收计数器,磁
本文详细介绍了curl命令基础和高级用法,包括跳过https的证书验证,详细追踪整个交互过程,可用于调用网络后端接口,诊断http和https网络服务故障。
本文包含作者工作中常用到的一些命令,用于诊断网络、磁盘占满、fd泄漏等问题。命令包括ping、fping、tcpdump、lsof、netstat、/proc/$pid/fd、du、grep、traceroute、dig。
linux的平均负载表示运行态和就绪态及不可中断状态(正在io)的进程数目,用uptime查看到负载很高,既有可能是CPU利用率高,也可能是大量在等待io的进程导致,用mpstat查看每个CPU的使用情况,查看CPU的使用率或者CPU花在等待io的时间,接着用pidstat定位具体的进程
CPU上下文频繁切换会导致系统性能下降,切换分为进程切换、线程切换及中断切换,进程切换的开销较大,除了需要保存寄存器和程序计数器中的值还需保存全局变量、栈等到内存中,以便下次运行恢复,而同一进程中的线程切换开销会小很多,只需更新寄存器和线程独有的栈,共享资源如打开的文件、全局变量等无需切换,当硬件中
1.top命令 作用:该命令可以按CPU使用.内存使用和执行时间对任务进行排序,常用来监控系统中占用CPU或内存较高的程序及CPU和内存的负载。 默认视图: 当想看系统负载时,可观察汇总的%CPU中的us用户进程和sy系统进程是否占用CPU很高,相加接近100%就说明占用很高了,有些程序可能得不到及
文章浏览阅读1.8k次,点赞63次,收藏54次。Linux下的目录权限!!!粘滞位!!!超详解!!!
文章浏览阅读1.6k次,点赞44次,收藏38次。关于Qt的安装、Windows、Linux、MacBook_mack book 安装qt
本文介绍了使用shell脚本编写一个 Hello
文章浏览阅读1.5k次,点赞37次,收藏43次。【Linux】初识Linux——了解操作系统的发展历史以及初次体验Linux编程环境
文章浏览阅读3k次,点赞34次,收藏156次。Linux超详细笔记,个人学习时很认真的记录的,觉得好的麻烦点个赞。
文章浏览阅读6.8k次,点赞109次,收藏114次。【Linux】 OpenSSH_9.3p1 升级到 OpenSSH_9.5p1(亲测无问题,建议收藏)_openssh_9.5p1
文章浏览阅读3.5k次,点赞93次,收藏78次。初识Linux中的线程,理解线程的各种概念,理解进程地址空间中的页表转换,介绍pthread线程库并理解线程库!
文章浏览阅读863次。出现此问题为Linux文件权限问题,解决方案为回到引擎目录执行命令。输入用户密码后运行./UnrealEditor。_increasing per-process limit of core file size to infinity.
文章浏览阅读2.9k次。使用文本编辑器:打开CSV文件,并使用文本编辑器(如Notepad++、Sublime Text、Visual Studio Code等)来查看文件的字符编码格式。通常在编辑器的底部状态栏或设置中可以找到当前编码的显示。请注意,上述方法并非绝对准确,特别是当文件没有明确的编码标识时。因此,如果你发现CSV文件在不同的工具或方法中显示不同的编码格式,可能需要进行进一步的分析和判断,或者尝试使用不同的编码转换方法。该命令将输出文件的MIME类型和编码信息。使用命令行工具:在命令行中,你可以使用。_shell读取csv文件逐行处理
本文介绍了如何在Linux系统中升级gcc版本,以便更好地支持C++11及以上版本的新特性。通过升级gcc,可以提升编译器的功能和性能,获得更好的开发体验。详细的步骤和方法请参考原文链接。
文章浏览阅读4.4k次,点赞6次,收藏19次。Mosquitto是一个开源的MQTT消息代理服务器。MQTT是一个轻量级的、基于发布/订阅模式的消息传输协议。 mosquitto的安装使用比较简单,可以方便的来进行一些测试。_linux mosquitto
文章浏览阅读7.2k次,点赞2次,收藏12次。Linux中,用于根目录下有一个.ssh目录,保存了ssh相关的key和一些记录文件。_~/.ssh/
文章浏览阅读4.5k次,点赞5次,收藏18次。首先需要安装 snmp ,使用下面的命令进行安装安装完毕之后,使用下面的命令查看是否安装成功当命令行显示如图即为安装成功。_snmp工具