原因: osd很坑的一点是,读以及omap-get是在osd-tp线程,所以如果读慢了,会造成请求积压,这点从上面osd的history dump耗时可以进一步证明,上面osd的queued_for_pg到reached_pg这个阶段耗时比较多。 优化 观察该朋友线上环境,元数据池子每个副本域只有一个osd。其实这种部署方式是比较通用的,因为文件系统元数据池子里面...
77.37% tp_osd_tp [kernel.kallsyms] [k] native_queued_spin_lock_slowpath | ---native_queued_spin_lock_slowpath | --77.36%--_raw_spin_lock_irqsave | |--61.10%--alloc_iova | alloc_iova_fast | iommu_dma_alloc_iova.isra.0 | iommu_dma_map_sg | __dma_map_sg_attrs | dma_map_sg...
77.37% tp_osd_tp [kernel.kallsyms] [k]native_queued_spin_lock_slowpath---native_queued_spin_lock_slowpath--77.36%--_raw_spin_lock_irqsave|--61.10%--alloc_iova| alloc_iova_fast| iommu_dma_alloc_iova.isra.0| iommu_dma_map_sg| __dma_map_sg_attrs| dma_map_sg_attrs| nvme_map_data...
osd_op_threads:对应的work queue有peering_wq(osd peering请求),recovery_gen_wq(PG recovery请求); osd_disk_threads:对应的work queue为 remove_wq(PG remove请求); osd_op_num_shards和osd_op_num_threads_per_shard:对应的thread pool为osd_op_tp,work queue为op_shardedwq; 处理的请求包括: OpRequestR...
进一步分析发现,尽管op_before_dequeue_op_lat耗时长,但实际io瓶颈可能隐藏在osd进程的tp_osd_tp线程持续写入io。在代码深度分析中,发现deferred_write的限流问题可能导致io延迟。通过调整限流参数,虽然解决了io线程的问题,但延时转移到了state_kv_commiting_lat阶段。优化的关键在于将io回复动作移到kv_...
Ceph的osd处理客户端请求的线程池为osd_op_tp,在处理操作请求的时候,线程会先锁住操作对应pg的lock。其中,处理对象读请求的代码如下图所示,在锁住对象所属pg的lock后,对于最常用的多副本存储方式,线程会同步进行读操作,直到给客户端发送返回的数据后,才会释放pg lock。
写的逻辑流程图如图:从图中我们可以看到写操作分为以下 几步:1.OSD:op_tp 线程从 OSD:op_wq 中拿出来操作如本文开始 的图上描述,具体代码流是 ReplicatePG:apply_repop 中 创建回调类 C_OSD_OpCommit 和 C_OSD_OpAppliedFileStore:queue_transactions 中创建了回调类 C_JournaledAhead2. FileJournal:write_...
1.4.4 command_tp: 处理命令 1.5 主要对象: ObjectStore *store; OSDSuperblock superblock; 主要是版本号等信息 OSDMapRef osdmap; 1.6 主要操作流程:参考文章 1.6.1 客户端发起请求过程 1.6.2 op_tp线程处理数据读取 1.6.3 对象操作的处理过程 1.6.4 修改操作的处理 ...
线程池 有 4 种 OSD 线程池: 1. 2. 3. 4. op_tp: 处理 ops 和 sub ops recovery_tp:处理修复任务 disk_tp: 处理磁盘密集型任务 command_tp: 处理命令 OpWQ: 处理 ops(从客户端)和 sub ops(从其他的 OSD)。运行在 op_tp 线程池。 PeeringWQ: 处理 peering 任务,运行在 op_tp 线程池。
_DispatchThread::entry()|_DispatchQue::entry|_qitem.get_code:true|_qitem.get_code:false|_Messenger::ms_deliver_dispatch|_Dispatcher::ms_dispatch2|_OSD::ms_dispatch|_OSD::_dispatch|_case...|_case MSG_COMMAND:|_OSD::command_wq.queue()// 扔进了command_wq, 根据command_tp构造显示就一个...