线程池中创建多少线程合适

通俗一点,如何让你的系统处理更快,(降低延迟,提高吞吐量)。

对应方法进本两个方向,一个算法,另一个将硬件性能发挥极致。 提升性能就是,提升硬件的利用率。

也就是提升i/o的利用率和cpu的利用率。

你线程池的创建线程条数直接影响你系统的性能。

 

思考问题一,分工产生效能 

在单核cpu时代,假如你用多线程的话,主要就是用来平衡cpu和I/O设备,如果你的程序只设计cpu计算,没有I/O操作的话,多线程不但不会提升性能,还会是性能变的更差,原因就是线程的切换成本。

我给你举个例子,你公司就你一个员工,老板让你一会写代码,一会打扫卫生,还顺带着帮老板拿个快递。

这样会造成什么,切换成本。马克思说分工产生效能就是这么理解的。

在多核cpu时代,即使只进行cpu计算, 多线程也可以提高性能了,就好比一个公司来了四个员工(四核cpu),这样可以分别拿快递,打扫卫生,写代码等工作了。

 

那么创建多少条线程合适?

这里先要理解你的系统是cpu密集型(大部分都是纯cpu计算),还是I/O密集型(大部分都是I/O操作),因为cpu执行时间显然要比I/O操作要快。

cpu密集型:这里没啥好说的,因为本质就是cpu计算,线程数等于cpu核数,为什么呢你想,你公司现在4个员工,这四个员工都有自己工作,2个员工写代码,一个拿快递,一个打扫卫生,这样各干个的,你非要让那个打扫卫生的员工给你去买烟,这样就造成了这个员工的切换成本了(4核cpu开了5条线程)。也就是说你创建线程月多,切换成本越大。

注意:这里我只是比喻一下,为了你好理解,正常工程上,创建的线程数=cpu核数+1,为了就是偶尔的内存页失效,或者阻塞时候,这个额外的线程可以顶上,从而保证cpu的利用率(比如做保洁的员工在给你买烟的路上出了啥问题。其他的员工可以顶上,目的就是为了让你顺利的抽上烟)。

I/O密集型的计算场景,I/O操作耗时和cpu耗时比值非常关键,但是这个比值是动态的具体可以借助一些工具测试。

计算公式为  最佳线程数 =cpu 核数*(1+(I/O耗时/cpu耗时))。 可以理解为 一个线程执行完I/O操作之后,(I/O耗时/cpu耗时)个线程完成了各自的cpu计算 ,这样cpu利用率达到100%(纯理论上的)

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章