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


前面已经说明一个线程的有效时间占比为:(T1+T2)/(T1+T2+T3),那么所有线程池中的线程总的有效时间占比计算方式如下:
所有线程的总有效时间TT1 = ( 线程池中工作线程1的有效时间T1+T2) + (线程池中工作线程2的有效时间T1+T2) + ..... + (线程池中工作线程n的有效时间T1+T2)
所有线程总运行时间TT2 = ( 线程池中工作线程1的有效时间T1+T2+T3) + (线程池中工作线程2的有效时间T1+T2+T3) + ..... + (线程池中工作线程n的有效时间T1+T2+T3)
线程池中所有线程的总有效工作时间占比 = TT1/TT2
控制线程如何动态增加线程池中线程数
在启动初始化的时候,会创建一个线程名为”-”的控制线程,该线程主要工作就是判断线程池中是否有充足的工作线程来处理asio 库中全局队列中的task任务,如果发现线程池比较忙,没有足够的线程来处理队列中的任务,则在线程池中动态增加线程来避免task任务在队列上排队等待 。
1. control控制线程循环主体主要压力判断控制流程如下:2. while {3.#等待工作线程唤醒条件变量,最长等待stuckThreadTimeout4.(stuckThreadTimeout)5.......6.#获取线程池中所有线程最近一次运行任务的总有效时间TT17.Executing = _getThreadTimerTotal(ThreadTimer::Executing);8.#获取线程池中所有线程最近一次运行任务的总运行时间TT29.Running = _getThreadTimerTotal(ThreadTimer::Running);10.#线程池中所有线程的总有效工作时间占比 = TT1/TT211.utilizationPct = Executing / Running;12.......13.#代表control线程太久没有进行线程池压力检查了14.if(本次循环到该行代码的时间 > stuckThreadTimeout阀值) {15.#说明太久没做压力检查,造成工作线程不够用了16.if(_threadsInUse == _threadsRunning) {17.#批量创建一批工作线程18.for(; i < reservedThreads; i++)19.#创建工作线程20._startWorkerThread();21.}22.#control线程继续下一次循环压力检查23.continue;24.}25.......26.#如果当前线程池中总线程数小于最小线程数配置27.#则创建一批线程,保证最少工作线程数达到要求28.if (threadsRunning < reservedThreads) {29.while (_threadsRunning < reservedThreads) {30._startWorkerThread();31.}32.}33.......34.#检查上一次循环到本次循环这段时间范围内线程池中线程的工作压力35.#如果压力不大,则说明无需增加工作线程数,则继续下一次循环36.if (utilizationPct < idlePctThreshold) {37.continue;38.}39.......40.#如果发现已经有线程创建起来了,但是这些线程还没有运行任务41.#这说明当前可用线程数可能足够了,我们休息sleep_for会儿在判断一下42.#该循环最多持续stuckThreadTimeout时间43.do {44.stdx::this_thread::sleep_for();45.} while ((() > 0) &&46.(() < stuckThreadTimeout)47.48.#如果tasksQueued队列中的任务数大于工作线程数,说明任务在排队了49.#该扩容线程池中线程了50.if (_isStarved()) {51._startWorkerThread();52.}53. }
l实时tats 线程模型统计信息
本文分析的 版本为.1,其网络线程模型相关统计通过().可以查看,如下图所示:
上图的几个信息功能可以分类为三大类,说明如下:
上表中各个字段的都有各自的意义,我们需要注意这些参数的以下情况:
1. -的差值越大说明线程池中线程比较空闲,差值越小说明压力越大
2. 越大,表示线程池越空闲
3. -的差值越大说明任务队列上等待执行的任务越多,说明任务积压现象越明显
4. 越大说明工作线程比较空闲,在等待客户端数据到来
5.os - cros 差值越大说明越空闲
上面三个大类中的总体反映趋势都是一样的,任何一个差值越大就说明越空闲 。
在后续 最新版本中,去掉了部分重复统计的字段,同时也增加了以下字段,如下图所示: