线程个数到底怎么设置?

线程个数到底怎么设置?,第1张

其实大部分人会说这个问题,傻子才问,实验一下不就知道了。是的实验一下就知道了,但是并不是每个人都愿意动手的。世界上还一种人不傻,但是懒。哥也是其中一员。

之前一直没闹懂cpu核数和线程数的关系什么,我一直以为2核8线程是指:两个物理上的核同时可以处理8个线程。( 这里的同时是绝对意义上的同步处理。 )但是我搜了一下,貌似并不是,之前理解完全错误。

参考:https://zhidao.baidu.com/question/564747175879215284.html

           https://www.cnblogs.com/hitwhhw09/p/4718404.html

最近做个http请求。有点大 几千万次。给我的机器是2核40线程。所以我想啊40线程可以同时处理40个线程,按照网上说的设置2-3倍,让他跑吧。然后我设置了80个,跑了一两天。崩了!带我的那个人更牛逼,直接设置3w个线程。然后觉得慢,就说你去做个试验看看,线程设置多少合适。然后实现数据如下:

connectionTimeOut指http请求超时设置,soTimeOut指等待返回时间超时。我们场景是希望请求获得有效返回。

从试验数据上看,单纯从处理速度,不管suc的话,设置在机器线程数量的10倍左右合适。如果从成功结果上看(抛开超时设置)越接近物理核数设置,请求成功率越高。

具体原因因为大概可以猜到,但是抱着严谨精神,我就不说了(我没查,但是学过计算机组成原理和 *** 作系统,所以大概理解)。希望大家自己去查吧。

尽然数据贴出来了,就结合着数据找点经验吧。抛开 http因素。多核多线程情况下 线程数 设置 为线程数的10倍左右处理速度应该最快。

http请求照顾到成功率情况,request超时设置大点更为合理,根据http 响应服务器来定,我们这个应该2-4s直接合理,response超时设置500足够。线程数量应设置在50-240之间,具体大小应该计算或者再细测获得。

曾经别人我问网络层是多线程吗?

答案是肯定的,但是具体怎么说呢?

1.正常来说,请求的发起是在主线程,等待网络回调的是在子线程。

2.session会话时可以设置operation队列,我们可以设置队列的最大并发数是1,那样会保证回调顺序正确,保证数据正确。

3.设置了最大并发数是1,可以避免网络层开辟多条线程,这样可以减少资源的消耗。

实现方法进程与指定cpu绑定

:SetProcessAffinityMask(GetCurrentProcess(),dwMask)

线程与指定cpu绑定:

SetThreadAffinityMask(GetCurrentThread(),dwMask)dwMask为CPU序号的或运算值:1(0001)

代表只运行在CPU1,2(0010)代表只运行在CPU2,3(0011)代表可以运行在CPU1和CPU2

,以此类推。

设置之前最好判断一下系统有几个CPU:

SYSTEM_INFOSystemInfo

GetSystemInfo(&SystemInfo)CPU个数:SystemInfo.dwNumberOfProcessors

当前启用的CPU序号:

SystemInfo.dwActiveProcessorMask

,Mask representing the set of processors configured into the system. Bit 0 is processor 0

bit 31 is processor 31.

CPU亲缘性介绍

按照默认设置,当系统将线程分配给处理器时,Windows使用软亲缘性来进行 *** 作。这意味着如果所有其他因素相同的话,它将设法在它上次运行的那个处理器上运行线程。让线程留在单个处理器上,有助于重复使用仍然在处理器的内存高速缓存中的数据。

有一种新的计算机结构,称为NUMA(非统一内存访问),在该结构中,计算机包含若干块插件板,每个插 件板上有4个CPU和它自己的内存区。

当CPU访问的内存是它自己的插件板上的内存时,NUMA系统运行的性能最好。如果CPU需要访问位于另一个插件板上的内 存时,就会产生巨大的性能降低。在这样的环境中,就需要限制来自一个进程中的线程在共享同一个插件版的CPU上运行。

为了适应这种计算机结构的需要,Windows允许你设置进程和线程的亲缘性。换句话说,你可以控制哪个CPU能够运行某些线程。这称为硬亲缘性。请注意,子进程可以继承进程的亲缘性。

注意:(1)无论计算机中实际拥有多少个CPU,Windows98及以前系统只使用一个CPU,上述API不被支持。

(2)在大多数环境中,改变线程的亲缘性就会影响调度程序有效地在 各个CPU之间移植线程的能力,而这种能力可以最有效地使用CPU时间。

应用场景举例:

将UI线程限制在一个CPU,将其他实时性要求较高的线程限制在另一个CPU。这样,当UI需要占用大量CPU时间时,就不会拖累其他实时性要求较高的线程的执行

。同样可以将UI线程与一些优先级不高但耗时的异步运算线程设置在不同CPU上,避免UI给人卡顿的感觉。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/6875720.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-29
下一篇 2023-03-29

发表评论

登录后才能评论

评论列表(0条)

保存