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

网络传输层模块源码实现四 关于作者
前滴滴出行技术专家,现任OPPO 文档数据库负责人,负责oppo千万级峰值TPS/十万亿级数据量文档数据库内核研发及运维工作,一直专注于分布式缓存、高性能服务端、数据库、中间件等相关研发 。后续持续分享《内核源码设计、性能优化、最佳运维实践》,账号地址:
《内核源码实现、性能调优、最佳运维实践系列》文章有前后逻辑关系,请阅读本篇文章前,提前阅读如下模块:
网络传输层模块源码实现一
网络传输层模块源码实现二
网络传输层模块源码实现三
1.说明
本文分析网络传输层模块中的最后一个子模块: 服务运行子模块,即线程模型子模块 。在阅读该文章前,请提前阅读下、 、,这样有助于快速理解本文分享的线程模型子模块 。
线程模型设计在数据库性能指标中起着非常重要的作用,因此本文将重点分析 服务层线程模型设计,体验如何通过优秀的工作线程模型来达到多种业务场景下的性能极致表现 。该模块主要代码实现文件如下:
线程模型子模块,在代码实现中,把线程模型分为两种:线程模式和线程模型,这两种线程模型中用于任务调度运行的线程统称为工作线程 。启动的时候通过配置参数net.来确定采用那种线程模式运行mongo 实例,配置方式如下:
1. //synchronous同步线程模式配置,一个链接已给线程2. net:3.serviceExecutor: synchronous4.5. //动态线程池模式配置6. net:7.serviceExecutor: adaptive
2. 同步线程模型(一个链接已给线程)设计原理及核心代码实现
同步线程模型也就是每接收到一个链接,就创建一个线程专门负责该链接对应所有的客户端请求,也就是该链接的所有访问至始至终由同一个线程负责处理 。
核心代码实现原理
该线程模型核心代码实现由 类负责,该类注意成员变量和重要接口如下:
1. //同步线程模型对应ServiceExecutorSynchronous类2. class ServiceExecutorSynchronous final : public ServiceExecutor {3. public:4.//ServiceExecutorSynchronous初始化5.explicit ServiceExecutorSynchronous(ServiceContext* ctx);6.//获取系统CPU个数7.Status start() override;8.//shutdown处理9.Status shutdown(Milliseconds timeout) override;10.//线程管理及任务入队处理11.Status schedule(Task task, ScheduleFlags flags) override;12.//同步线程模型对应mode13.Mode transportMode() const override {14.return Mode::kSynchronous;15.}16.//获取该模型统计信息17.void appendStats(BSONObjBuilder* bob) const override;18.19. private:20.//私有线程队列21.static thread_local std::deque _localWorkQueue;22.//递归深度23.static thread_local int _localRecursionDepth;24.//空闲线程数,例如某个链接当前没有请求,则该线程阻塞在读操作上面等待数据读到来25.static thread_local int64_t _localThreadIdleCounter;26.//shutdown的时候设置为false,链接没关闭前一直为true27.AtomicBool _stillRunning{false};28.//当前conn线程数,参考ServiceExecutorSynchronous::schedul29.AtomicWord _numRunningWorkerThreads{0};30.//cpu个数31.size_t _numHardwareCores{0};32. };
类核心成员变量及其功能说明如下:
每个链接对应的线程都有三个私有成员,分别是:线程队列、递归深度、idle 频度,这三个线程私有成员的作用如下:
1) :线程私有队列,task任务入队及出队执行都是通过该队列完成
2) :任务递归深度控制,避免堆栈溢出
3)ter :当线程运行多少次任务后,需要短暂的休息一会儿,默认运行0xf次task任务就调用()一次
同步线程模型子模块最核心的代码实现如下: