前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >聊聊ZFS中IO框架之基础篇

聊聊ZFS中IO框架之基础篇

作者头像
用户4700054
发布2023-02-26 14:45:31
7450
发布2023-02-26 14:45:31
举报
  • ZFS中的ZIO的流程中最上层是zfs操作入口,zpl是ZFS中的posix层,dmu是zfs中数据转换单元,这个设计和内核的虚拟地址类似,arc是数据缓存层,zioSPA模块中执行数据从缓存到具体的磁盘的IO过程,这个也是zfs中比较复杂的部分
  • ZFS中定义了多种IO类型,每一种IO操作对应zio中的一个或者多个函数。ZIO的类型具体定义在zio_type中.
代码语言:javascript
复制
typedef enum zio_type {
	ZIO_TYPE_NULL = 0,
	ZIO_TYPE_READ,
	ZIO_TYPE_WRITE,
	ZIO_TYPE_FREE,
	ZIO_TYPE_CLAIM,
	ZIO_TYPE_IOCTL,
	ZIO_TYPE_TRIM,
	ZIO_TYPES
} zio_type_t
  • ZFS中定义每种IO类型的实际doing时候的状态,实际的IO过程中最终是调用zio_execute(__zio_execute)开启IO的pipeline
代码语言:javascript
复制
enum zio_stage {
	ZIO_STAGE_OPEN			= 1 << 0,	/* RWFCI */

	ZIO_STAGE_READ_BP_INIT		= 1 << 1,	/* R---- */
	ZIO_STAGE_WRITE_BP_INIT		= 1 << 2,	/* -W--- */
	ZIO_STAGE_FREE_BP_INIT		= 1 << 3,	/* --F-- */
	ZIO_STAGE_ISSUE_ASYNC		= 1 << 4,	/* RWF-- */
	ZIO_STAGE_WRITE_COMPRESS	= 1 << 5,	/* -W--- */

	ZIO_STAGE_ENCRYPT		= 1 << 6,	/* -W--- */
	ZIO_STAGE_CHECKSUM_GENERATE	= 1 << 7,	/* -W--- */

	ZIO_STAGE_NOP_WRITE		= 1 << 8,	/* -W--- */

	ZIO_STAGE_DDT_READ_START	= 1 << 9,	/* R---- */
	ZIO_STAGE_DDT_READ_DONE		= 1 << 10,	/* R---- */
	ZIO_STAGE_DDT_WRITE		= 1 << 11,	/* -W--- */
	ZIO_STAGE_DDT_FREE		= 1 << 12,	/* --F-- */

	ZIO_STAGE_GANG_ASSEMBLE		= 1 << 13,	/* RWFC- */
	ZIO_STAGE_GANG_ISSUE		= 1 << 14,	/* RWFC- */

	ZIO_STAGE_DVA_THROTTLE		= 1 << 15,	/* -W--- */
	ZIO_STAGE_DVA_ALLOCATE		= 1 << 16,	/* -W--- */
	ZIO_STAGE_DVA_FREE		= 1 << 17,	/* --F-- */
	ZIO_STAGE_DVA_CLAIM		= 1 << 18,	/* ---C- */

	ZIO_STAGE_READY			= 1 << 19,	/* RWFCI */

	ZIO_STAGE_VDEV_IO_START		= 1 << 20,	/* RW--I */
	ZIO_STAGE_VDEV_IO_DONE		= 1 << 21,	/* RW--I */
	ZIO_STAGE_VDEV_IO_ASSESS	= 1 << 22,	/* RW--I */

	ZIO_STAGE_CHECKSUM_VERIFY	= 1 << 23,	/* R---- */

	ZIO_STAGE_DONE			= 1 << 24	/* RWFCI */
};
  • 每中IO类型的对应ZIO_TASKQ_ISSUEZIO_TASKQ_ISSUE_HIGHZIO_TASKQ_INTERRUPTZIO_TASKQ_INTERRUPT_HIGH这4个队列,这些队列承载可执行zio的数据,具体定义在
代码语言:javascript
复制
// 每种IO的队列
typedef enum zio_taskq_type {
	ZIO_TASKQ_ISSUE = 0,
	ZIO_TASKQ_ISSUE_HIGH,
	ZIO_TASKQ_INTERRUPT,
	ZIO_TASKQ_INTERRUPT_HIGH,
	ZIO_TASKQ_TYPES
} zio_taskq_type_t;

// 队列的初始化
spa_create_zio_taskqs(spa_t *spa)
{
	for (int t = 0; t < ZIO_TYPES; t++) {
		for (int q = 0; q < ZIO_TASKQ_TYPES; q++) {
			spa_taskqs_init(spa, t, q);
		}
	}
}
  • ZFS中的IO Pipeline,每种类型的IO按照自己的流程执行Pipeline的函数.读请求和写请求的执行的Pipeline完全不同。
代码语言:javascript
复制
static zio_pipe_stage_t *zio_pipeline[] = {
	NULL,
	zio_read_bp_init,
	zio_write_bp_init,
	zio_free_bp_init,
	zio_issue_async,
	zio_write_compress,
	zio_encrypt,
	zio_checksum_generate,
	zio_nop_write,
	zio_ddt_read_start,
	zio_ddt_read_done,
	zio_ddt_write,
	zio_ddt_free,
	zio_gang_assemble,
	zio_gang_issue,
	zio_dva_throttle,
	zio_dva_allocate,
	zio_dva_free,
	zio_dva_claim,
	zio_ready,
	zio_vdev_io_start,
	zio_vdev_io_done,
	zio_vdev_io_assess,
	zio_checksum_verify,
	zio_done
};
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-11-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 存储内核技术交流 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档