- 存储
- 分布式文件系统
- 对象存储
- 后端
- 高可用
【免费下载链接】ceph
Ceph is a distributed object, block, and file storage platform
CephFS 客户端(libcephfs、ceph-fuse、内核客户端)的数百个行为参数均通过 Mon 配置数据库统一管理,其中既有可运行时热更新的选项,也有必须重启挂载进程才生效的启动期选项。本文以仓库文档 doc/cephfs/client-config-ref.rst 为骨架,逐一解读 CephFS 客户端的全部配置项:从ceph config help/set/get三个管理命令的正确用法,到元数据缓存(LRU 中点、inode 上限)、对象缓存(ObjectCacher 脏页水位)、预读、FUSE 挂载参数、POSIX ACL、fscrypt、快照与配额等 30 余项参数的默认值、适用级别与源码层面的生效机制。读完本文,你将能够精准地按需调整 CephFS 客户端性能与行为,并判断某个改动究竟需要立即生效还是重新挂载。
一、CephFS 客户端配置从哪来
CephFS 客户端进程(ceph-fuse、使用 libcephfs 的应用、内核客户端)与 Mon、MDS、OSD 一样,共享同一个配置体系。所有客户端选项的权威定义集中在仓库的 src/common/options/mds-client.yaml.in 中,该 YAML 文件在构建时被转换为 C++ 配置注册表。每个选项都声明了:
type:参数类型(size、bool、int、uint、float、str、secs);level:使用级别(basic/advanced/dev),影响config help等命令的展示与校验;default:默认值;flags:特殊标志,其中runtime表示支持运行时热更新,startup表示仅在进程启动时读取;services:归属服务,客户端选项统一挂在mds_client下。
以client_cache_size为例,其定义为:
- name: client_cache_size type: size level: basic desc: soft maximum number of directory entries in client cache fmt_desc: Set the number of inodes that the client keeps in the metadata cache. default: 16_K services: - mds_client with_legacy: truewith_legacy: true说明该选项同时保留传统ceph.conf文件中的旧式键名(如[client] client cache size = 128M这类带空格的写法),两类写法均可被客户端识别。配置的优先级遵循 Ceph 通用规则:命令行参数 > Mon 配置数据库(按who匹配global/client/ 具体实例)>ceph.conf文件 > 编译期默认值。
二、运行时更新客户端配置:config help / set / get
客户端配置的日常管理在 Mon 侧通过ceph config命令族完成,改动由 Mon 下发给所有相关进程。整个流程围绕三个命令展开。
1. 用config help查询选项是否可热更新
并不是所有选项都能在运行中生效。执行ceph config help可以查看选项的类型、级别、默认值、描述,以及关键信息Can update at runtime:
ceph config help debug_client debug_client - Debug level for client (str, advanced) Default: 0/5 Can update at runtime: true The value takes the form 'N' or 'N/M' where N and M are values between 0 and 99. N is the debug level to log (all values below this are included), and M is the level to gather and buffer in memory. In the event of a crash, the most recent items <= M are dumped to the log file.debug_client的输出还顺带解释了 Ceph 调试日志N/M格式的含义:N是写入日志的调试级别(低于它的都会记录),M是在内存中聚合缓冲的级别(崩溃时最近的小于等于M的日志项会被转储到日志文件)。
2. 用config set立即修改
确认某选项可热更新后,即可直接下发新值:
ceph config set client debug_client 20/20注意config set的who字段。上面的命令把debug_client设置为20/20时作用于所有客户端(匹配client掩码),而不是某个挂载实例。若只想影响特定客户端,可进一步缩小who范围(如具体的主机名或客户端标识)。config set同时支持ceph config set <who> <option> <value>与ceph config set <who> <option> <value> --<other-option>的组合写法。
3. 用config get核对当前生效值
config get展示某who下所有已配置选项及其来源层级与掩码:
ceph config get client WHO MASK LEVEL OPTION VALUE RO client advanced debug_client 20/20 global advanced osd_pool_default_min_size 1 global advanced osd_pool_default_size 3MASK列为空表示该配置来自ceph.conf或命令行等非 Mon 配置数据库来源,RO列标记是否只读。config get也支持查询单个选项(如ceph config get client debug_client)。
4. 源码视角:客户端如何响应热更新
config set下发后,Mon 会把变更通知给客户端。客户端进程内真正消费这些变更的是Client::handle_conf_change(),位于 src/client/Client.cc。该函数针对每个变更键做对应处理,例如:
client_oc_size/client_oc_max_objects/client_oc_max_dirty/client_oc_target_dirty/client_oc_max_dirty_age变更时调用objectcacher->set_max_size()、set_max_objects()、set_max_dirty()、set_target_dirty()、set_max_dirty_age(),直接调节 ObjectCacher 的水位;client_cache_mid变更时调用lru.lru_set_midpoint()调整元数据缓存 LRU 中点;client_acl_type变更时把内部枚举从NO_ACL切换为POSIX_ACL;client_permissions、fuse_default_permissions、client_caps_release_delay、client_mount_timeout等直接更新对应成员变量。
同时,Client::get_tracked_keys()(见 src/client/Client.cc)静态声明了客户端订阅跟踪的键集合,包括client_acl_type、client_cache_mid、client_cache_size、client_caps_release_delay、client_fscrypt_as、client_mount_timeout、client_oc_*系列、client_permissions、client_respect_subvolume_snapshot_visibility、fuse_default_permissions等。凡是出现在该集合中的选项,一旦被config set修改,客户端都会实时响应;未出现在集合中且未带runtime标志的选项,则需要在配置文件中修改后重新挂载。
三、元数据缓存与对象缓存:性能核心参数
CephFS 客户端在本地维护两级缓存:目录项/inode 元数据缓存(LRU)与文件数据对象缓存(ObjectCacher)。相关选项均为client_前缀,绝大多数是advanced级别。
元数据缓存
| 选项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
client_cache_size | size | 16_K | 客户端元数据缓存中 inode 的软上限(basic级别)。源码中它直接约束缓存条目总数,见 src/client/Client.cc 的uint64_t max = cct->_conf->client_cache_size; |
client_cache_mid | float | 0.75 | LRU 中点。把最近最少使用列表切成 hot 与 warm 两段,中点比例越小,热区越小、逐出越激进 |
对象缓存(ObjectCacher)
client_oc(默认true)是对象缓存总开关。启用后,以下参数控制缓存规模与回写节奏,全部标记为runtime,均可热更新:
| 选项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
client_oc_size | size | 200_M | 客户端可缓存的数据字节数上限 |
client_oc_max_dirty | size | 100_M | 对象缓存中脏页字节数上限,达到后触发回写 |
client_oc_target_dirty | size | 8_M | 脏数据目标水位,源码注释明确建议“keep this smallish”(保持较小),维持稳定回写节奏 |
client_oc_max_dirty_age | float | 5 | 脏页在缓存中的最大存活秒数,超龄强制回写 |
client_oc_max_objects | int | 1000 | 缓存对象个数上限 |
回写水位在 src/client/Client.cc 中被一次性传给 ObjectCacher 构造;热更新时再通过handle_conf_change()逐项回调(见上文)。调参时建议遵循client_oc_target_dirty < client_oc_max_dirty < client_oc_size的梯度关系,避免回写风暴。
读预读
| 选项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
client_readahead_min | size | 128_K | 单文件预读的最小字节数 |
client_readahead_max_bytes | size | 0 | 预读字节上限,0表示不限制;会被client_readahead_max_periods覆盖 |
client_readahead_max_periods | int | 4 | 按文件布局周期(对象大小 × 条带数)计算的最大预读周期数,优先于client_readahead_max_bytes |
顺序大文件读场景可适当调大预读周期;随机小 IO 场景则应调小以避免预读浪费。
四、挂载行为参数
| 选项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
client_mount_timeout | secs | 5_min | CephFS 挂载超时(秒)。挂载进程等待 MDS 会话建立的时限 |
client_mountpoint | str | / | 默认挂载点目录,等价于ceph-fuse的-r选项;例如挂载子目录可设client_mountpoint = /volumes/_nogroup/mydir |
client_mount_uid | int | -1 | 以指定 UID 身份挂载(-1表示不指定) |
client_mount_gid | int | -1 | 以指定 GID 身份挂载(-1表示不指定) |
client_metadata | str | 空 | 追加到会话元数据的key=value逗号分隔串;除版本、主机名等自动生成的元数据外,可用它打上自定义标记,便于 MDS 侧区分客户端 |
client_reconnect_stale | bool | false | 会话变陈旧(stale)时是否自动重连 |
client_use_random_mds | bool | false | 每个新请求是否随机选择一个活跃 MDS(dev级别),用于在多点元数据负载下的测试场景 |
client_tick_interval | secs | 1 | 能力续约(capability renewal)及其他周期性维护的间隔(dev级别) |
挂载超时、挂载 UID/GID 等选项同时被libcephfs、ceph-fuse以及工具类程序(如 src/tools/cephfs_mirror/Mirror.cc 使用的client_mount_timeout)共用,属于跨进程统一语义。
五、权限、ACL 与 FUSE 交互
CephFS 权限检查可以发生在两个层面:客户端自行执行,或交由 FUSE 内核模块执行。二者通过以下选项联动:
| 选项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
client_permissions | bool | true | 是否启用客户端强制的权限检查(对所有 I/O 操作生效),runtime 可热更新 |
client_acl_type | str | 空 | ACL 类型,当前唯一可选值为"posix_acl"(启用 POSIX ACL),空串表示禁用。仅在fuse_default_permissions = false时生效 |
fuse_default_permissions | bool | false | 是否把default_permissions传给 FUSE。置为false时由ceph-fuse自己做权限检查;与client_acl_type = posix_acl搭配可启用 POSIX ACL(startup 级别,需重新挂载) |
client_check_pool_perm | bool | true | 访问文件布局描述的 inode 数据池/命名空间前是否先确认访问权限 |
POSIX ACL 的启用路径在 src/client/Client.cc 中可见:handle_conf_change()根据client_acl_type == "posix_acl"把内部acl_type从NO_ACL切换为POSIX_ACL。测试用例 src/test/libcephfs/acl.cc 覆盖了 ACL 的设置、读取与权限校验行为,是验证该功能是否符合预期的参考。
注意:
fuse_default_permissions是startup级别,ACL 方案调整后必须重新挂载才能生效;而client_permissions、client_acl_type是运行时项,可在不重启客户端的情况下切换。
其余 FUSE 挂载选项
| 选项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
fuse_max_write | size | 0 | 单次 FUSE 写操作的最大字节数;0表示不修改,沿用 FUSE 默认的 128 KiB |
fuse_disable_pagecache | bool | false | 为true时禁用该ceph-fuse挂载的内核页缓存。多客户端并发读写同一文件时读者可能从页缓存拿到陈旧数据;受 FUSE 限制,该选项无法动态切换 |
fuse_allow_other | bool | true | 挂载时向 FUSE 传递allow_other |
fuse_splice_read/fuse_splice_write/fuse_splice_move | bool | true | 启用 splice 减少用户态/内核态间的内存拷贝 |
fuse_atomic_o_trunc | bool | true | 传递atomic_o_trunc标志 |
fuse_multithreaded | bool | true | 允许 FUSE 库并行处理请求 |
fuse_require_active_mds | bool | true | 挂载时要求存在活跃 MDS |
fuse_syncfs_on_mksnap | bool | true | 创建快照后同步本地所有元数据/文件变更 |
fuse_set_user_groups | bool | true | ceph-fuse是否考虑辅助组(supplementary groups)做权限判定 |
fuse_use_invalidate_cb | bool | true | 使用 FUSE 2.8+ 的 invalidate 回调保持页缓存一致 |
fuse_debug | bool | false | 启用 libfuse 自身的调试输出(no_mon_update+startup) |
fuse_big_writes | bool | true | 兼容项,libfuse 3.0.0 起已废弃big_writes |
六、快照、配额、目录语义与 fscrypt
| 选项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
client_snapdir | str | .snap | 快照访问用的“虚拟”子目录名(并非真实目录),内核/ceph-fuse挂载后通过它浏览快照 |
client_quota_df | bool | true | 对statfs(df)报告根目录配额用量。关闭后df显示集群整体容量 |
client_quota | bool | true | 客户端是否执行quota_bytes/quota_files配额强制(runtime 可热更新) |
client_dirsize_rbytes | bool | true | 把目录的递归字节数(目录及其后代文件中存储的字节总数)写入stat的st_size字段。可能会让rsync等程序困惑(startup 级别) |
client_respect_subvolume_snapshot_visibility | bool | false | 是否尊重每个子卷 snaprealm 中设置的is_snapdir_visible标志,用于控制子卷快照目录可见性(runtime 可热更新) |
client_fscrypt_as | bool | true | 启用 fscrypt 的 locked/unlocked 访问语义(runtime 可热更新) |
client_fscrypt_dummy_encryption | bool | false | 启用 fscrypt 假加密(dummy encryption),用于加密特性开发与测试(dev级别,runtime) |
client_max_inline_size | size | 4_K | 内联数据(inline data)的最大字节数:小于该值的文件数据直接内联进 inode,而非写入 RADOS 数据对象。仅当 MDS map 设置了inline_data标志时适用 |
七、调试、能力释放与杂项
| 选项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
client_caps_release_delay | secs | 5 | 客户端释放不再需要的能力(capability)前的延迟秒数。保留能力一小段时间,避免后续用户空间操作再次向 MDS 申请;延迟过短会放大 MDS 往返 |
client_debug_force_sync_read | bool | false | 为true时客户端绕过本地页缓存,直接从 OSD 读取数据(dev级别),用于验证一致性路径 |
client_shutdown_timeout | secs | 30 | 卸载/关闭 CephFS 的超时时间(runtime) |
client_asio_thread_count | uint | 2 | ASIO 完成回调的线程池大小,最小1 |
client_collect_and_send_global_metrics | bool | false | 是否强制收集并发送全局指标到 MDS。警告:连接旧版本集群时,升级期间可能压垮 MDS 守护进程(runtime) |
client_file_blockdiff_max_concurrent_object_scans | uint | 16 | 同时发送到 RADOS 的listsnaps操作数上限(blockdiff 场景),最小1 |
client_max_retries_on_remount_failure | uint | 5 | 因内核 dcache 失效而连续重挂载失败的次数上限,超过后客户端中止 |
client_die_on_failed_dentry_invalidate | bool | true | 当没有任何 dentry 失效机制可用时杀掉客户端。背景:能力被回收时客户端必须能失效内核 dentry,否则 MDS 缓存无法收缩,可能导致 MDS 故障 |
八、Developer Options:仅供内部使用的调试/注入选项
以下选项属于内部实现细节,文档仅出于完整性而列出(见原文档 doc/cephfs/client-config-ref.rst 的 Developer Options 章节),生产环境不应使用:
| 选项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
client_debug_getattr_caps | bool | false | 是否让客户端校验 MDS 应答中的 wanted capabilities |
client_debug_inject_tick_delay | secs | 0 | 为测试注入的 tick 延迟 |
client_inject_fixed_oldest_tid | bool | false | 为测试模拟特定的客户端 bug(固定 oldest tid) |
client_inject_release_failure | bool | false | 为测试模拟客户端 release 失败 |
client_trace | str | 空 | 客户端操作轨迹(trace)的输出文件 |
同类测试注入选项还包括client_debug_inject_features(startup 级别,注入能力特性位)、client_inject_write_delay_secs(在获取到 Fb 能力引用后为写操作注入延迟,默认0,用于验证并发fsync竞态缺陷)等,均定义于 src/common/options/mds-client.yaml.in 的dev级别段。
九、配置落地方式小结
CephFS 客户端配置有两种落地方式,可按需组合:
- Mon 配置数据库(推荐):
ceph config set <who> <option> <value>即时下发并持久化,适合在线调优;ceph config get核对,ceph config help查元信息。注意who为client时影响全部客户端实例。 ceph.conf文件:写入[client]段(如[client]\n client mountpoint = /volumes/foo),随进程启动加载。适合启动期参数(startup标志)与挂载语义配置。
关键判断规则:查看ceph config help <option>输出的Can update at runtime字段;同时可交叉参考 src/common/options/mds-client.yaml.in 中的flags: runtime标记,以及 src/client/Client.cc 中get_tracked_keys()的键集合——出现在集合内的选项均可被handle_conf_change()实时消费。startup标志(如fuse_default_permissions、client_dirsize_rbytes)的选项修改后必须重新挂载才生效。
十、扩展阅读
- 完整的客户端配置项定义: src/common/options/mds-client.yaml.in
- 客户端运行时热更新实现: src/client/Client.cc(
handle_conf_change)与 src/client/Client.cc(get_tracked_keys) - POSIX ACL 功能测试: src/test/libcephfs/acl.cc
- CephFS 整体运维与挂载指南(含
-r子目录挂载、快照访问等配套用法): doc/cephfs/index.rst、doc/cephfs/mount-using-fuse.rst
- 存储
- 分布式文件系统
- 对象存储
- 后端
- 高可用
【免费下载链接】ceph
Ceph is a distributed object, block, and file storage platform
相关推荐
Elasticsearch客户端(es-client)安装与配置完全指南
Elasticsearch客户端 es client 安装与配置完全指南 项目基础介绍与主要编程语言 项目名称 : Elasticsearch客户端 es cl
数据库客户端开发者工具数据可视化Ark/Velero 客户端配置命令 `ark client config` 完全指南:读写客户端配置文件
Ark/Velero 客户端配置命令 ark client config 完全指南:读写客户端配置文件 ark client config 是 Velero 项
云原生灾备存储后端Bevy热重载完全指南:从零实现运行时配置与资产更新
Bevy热重载完全指南:从零实现运行时配置与资产更新 你是否经历过这样的开发循环:修改游戏参数→重启应用→等待加载→查看效果?这个过程每天浪费开发者数小时。Be
游戏开发图形学
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考