tp_osd_tp 线程 io_submit Wallclock 配置文件示例 + 31.00% BlueStore::readv(boost::intrusive_ptr<ObjectStore::CollectionImpl>&, g... + 31.00% BlueStore::_do_readv(BlueStore::Collection*, boost::intrusive_ptr<Blu... + 24.00% KernelDevice::aio_submit(IOContext*) |+ 24.00% aio_queue_t::...
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...
如上,可以看到tp_osd_tp线程竟然有持续的io写入。这一点很奇怪,因为该线程是osd层线程,在我的理解里面,只有store层才会有io写入。 所以开始分析osd层io代码,最终找到了io写入的地方,如下: 从代码可以看出,如果达到限流了,那么便会调用deferred_try_submit函数:而deferred_try_submit函数最终会向磁盘提交io。 int ...
//启动osd的peering线程池 osd_tp.start(); ...//消费osdmap,或者说使用osdmap,具体见下面分析 consume_map(); ...// 设置osd状态为STATE_BOOTING,OSD启动过程中共有STATE_INITIALIZING(默认值)、STATE_BOOTING、STATE_ACTIVE这几个状态阶段 set_state(STATE_BOOTING); // 准备启动OSD,具体见下面分析 ...
Ceph的osd处理客户端请求的线程池为osd_op_tp,在处理操作请求的时候,线程会先锁住操作对应pg的lock。其中,处理对象读请求的代码如下图所示,在锁住对象所属pg的lock后,对于最常用的多副本存储方式,线程会同步进行读操作,直到给客户端发送返回的数据后,才会释放pg lock。
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_pool_default_size = 3 默认值 3 osd_pool_default_min_size = 1 默认值 0 // 0 means no specific default; ceph will use size-size/2 这两个是创建ceph pool的时候的默认size参数,一般配置为3和1,3副本能足够保证数据的可靠性; 4,认证配置参数 ...
case CEPH_OSD_OP_WRITE: ++ctx->num_write; { ……//写操作只是做准备工作,并不实际的写 } …… } } FileStore::read函数是底层具体的实现,会通过调用系统函数如::open,::pread,::close等函数来完成具体的操作。 [cpp]view plaincopy int FileStore::read( ...
进一步分析发现,尽管op_before_dequeue_op_lat耗时长,但实际io瓶颈可能隐藏在osd进程的tp_osd_tp线程持续写入io。在代码深度分析中,发现deferred_write的限流问题可能导致io延迟。通过调整限流参数,虽然解决了io线程的问题,但延时转移到了state_kv_commiting_lat阶段。优化的关键在于将io回复动作移到kv_...
void OSD::handle_op(OpRequestRef op) { …… enqueue_op(pg,op); } osd->op_tp线程从队列中拿出消息开始工作(op_tp线程是在OSD::init时创建,线程具体的工作在OSD::OpWQ::_process中)。 之后会调用到ReplicatePG::do_request,此函数根据不同的消息会选择不同的操作方案,关于操作主要有这三个: ...