首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该尝试“平衡”我的线程,还是linux会这样做?

我应该尝试“平衡”我的线程,还是linux会这样做?
EN

Unix & Linux用户
提问于 2020-05-20 16:23:15
回答 3查看 763关注 0票数 9

一个简单的例子。我正在运行一个使用TCP套接字服务http请求的进程。它可能是计算某物,这意味着CPU将是瓶颈B)发送一个大的文件,这可能导致网络成为瓶颈或C)复杂的数据库查询与半随机访问,造成磁盘瓶颈。

我是否应该尝试将每个页面/API调用归类为上述一个或多个类型,并试图平衡每种调用中应有的多少?或者操作系统会帮我这么做吗?如何决定我想要多少线程?

我将为硬件线程12和48使用2个数字(英特尔xeon有这么多)。我在想,线程的2/3 3rds是用于重CPU (8/32),1个线程用于重磁盘(或每个磁盘有1个重线程),其余的3/15用于任何其他的线程,这意味着不试图平衡网络。

硬件上是否应该有超过12/48的线程,只支持12/48线程?我想要的更少,所以我不会导致CPU进入一个较慢的节流模式(我忘记了它的名字,但我听说如果太多的芯片一次激活,它就会发生)。如果我必须加载和资源平衡我的线程,我将如何做到这一点?

EN

回答 3

Unix & Linux用户

回答已采纳

发布于 2020-06-02 23:07:46

Linux:

Linux内核有一个很好的实现,并且有许多特性/设置来管理运行过程的资源(通过CPU调控器、sysctl或cgroup),在这种情况下,建议调优这些设置以及交换调整(如果需要的话),基本上您将调整默认的功能模式以适应您的设备。

基准测试、压力测试和应用更改后的情况分析是必须的,特别是在生产服务器上。当内核设置调整到所需的使用时,性能增益可能是非常重要的,另一方面,这需要测试和很好地理解管理程序所需的不同设置。

Linux确实使用州长在运行的应用程序之间负载CPU资源,许多调控器是可用的;取决于发行版的内核,某些调控器可能不可用(可以重新构建内核以添加缺失或非上游调控器)。您可以检查现任州长是什么?改变它,更重要的是,在本例中,可以检查调整其设置

附加文档:阅读指南相似问题频率标度总督的选择性能调控器cpufreq

SysCtl:

西斯克尔是一个在运行时检查和更改内核参数的工具,可以使用配置文件/etc/sysctl.conf进行永久调整,这是这个答案的一个重要部分,因为可以用Sysctl更改许多内核设置,可以使用命令sysctl -a显示可用设置的完整列表,在这篇文章上可以获得详细信息。

Cgroup:

内核提供了一个特性:控件组,它们在本指南中以较短的名称cgroup来调用。Cgroup允许您在运行于系统上的用户定义的任务组(进程)之间分配资源,如CPU时间、系统内存、网络带宽或这些资源的组合。您可以监视配置的cgroup,拒绝cgroup对某些资源的访问,甚至可以在运行中的系统上动态地重新配置cgroup。可以将cgconfig (Cgconfig)服务配置为在启动时启动并重新建立预定义的cgroup,从而使它们在重新启动时持久存在。

资料来源,进一步阅读问题在这件事上。

Ram:

如果系统有有限数量的ram,这可能很有用,否则您可以禁用交换以主要使用ram。交换系统可以通过每一过程互换设置进行调整。如果需要,可以用超极限限制每个进程的重新源(ram) (也用于限制其他资源)。

磁盘:

磁盘I/O设置(I/O调度器)和集群大小都可以更改。

Alternatives:

其他工具,如好的库普兰cpuset任务集超极限也可以作为替代方法。

票数 6
EN

Unix & Linux用户

发布于 2020-06-02 21:53:34

最好的答案是“吸一口,看看”.做一些压力测试,看看什么能给出最好的结果。这是因为线程行为中非常细微的细微差别会导致性能上的差异。

以下主要是基于我自己的经验..。

从哪里开始?

Linux的能力可以防止线程饥饿,这是相当不错的。这并不一定意味着每个线程都会得到一个均分的饼,但所有线程至少会得到一些饼。如果你有两个线程在争夺CPU时间.假设一个尝试使用100% CPU,另一个尝试使用10%.那么,如果这一比例分别为91%和9%,或者在此附近,那就不要感到惊讶了。

如果某个特定资源的订阅量过大,总体性能就会下降。对于旋转硬盘上的磁盘IO尤其如此。头部必须在磁盘上的位置之间进行物理移动(查找),而不同文件之间的持续振荡会导致明显的慢下来。但是,如果一个线程受到严重的IO绑定,而另一个线程希望执行少量IO,则这种效果通常是相当小的。

这两件事加在一起,往往意味着超额20%往往比低于20%好。换句话说,不要将CPU时间留给那些不想使用太多CPU的线程。

如果你有CPU绑定线程和磁盘IO绑定线程,而你有8个核心和1个硬盘,那么就从8个CPU绑定线程和一个硬盘IO绑定线程开始。7和1可能大部分时间只剩下一个核心闲置。8和1几乎肯定不会饿死HD线程,这意味着您充分使用HD和CPU。

短命线程的危险

只是要小心,Linux可能会遇到许多短暂的线程。这一点在蓄意破坏系统的企图中更为明显。但是,不断生成线程/进程可能会使Linux的行为变得糟糕。

在您的问题中,您已经描述了听起来像长寿线程的专用工作线程。这听起来是正确的方法。

伦敦巴士效应

你等半个小时等公共汽车,然后5点马上就来。这是因为乘客上了前面的公共汽车减慢了速度。在后面的公共汽车上,乘客的缺乏加速了他们的速度,造成了一种聚集效应。

在线程处理中也可能存在同样的问题,特别是在线程争夺资源时。如果线程可预测地在任务之间交替,例如从一个磁盘读取然后写入另一个磁盘,那么它们可能会聚集在一起,而不是像您可能预期的那样随机分散。因此,一种资源可能会减缓对另一种资源的使用。因此,有时更好的做法是进一步细分线程的任务。

cgroup

我会避免说太多的细节。但是我要指出的是,Linux有一种叫做“cgroup”的功能,它允许您对进程进行分组,并限制它们的集体资源。这对于进一步的性能调优非常有用。

有一个简短的讨论,他们这里。但我建议你花一点时间在谷歌上,看看他们的全部能力,因为从长远来看,他们可能会帮助你。

票数 3
EN

Unix & Linux用户

发布于 2020-06-05 22:55:23

你可能走错路了。你是在做简单的同步IO吗?

有两种方法:

Apache方法:同步IO,每个连接一个进程,进程池,以避免创建和销毁任务。这很容易编码,允许强大的特性,每秒有许多连接,但同时连接的数量很少。

Nginx方式:异步IO,每个内核一个进程。这使用pole系统调用来等待连接、数据包和磁盘IO。如果使某些功能更难编码(如果需要,必须显式地存储状态),但是它可以有更多的同时连接。

这两种方法都允许操作系统平衡线程,并最大限度地利用内核、磁盘和网络。如果每个内核都使用一个线程,并且使用同步IO,那么大多数情况下,您的内核将处于空闲状态。

查找selectpollepoll系统调用:

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/587930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档