int n=10的sizeof 为什么是四_mongodb内核源码实现、性能调优( 九 )


新版本增加的几个统计项实际上和.1 大同小异,只是把状态机任务按照不通类型进行了更加详细的统计 。新版本中,更重要的一个功能就是线程在发现线程池压力过大的时候创建新线程的触发情况也进行了统计,这样我们就可以更加直观的查看动态创建的线程是因为什么原因创建的 。
- 早期版本线程动态调整动态增加线程缺陷1例
从步骤6 中可以看出,控制线程创建工作线程的第一个条件为:如果该线程超过阀值都没有做线程压力控制检查,并且线程池中线程数全部在处理任务队列中的任务,这种情况线程一次性会创建个线程 。由配置,如果没有配置,则采用初始值CPU/2 。
那么问题来了,如果我提前通过命令行配置了这个值,并且这个值配置的非常大,例如一百万,这里岂不是要创建一百万个线程,这样会造成操作系统负载升高,更容易引起耗尽系统pid 信息,这会引起严重的系统级问题 。
不过,不用担心,最新版本的 代码,内核代码已经做了限制,这种情况下创建的线程数变为了1,也就是这种情况只创建一个线程 。
3.3线程模型实时参数调优
动态线程模设计的时候,设计者考虑到了不通应用场景的情况,因此在核心关键点增加了实时在线参数调整设置,主要包含如下7种参数,如下表所示:
命令行实时参数调整方法如下,以 为例,其他参数调整方法类似:( { : 1, : xx} )
服务层的动态线程模型设计代码实现非常优秀,有很多实现细节针对不同应用场景做了极致优化 。
不同线程模型性能多场景PK
详见:
3.5 Asio 网络库全局队列锁优化,性能进一步提升
通过一文中的ASIO 库实现和动态线程模型实现,可以看出为了获取全局任务队列上的任务,需要进行全局锁竞争,这实际上是整个线程池从队列获取任务运行最大的一个瓶颈 。
优化思路:我们可以通过优化队列和锁来提升整体性能,当前的队列只有一个,我们可以把单个队列调整为多个队列,每个队列一把锁,任务入队的时候通过把链接 散列到多个队列,通过该优化,锁竞争及排队将会得到极大的改善 。
优化前队列架构:
优化后队列架构:
如上图,把一个全局队列拆分为多个队列,任务入队的时候把 按照hash散列到各自的队列,工作线程获取任务的时候,同理通过hash的方式去对应的队列获取任务,通过这种方式减少锁竞争,同时提升整体性能 。
【int n=10的sizeof 为什么是四_mongodb内核源码实现、性能调优】由于篇幅原因,本文只分析了主要核心接口源码实现,更多接口的源码实现可以参考如下地址,详见:动态线程模型源码详细分析