- 主题:有没高效率的线程池实现?
得有附加的开销吧?
确实有些项目要求限制CPU的使用率。
简单的办法是,在多核系统中,线程数少于核数即可。
【 在 ziqin 的大作中提到: 】
: asio目录里有一个priority strand的例子,可以基于那个改。
: 至于限定cpu占用,这个很难把,没有系统函数,如果只是绑定cpu,可以在生成thread的时候绑定。
:
--
FROM 221.218.62.*
尤其是在有超线程的时候,把线程数定义为实核数,这样,看起来CPU使用率很低,实际已经用满了。
这办法我用过。
例如,8核16线程,你就设置8线程,CPU利用率看起来就在50%以下,实际性能可以达到100%。
【 在 ylh1969 的大作中提到: 】
: 得有附加的开销吧?
: 确实有些项目要求限制CPU的使用率。
: 简单的办法是,在多核系统中,线程数少于核数即可。
--
修改:ylh1969 FROM 221.218.62.*
FROM 221.218.62.*
【 在 freecutelei 的大作中提到: 】
: 用户态的限制cpu使用,没啥好的方式啊。还得用户自己估算一下计算复杂度,然后谨慎coding
6楼的方法不行吗?
--
FROM 221.218.60.*
6楼的办法省事,不需要特别的操作。控制比较粗糙,但是基本可以满足需求。
我遇到的一个项目,计算密集型,对速度要求很高,同时又要求CPU不超过75%。(原因是,当CPU达到100%后,系统无法监控,不响应其他管理命令。)
就是用6楼方法,看起来是50%,实际上是100%。充分利用了所有的核。同时对系统监控管理不受影响。
我这个任务,虽然CPU占的多,但是优先级低,不影响那些优先级高的小任务的运行。
当没有别的任务时,CPU都是我的。
【 在 z16166 的大作中提到: 】
: 各自需求不同。
: 我只需要保证比如我的产品最多占用80%,给别人的产品留20%。
: 至于我的产品里哪个进程/线程占得多,内卷吧,自己优化去。
: ...................
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*
你说的我有点听不懂。
我的测试是8核16超线程。
放8个线程,性能是单线程的8倍,CPU50%。放16线程性能还是8倍,CPU100%。如果需要75%,放12个线程,性能还是8。
计算密集型任务,线程间没有互相干扰。
当线程间互相干扰时,超线程或许在性能上有用。
我的实验,超线程仅提供空闲的CPU。
【 在 hgoldfish 的大作中提到: 】
: 这个应该是因为你用的是古代的牙膏厂 CPU,现代的 CPU,比如农企最新的 ryzen 5700g 这样的 CPU,它的计算核心提供两个译码器,开启超线程以后能够提升 20%-40%,你这样用是很浪费的。
: 顺便说一下,很多人喷牙膏厂的小核,但其实吧,不管是农企还是牙膏厂的大核,被分裂成两个超线程使用的时候,性能都还不如小核呢。
: 不过为啥我不喷农企呢,因为农企直接给 16 个大核,比牙膏厂给 8 个大核,16 个小核良心多了。
: ...................
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*
不是程序问题。
【 在 hgoldfish 的大作中提到: 】
: 我说这是十年前的情况。现在 CPU 已经改进,不太可能还是这样的情况。
: 如果被限制到 8 倍。那就需要考虑是不是自己程序写的有问题了。
:
--
FROM 221.218.60.*
这个你还管得了人家用了多少if!
我的测试就是用了一个实际有用的实例,500个节点的有向圖K短路径计算。哪里管得了人家用了多少if!
能够在8核环境得到8倍性能,说明调度器效率很高,性能没问题。
【 在 ziqin 的大作中提到: 】
: 建议读一下超线程的原理
: 超线程增不增效,和线程之间是不是相互通讯或者共享内存没有关系,和机器码的能不能乱序执行有关系,是更底层的东西
: 一个例子就是,如果很多if()这样的branch prediction的代码,超线程用处就不大
: ...................
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*
减少线程数就可以有效减少CPU占用。
除非是单核系统,真没辙了。
其实你要是写出个能把CPU用到100%程序,还真不是个容易的事。总会有IO的。
我是在调度器设法解决IO期间线程空闲的问题。
【 在 z16166 的大作中提到: 】
: 客户端需求,哈哈
: 不能把客户端的机器的cpu占高了,不然被投诉
: 但其实这个在技术上未必有用,因为有的人对占用50%介意,有的人对5%~10%的占用也会感到不满。
: ...................
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*
我说的是,性能占了100%。
这是既能满足客户要求的CPU占用,又能充分发挥系统性能的好方法。早已经在生产项目中得到应用。
至于真使用16线程,到底性能是8还是8.5我没有精确统计过。你说的那些因素也就这么点影响。
【 在 ziqin 的大作中提到: 】
: 同鸡讲鸭
: 8核16超线程,你占8核就显示50%,实际占用100%这个理解是错的
:
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*
如果是计算密集型,高效率的线程池就是高CPU占用率呀。
不能在调度中或者应用中安排空转,那不是效率就不高了吗?
既要又要的话,就找到这一种方法。
如果是IO密集型,就不存在CPU占用的问题。
【 在 z16166 的大作中提到: 】
: 客户端需求,哈哈
: 不能把客户端的机器的cpu占高了,不然被投诉
: 但其实这个在技术上未必有用,因为有的人对占用50%介意,有的人对5%~10%的占用也会感到不满。
: ...................
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*