ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Linux dm-vdo(Virtual Data Optimizer)深入指南:块级去重、压缩与精简配置的实现、参数与运维全解

Linux dm-vdo(Virtual Data Optimizer)深入指南:块级去重、压缩与精简配置的实现、参数与运维全解 Linux dm-vdoVirtual Data Optimizer深入指南块级去重、压缩与精简配置的实现、参数与运维全解【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux本文以 Linux 内核仓库中的Documentation/admin-guide/device-mapper/vdo.rst为主体完整讲解 dm-vdo 设备映射目标device mapper target的定位、格式化与只读恢复机制、table line 全参数说明、热修改规则、消息接口、状态输出、内存占用模型与调优方法并结合drivers/md/dm-vdo/内核驱动源码印证其实现结构。读完本文你应能独立完成一个 vdo 卷的创建、扩容、参数调整与故障恢复并理解各配置项在内核中的实际作用。dm-vdo 是什么dm-vdovirtual data optimizer虚拟数据优化器是一个设备映射目标为存储栈提供**块级去重block-level deduplication、压缩compression与精简配置thin provisioning**三项能力。作为 dm 目标它可以在任意文件系统之下透明地叠加这些特性与具体文件系统解耦。文档明确给出两点边界vdo 目标不提供数据损坏防护no protection against data corruption它依赖其下层存储的完整性integrity保护来保证数据可信官方强烈建议使用 LVM 来管理 vdo 卷参见lvmvdo(7)手册页。vdo 的完整设计去重索引 UDS、slab 数据池、块映射、恢复日志、写路径 13 步流程、崩溃恢复与只读重建在同目录的 vdo 设计文档中有专门阐述本文的源码佐证部分会以该文档为背景。用户态工具链格式化与只读恢复vdo 卷的格式化必须使用用户态工具vdoformat位于 dm-vdo 官方用户态代码仓库。此外还有两类关键工具vdoforcerebuild用于让处于只读模式的 vdo 卷退出只读状态元数据检查工具用于检查 vdo 目标的磁盘元数据除 dm-vdo 开发者外很少需要。崩溃恢复语义这是运维 vdo 必须理解的机制多数情况下vdo 目标在下一次启动时会自动从崩溃中恢复若遇到不可恢复错误正常运行中或崩溃恢复过程中目标会进入只读模式read-only mode或以只读模式启动由于只读模式意味着可能存在数据丢失必须执行显式动作才能将其带回可写状态运行vdoforcerebuild后vdo 目标下次启动时会重建rebuild其元数据重建后可能会有部分数据丢失但重建出的元数据在内部是自洽的目标将重新可写。这一语义与内核驱动中repair逻辑相对应——从源码结构看drivers/md/dm-vdo/ 目录下存在repair.c、admin-state.c、status-codes.c等文件分别对应修复流程、卷状态机normal / recovering / read-only与状态码定义vdo 设计文档在 “Read-only Rebuild” 一节进一步说明只读重建时引用计数不从 slab 日志重建而是清零整个块映射后依据块映射重新推导从而保证块映射与引用计数互相一致。元数据空间要求每个 vdo 卷至少预留 3GB 空间存放元数据具体大小还取决于其配置。规划容量时必须确认去重与压缩节省的空间不会被元数据开销抵消。官方提供了vdoestimator估算工具位于独立的 vdoestimator 仓库可以对特定数据集计算可节省空间的估计值。结合 vdo 设计文档的数据该目标可实现最高 254:1 的去重比一个 4K 块最多被 254 个逻辑副本共享、14:1 的压缩比全零块完全不占存储去重索引默认可容纳 6400 万条记录、对应约 256GB 的去重窗口deduplication window。因此对可压缩/可去重率低的裸数据vdo 的净收益可能为负务必先估算。Table line 格式与必选参数通过dmsetup加载 vdo 目标时表行table line格式为offset logical device size vdo V4 storage device storage device size minimum I/O size block map cache size block map era length [optional arguments]其中V4为当前元数据格式版本。必选参数说明如下参数说明offsetvdo 卷逻辑空间起始处的偏移量以扇区sector计logical device sizevdo 卷将要服务的设备大小以扇区计。必须与 vdo 卷当前的逻辑大小一致storage device存放该 vdo 卷数据与元数据的底层设备storage device size存放 vdo 卷的设备大小以4096 字节块数计。必须与 vdo 卷当前大小一致minimum I/O sizevdo 卷接受的最小 I/O 大小以字节计。合法值只有512 或 4096推荐 4096block map cache size块映射缓存大小以 4096 字节块数计。最小且推荐值为32768 块若 logical 线程数非零缓存大小必须至少为每 logical 线程 4096 块block map era length块映射缓存把已修改的块映射页写出的速度。较小的 era length 倾向于缩短重建rebuild时间代价是正常运行时块映射写增多。最大且推荐值为16380最小值为1可选参数线程与杂项可选参数以key value对的形式出现在表行末尾。线程类参数vdo 将不同类别的工作分派给不同的线程组各组线程数可独立配置。约束规则若hash、logical、physical全为 0则三类工作由单一线程处理若其中任一非零则三者都必须非零。参数说明ack用于完成completebio 的线程数。由于完成 bio 会调用 vdo 卷之外的任意完成函数此类线程让 vdo 在 bio 完成缓慢时仍可持续处理请求。默认 1bio用于向下层存储提交issuebio 的线程数。此类线程让 vdo 在 bio 提交缓慢时仍可持续处理请求。默认 4bioRotationInterval每个 bio 线程切换到下一个线程前向其入队的 bio 数量。取值必须大于 0 且不超过 1024默认 64cpu用于 CPU 密集型工作如哈希与压缩的线程数。默认 1hash用于基于数据块哈希值进行数据比对去重管理的线程数。默认 0logical用于基于传入 bio 逻辑地址管理缓存与锁的线程数。默认 0最大 60physical用于管理底层存储设备的线程数。格式化时选定 slab 大小vdo 存储设备必须足够大至少每个 physical 线程有 1 个 slab。默认 0最大 16这些线程类别与内核驱动的源码文件一一对应从源码结构看io-submitter.c 对应 bio 提交线程、completion.c 对应 ack 完成线程、logical-zone.c 与 physical-zone.c 分别管理逻辑/物理分区dedupe.c 及 indexer/ 子目录承载哈希比对与去重索引UDS。每个分区zone绑定一个工作队列见 funnel-workqueue.c工作队列隐式持有该分区数据结构的“锁”这正是 vdo 近乎无锁并发的实现基础详见 vdo 设计文档的 “Zones and Threading”。杂项参数maxDiscard接受的最大 discard bio 大小以 4096 字节块计。对 vdo 卷的 I/O 请求通常被拆分为 4096 字节块处理一次最多处理 2048 个块但 discard 请求可被自动合并拆分为单个 bio 中最多maxDiscard个 4096 字节块且同时进行的 discard 请求上限为 1500。增大该值可能提升整体性能代价是单个 discard 请求延迟升高。默认值与最小值为1最大值为UINT_MAX / 4096。deduplication是否启用去重。默认on可接受on/off。compression是否启用压缩。默认off可接受on/off。运行中修改设备热修改一张修改后的表可以加载到运行中、未挂起的 vdo 卷上修改将在设备下次 resume 时生效。可修改的参数为logical device size、physical device size、maxDiscard、compression、deduplication。容量修改的约束逻辑大小或物理大小变化成功后vdo 会持久化新值并在之后的每次启动时要求一致这两个参数只增不减逻辑大小不得超过4 PB物理大小若增长每次至少增加32832 个 4096 字节块且不得超过底层存储设备大小格式化时选定的 slab 大小决定了物理大小上限物理大小永远不能增长到提供超过8192 个 slab的规模且每次增长必须至少新增 1 个 slab。完整操作示例继承自官方文档1. 启动一个已格式化的 vdo 卷1GB 逻辑空间 1GB 物理空间存于有超过 1GB 空间的 /dev/dm-1dmsetup create vdo0 --table \ 0 2097152 vdo V4 /dev/dm-1 262144 4096 32768 163802. 将逻辑大小扩到 4GBdmsetup reload vdo0 --table \ 0 8388608 vdo V4 /dev/dm-1 262144 4096 32768 16380 dmsetup resume vdo03. 将物理大小扩到 2GBdmsetup reload vdo0 --table \ 0 8388608 vdo V4 /dev/dm-1 524288 4096 32768 16380 dmsetup resume vdo04. 物理大小再增 1GB并同时调大 maxDiscarddmsetup reload vdo0 --table \ 0 10485760 vdo V4 /dev/dm-1 786432 4096 32768 16380 maxDiscard 8 dmsetup resume vdo05. 停止 vdo 卷dmsetup remove vdo06. 再次启动 vdo 卷。注意逻辑与物理设备大小必须与之前保持一致但其他参数可以改变dmsetup create vdo1 --table \ 0 10485760 vdo V4 /dev/dm-1 786432 512 65550 5000 hash 1 logical 3 physical 2这条示例同时展示了最小 I/O 改为 512、块映射缓存改为 65550 块、era length 改为 5000、以及启用hash 1 logical 3 physical 2三线程组配置的完整组合写法。消息接口Messages所有 vdo 设备接受如下形式的消息dmsetup message target-name 0 message-name message-parameters消息说明stats输出 vdo 统计信息当前视图主要供用户态vdostats程序解析输出缓冲区config输出有用的 vdo 配置信息主要供希望重建一个相似 VDO 卷的用户了解当初的创建配置dump将多个内部结构转储到系统日志。并非总是安全的只应用于调试挂死的 vdodump-on-shutdown下次 vdo 关闭时执行一次默认 dumpdump消息的可选参数指定要转储的结构取值含义viopool传入 bio 所在的 I/O 请求池poolsviopool的同义词vdo管理磁盘数据的大部分结构queues每个 vdo 线程的基本信息threadsqueues的同义词default等价于queues vdoall以上全部内核侧的消息分发在 dm-vdo-target.c 中实现dump消息的处理自第 1153 行起分派到各结构stats与config消息分别在第 1201、1204 行按argc 1的精确匹配处理统计消息的实际格式化由 message-stats.c 承担。Status 状态输出vdo 的状态行格式为device operating mode in recovery index state compression state physical blocks used total physical blocks字段取值与含义devicevdo 卷名称operating mode当前运行模式normal正常、recovering检测到元数据问题并正在尝试修复、read-only发生错误仅支持读操作、拒绝写in recovery是否正处于恢复模式recovering或-未在恢复index state去重索引当前状态closed、closing、error、offline、online、opening、unknowncompression state压缩当前状态offline或onlineused physical blocksvdo 卷正在使用的物理块数量total physical blocksvdo 卷可用的物理块总量该值与 used 值之差即卷写满前的剩余块数内存需求模型vdo 目标的内存由固定部分与随规模扩展的部分组成固定 38 MBRAM另加以下随目标规模线性扩展的部分块映射缓存每配置 1 MB 需1.15 MBRAM块映射缓存的内存需求最低约 150 MB逻辑空间每 1 TB 需1.6 MBRAM卷管理的物理存储每 1 TB 需268 MBRAM。去重索引另需随去重窗口大小扩展的内存稠密dense索引每 1 TB 窗口需1 GBRAM稀疏sparse索引每 10 TB 窗口需1 GBRAM。索引配置在格式化format时设定之后不可修改。这与 vdo 设计文档中的说明一致默认索引约 256GB 去重窗口可通过增大索引内存窗口等比放大、存储与内存同步翻倍或启用稀疏索引窗口扩大 10 倍、存储扩大 10 倍、内存不变可检出标准索引 97%–99% 的去重量两种方式扩展去重窗口且都只能在创建时确定。模块参数vdo 驱动提供一个数值型模块参数log_level控制驱动日志的详略程度默认值为6LOGLEVEL_INFO及更严重的消息。源码印证dm-vdo-target.c 第 3056–3057 行注册该参数module_param_named(log_level, vdo_log_level, uint, 0644); MODULE_PARM_DESC(log_level, Log level for log messages);logger.c 第 19 行定义全局变量int vdo_log_level VDO_LOG_DEFAULT;与文档所述默认级别对应。运行行为vdo 与其他存储目标的关键差异使用 dm-vdo 时必须了解其行为与其他存储目标的不同之处覆写已有块不保证成功。由于底层存储可能被多重引用multiply referenced覆写一个已有块通常要求 vdo 有一个空闲块可用copy-on-write 语义discard 是回收空间的途径但不保证回收。块不再使用时对相应块发送 discard 请求可让 vdo 释放对这些块的引用对精简配置的 vdo 而言discard 未用块是防止目标耗尽空间的必要操作。但由于重复块共享对某个逻辑块的 discard 不保证能回收空间崩溃韧性依赖下层 flush 实现。假设底层存储正确实现了 flush 请求vdo 对崩溃是韧性resilient的但崩溃后未 flush 的写可能持久化、也可能没有每次写都伴随大量处理但高度可并行。vdo 在高 I/O 深度下获得更好的吞吐可并行支持最多 2048 个请求——这与 vdo 设计文档所述“固定 2048 个 data_vio 池”一致data-vio.c 管理的 data_vio 池大小即为 2048既限制了崩溃恢复所需的回溯工作量也是并发上限的来源。调优实践vdo 的选项很多缺乏对负载的完整了解很难做出最优选择。且多数配置选项必须在目标启动时设定不能在不彻底关闭目标的情况下更改——目标处于活动状态时无法变更配置。理想做法是在生产部署前用模拟负载做调优。1. 块映射缓存大小最重要的调整项为服务任意逻辑地址的请求vdo 必须加载持有相关映射的块映射部分这些映射被缓存当工作集装不进缓存时性能受损。默认情况下vdo 分配128 MB 元数据缓存内存足以高效访问同一时刻 100 GB的逻辑空间更大的工作集应按比例放大。2. logical 与 physical 线程数logical 线程各控制块映射的一段不相交区域增加 logical 线程可提高并行度与吞吐physical 线程各控制数据块的一段不相交区域同理可提升吞吐。但线程过多会浪费资源并增加争用。注意表行参数约束logical 线程非零时块映射缓存必须至少每线程 4096 块。3. bio 提交线程数bio 提交线程控制发送 I/O 到下层存储的并行度线程越少I/O 请求重排优化性能的机会越大但每个请求提交前的等待时间也越长线程越多则相反。默认 4可用bioRotationInterval默认 64范围 1–1024控制各 bio 线程间的轮转粒度。4. bio 确认ack线程用于结束 I/O 请求。之所以放在专用线程是因为执行 bio 回调所需的工作量是 vdo 自身无法控制的。通常 1 个线程足够但当 bio 的回调 CPU 开销较重时增加线程可能有益。5. CPU 线程用于哈希与压缩在启用压缩的负载下更多 CPU 线程可能带来更高吞吐。6. hash 线程用于按哈希对活动请求排序并判定是否应去重其最耗 CPU 的动作是比对 4096 字节数据块。多数情况下 1 个 hash 线程足够。内核驱动源码结构印证内核侧实现位于 drivers/md/dm-vdo/Kconfig 与 Makefile 控制构建。从源码结构看各核心文件与文档所述功能的对应关系如下文档概念源码文件表行解析、消息分发、log_level模块参数、状态输出dm-vdo-target.c块映射block map与缓存block-map.cslab 数据池slab-depot.c恢复日志recovery-journal.c压缩打包packerpacker.c去重与 UDS 索引dedupe.c、indexer/data_vio / vio I/O 对象池data-vio.c、vio.c逻辑/物理线程分区logical-zone.c、physical-zone.c崩溃修复rebuildrepair.c统计消息message-stats.c日志级别logger.c此外该目录下的 murmurhash3.c 表明数据块哈希采用的是非加密的 MurmurHash3这正对应 vdo 设计文档中“因未使用加密哈希理论上可构造恶意哈希冲突负载故 vdo 将索引位置视为提示hint并在共享前读取验证数据”的设计说明。小结dm-vdo 通过“去重索引 引用计数块映射 slab 数据池 恢复日志”的组合在块设备上实现了去重、压缩与精简配置。本文继承的vdo.rst给出了完整的运维契约table line 的 7 个必选参数与 10 个可选参数、只增不减的扩容规则、5 个可热修改参数、4 类消息、状态行 7 个字段、内存公式与log_level模块参数而drivers/md/dm-vdo/源码则印证了这些行为在内核中的落点。实际部署时的三条硬纪律格式化前先估算元数据与索引内存开销、精简配置卷必须配合文件系统 discard、只读模式必须显式vdoforcerebuild后才能恢复写入。【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表