一个简单的例子。我正在运行一个使用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进入一个较慢的节流模式(我忘记了它的名字,但我听说如果太多的芯片一次激活,它就会发生)。如果我必须加载和资源平衡我的线程,我将如何做到这一点?
发布于 2020-06-02 23:07:46
Linux内核有一个很好的实现,并且有许多特性/设置来管理运行过程的资源(通过CPU调控器、sysctl或cgroup),在这种情况下,建议调优这些设置以及交换调整(如果需要的话),基本上您将调整默认的功能模式以适应您的设备。
基准测试、压力测试和应用更改后的情况分析是必须的,特别是在生产服务器上。当内核设置调整到所需的使用时,性能增益可能是非常重要的,另一方面,这需要测试和很好地理解管理程序所需的不同设置。
Linux确实使用州长在运行的应用程序之间负载CPU资源,许多调控器是可用的;取决于发行版的内核,某些调控器可能不可用(可以重新构建内核以添加缺失或非上游调控器)。您可以检查现任州长是什么?、改变它,更重要的是,在本例中,可以检查调整其设置。
附加文档:阅读、指南、相似问题、频率标度、总督的选择、性能调控器和cpufreq。
西斯克尔是一个在运行时检查和更改内核参数的工具,可以使用配置文件/etc/sysctl.conf进行永久调整,这是这个答案的一个重要部分,因为可以用Sysctl更改许多内核设置,可以使用命令sysctl -a显示可用设置的完整列表,在这和这篇文章上可以获得详细信息。
内核提供了一个特性:控件组,它们在本指南中以较短的名称cgroup来调用。Cgroup允许您在运行于系统上的用户定义的任务组(进程)之间分配资源,如CPU时间、系统内存、网络带宽或这些资源的组合。您可以监视配置的cgroup,拒绝cgroup对某些资源的访问,甚至可以在运行中的系统上动态地重新配置cgroup。可以将cgconfig (Cgconfig)服务配置为在启动时启动并重新建立预定义的cgroup,从而使它们在重新启动时持久存在。
资料来源,进一步阅读和问题在这件事上。
如果系统有有限数量的ram,这可能很有用,否则您可以禁用交换以主要使用ram。交换系统可以通过每一过程或互换设置进行调整。如果需要,可以用超极限限制每个进程的重新源(ram) (也用于限制其他资源)。
发布于 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点马上就来。这是因为乘客上了前面的公共汽车减慢了速度。在后面的公共汽车上,乘客的缺乏加速了他们的速度,造成了一种聚集效应。
在线程处理中也可能存在同样的问题,特别是在线程争夺资源时。如果线程可预测地在任务之间交替,例如从一个磁盘读取然后写入另一个磁盘,那么它们可能会聚集在一起,而不是像您可能预期的那样随机分散。因此,一种资源可能会减缓对另一种资源的使用。因此,有时更好的做法是进一步细分线程的任务。
我会避免说太多的细节。但是我要指出的是,Linux有一种叫做“cgroup”的功能,它允许您对进程进行分组,并限制它们的集体资源。这对于进一步的性能调优非常有用。
有一个简短的讨论,他们这里。但我建议你花一点时间在谷歌上,看看他们的全部能力,因为从长远来看,他们可能会帮助你。
发布于 2020-06-05 22:55:23
你可能走错路了。你是在做简单的同步IO吗?
有两种方法:
Apache方法:同步IO,每个连接一个进程,进程池,以避免创建和销毁任务。这很容易编码,允许强大的特性,每秒有许多连接,但同时连接的数量很少。
Nginx方式:异步IO,每个内核一个进程。这使用pole系统调用来等待连接、数据包和磁盘IO。如果使某些功能更难编码(如果需要,必须显式地存储状态),但是它可以有更多的同时连接。
这两种方法都允许操作系统平衡线程,并最大限度地利用内核、磁盘和网络。如果每个内核都使用一个线程,并且使用同步IO,那么大多数情况下,您的内核将处于空闲状态。
查找select、poll和epoll系统调用:
https://unix.stackexchange.com/questions/587930
复制相似问题