可见,如果osd_op_tp线程池的请求缓存队列中连续两个请求操作的对象属于相同的pg,则一个osd_op_tp线程出队前一个请求加入pg slot队列后,获取pg lock,从pg slot队列首部出队一个请求开始处理。另一个osd_op_tp线程从请求缓存队列出队第二个请求,因为两个请求是对应相同的pg,则它会加入相同的pg slot队列,然后,...
如上,可以看到tp_osd_tp线程竟然有持续的io写入。这一点很奇怪,因为该线程是osd层线程,在我的理解里面,只有store层才会有io写入。 所以开始分析osd层io代码,最终找到了io写入的地方,如下: 从代码可以看出,如果达到限流了,那么便会调用deferred_try_submit函数:而deferred_try_submit函数最终会向磁盘提交io。 int ...
5.FileStore::op_tp线程池从FileStore::op_wq中拿出操作(此处的OP_WQ继承了父类ThreadPool::WorkQueue重写了_process和_process_finish等函数,所以不同于OSD::op_wq,它有自己的工作流程),首先调用FileStore::_do_op,完成后调用FileStore::_finish_op。 6. FileStore::op_finisher.finisher_thread线程从FileStore:...
放入op_wq里,FileStore::op_tp线程池就会从op_wq中取出进行操作,在FileStore::OpWQ::_process去进行写到本地缓存的操作(FileStore::_write),并且在完成后FileStore::OpWQ::_process_finish中处理,类似的也是放到一个finisher_queue里(op_finisher),然后finisher的线程调用C_OSD_OnOpApplied的回调函数(ReplicatedBack...
//启动osd的peering线程池 osd_tp.start(); ...//消费osdmap,或者说使用osdmap,具体见下面分析 consume_map(); ...// 设置osd状态为STATE_BOOTING,OSD启动过程中共有STATE_INITIALIZING(默认值)、STATE_BOOTING、STATE_ACTIVE这几个状态阶段 set_state(STATE_BOOTING); // 准备启动OSD,具体见下面分析 ...
1.4.2 recovery_tp:处理修复任务 1.4.3 disk_tp: 处理磁盘密集型任务 1.4.4 command_tp: 处理命令 1.5 主要对象: ObjectStore *store; OSDSuperblock superblock; 主要是版本号等信息 OSDMapRef osdmap; 1.6 主要操作流程:参考文章 1.6.1 客户端发起请求过程 ...
1.4.3 disk_tp: 处理磁盘密集型任务 1.4.4 command_tp: 处理命令 1.5 主要对象: ObjectStore *store; OSDSuperblock superblock; 主要是版本号等信息 OSDMapRef osdmap; 1.6 主要操作流程:参考文章 1.6.1 客户端发起请求过程 1.6.2 op_tp线程处理数据读取 ...
osd_tp.start(); // 启动osd的peering线程池 ... consume_map(); // 消费osdmap,或者说使用osdmap,具体见下面分析 ... set_state(STATE_BOOTING); // 设置osd状态为STATE_BOOTING,OSD启动过程中共有STATE_INITIALIZING(默认值)、STATE_BOOTING、STATE_ACTIVE这几个状态阶段 start_boot...
OSD 在负载情况下的时间曲线显示,在 io_submit 阶段花费了大量时间,这就是我们通常看到的内核 因驱动器队列已满而开始阻塞的情况。 tp_osd_tp 线程 io_submit Wallclock 配置文件示例 +31.00%BlueStore::readv(boost::intrusive_ptr &,g...+31.00%BlueStore::_do_readv(BlueStore::Collection*,boost::intrusive...
进一步分析发现,尽管op_before_dequeue_op_lat耗时长,但实际io瓶颈可能隐藏在osd进程的tp_osd_tp线程持续写入io。在代码深度分析中,发现deferred_write的限流问题可能导致io延迟。通过调整限流参数,虽然解决了io线程的问题,但延时转移到了state_kv_commiting_lat阶段。优化的关键在于将io回复动作移到kv_...