Ceph BlueStore io机制

文章目录

    • Introduction
    • AioContext
    • Write Type
      • Simple Write
      • Deferred Write
      • Simple Write + Deferred Write
    • Write Process
      • OSD::osd_op_tp
      • BlockDevice::aio_thread
      • BlueStore::kv_sync_thread
      • BlueStore::kv_finalize_thread
    • Deferred IO Order
    • Summary

Introduction

在介绍了BlockDevice,BlueFS,FreelistManager和Allocator后,接下来重点分析BlueStore的实现。BlueStore继承于ObjectStore,它需要实现mkfs/mount/umount等初始化和退出时的操作,同时它也提供对象操作的基本接口,比如read/write,以及对象属性attr和omap相关的操作。虽然代码量巨大,但是除了写操作以外,其他只是代码繁琐,但是不难理解,所以将更多精力花在写操作的流程上,以及和写性能相关的各种监控指标上。对于写操作的请求,怎么从内存的object extent映射到磁盘的地址空间,可以参考网上的这篇文章。这里以simple write表示新写/对齐写(cow)等不需要wal的场景,以deferred write表示需要写wal的场景(rmw)。
首先从宏观上了解一下BlueStore的整体架构(借用Ceph作者的图):
Ceph BlueStore io机制_第1张图片
因为主要还是用KernelDevice,所以仍然以KernelDevice作为介绍,BlueStore涉及到的线程如下:
•OSD::osd_op_tp: 通过libaio的方式,提交io请求给KernelDevice
•KernelDevice::aio_thread: 执行libaio完成后的回调
•BlueStore::kv_sync_thread: 同步kv数据,包括对象的meta信息和磁盘空间使用信息,以及wal日志的清理
•BlueStore::kv_finalize_thread: 完成时回调的处理以及其他清理工作。wal情况生成dbh以及提交io请求
•BlueStore::deferred_finisher: 通过libaio的方式,提交deferred io的请求
•BlueStore::finishers: finisher线程的sharding,用来回调通知用户请求完成

AioContext

写设备都是通过libaio,首先需要了解回调函数的执行流程。AioContext派生了两种context,TransContext和DeferredBatch,前者对应simple write,简称为txc,后者对应deferred write,简称为dbh。创建块设备的时候,会设置好回调函数,由块设备的aio thread线程执行回调:

struct AioContext {
	virtual void aio_finish(BlueStore *store) = 0;
	virtual ~AioContext() {}
};

struct TransContext : public AioContext {
	......
	void aio_finish(BlueStore *store) override {
		store->txc_aio_finish(this); // txc的回调
	}
}

struct DeferredBatch : public AioContext {
	......
	void aio_finish(BlueStore *store) override {
		store->_deferred_aio_finish(osr); // dbh的回调
	}
}

回调函数在创建设备的时候,会提前设置好:

int BlueStore::_open_bdev(bool create)
{
	assert(bdev == NULL);
	string p = path + "/block";
	bdev = BlockDevice::create(cct, p, aio_cb, static_cast(this)); // 传入回调函数
	......
}

static void aio_cb(void *priv, void *priv2)
{
	BlueStore *store = static_cast(priv);
	BlueStore::AioCon

你可能感兴趣的:(ceph核心理论)