尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Grafana Pyroscope 磁盘存储配置指南:从 head block 写盘到高磁盘利用率保护

Grafana Pyroscope 磁盘存储配置指南:从 head block 写盘到高磁盘利用率保护 Grafana Pyroscope 磁盘存储配置指南从 head block 写盘到高磁盘利用率保护【免费下载链接】pyroscopeContinuous Profiling Platform. Debug performance issues down to a single line of code项目地址: https://gitcode.com/GitHub_Trending/py/pyroscope本指南以 Grafana Pyroscope 的 ingester 组件为核心系统讲解 profiling 数据如何在内存 head block 中暂存、何时落盘、如何组织成按租户与 block 划分的目录结构以及当数据盘接近写满时 Pyroscope 如何自动删除最旧 block 来保护最近数据。读完本文你将掌握pyroscopedb相关 CLI 参数与 YAML 配置项的完整语义并能依据源码定位排查磁盘相关告警。数据写入路径head block 与 block 切分Grafana Pyroscope 中处理写入请求的核心组件是 ingester。收到 profiling 数据后ingester 并不会立即写入磁盘而是先在内存中维护所谓的head block头部块来组织数据。head block 会在以下两种情况下被写入本地持久化磁盘head block 大小超过阈值从源码看pkg/phlaredb/phlaredb.go 的主循环中headSizeCheck定时器每 5 秒检查一次 head 的内存占用一旦超过maxBlockBytes默认取defaultParquetConfig.MaxBlockBytes即以flushReasonMaxBlockBytes为原因触发Flushhead block 超过最大时长当 head block 的存续时间超过-pyroscopedb.max-block-duration默认 1 小时时以flushReasonMaxDuration为原因触发Flush将数据落盘。其中-pyroscopedb.max-block-duration的默认值为1h其含义是“Pyroscope block 的时长上限”Upper limit to the duration of a Pyroscope block。需要留意的是源码中maxBlockDuration()设定了 5 秒的下限即该参数即使配置得比 5 秒更小实际生效值也不会低于 5 秒。落盘后的数据以block为单位组织每个 block 的磁盘布局详见仓库文档 block format。数据目录结构按租户、按 block 组织每个 block 都有一个唯一标识符ULID即 Universally Unique Lexicographically Sortable Identifier存储在 Pyroscope 的数据路径下。数据路径由参数-pyroscopedb.data-path指定默认值为./data对应 YAML 配置data_path。目录组织方式如下./tenant-id每个租户tenant拥有独立的子目录其下包含head/block-id存放当前仍在写入的数据尚未完成的 head blocklocal/block-id存放已经写完并保留在本地的成品 block。从源码可以进一步印证这一约定pkg/phlaredb/phlaredb.go 中LocalDataPath()返回filepath.Join(f.cfg.DataPath, PathLocal)即最终数据路径是data-path下追加local目录而 pkg/ingester/retention.go 中的常量phlareDBLocalPath local同样指向local目录。也就是说一个实际的 block 目录路径形如./data/tenant-id/local/block-id。与对象存储的配合当对象存储已配置时完成写入的 block 会被上传到对象存储的 bucket 中。上传由 shipper 负责上传记录已上传 block 的 ULID 列表保存在本地local目录下的 shipper 元数据文件中——在 pkg/ingester/retention.go 的getUploadedBlockIds实现中可以看到它读取filepath.Join(localDirPath, shipper.MetaFilename)来判定哪些 block 已完成上传。本地磁盘因此同时承担两类角色既作为写入缓冲head block也作为已上传 block 的本地缓存。这也正是磁盘清理策略存在的前提——本地副本可以被安全回收因为远端对象存储中已有数据。高磁盘利用率保护自动删除最旧 block为避免磁盘写满导致最近数据丢失Pyroscope 在检测到数据路径所在卷接近写满时会主动删除最旧的 block。这一机制由 ingester 内的diskCleaner服务实现pkg/ingester/retention.go核心逻辑如下每隔-pyroscopedb.retention-policy-enforcement-interval默认 5 分钟运行一次周期性检查通过diskutil.VolumeChecker判断是否处于“高磁盘利用率”状态pkg/util/disk/disk.go判定为高利用率后扫描所有租户的 block按“先已上传、再按 ULID 时间戳从旧到新”排序blocksByUploadAndAge逐个删除已达到过期条件的 block并在每次删除后重新检查磁盘状态直到磁盘不再处于高利用率状态。高磁盘利用率的触发条件根据 pkg/util/disk/disk.go 的实现HasHighDiskUtilization通过unix.Statfs读取卷的统计信息仅当以下两个条件同时满足时才判定为高磁盘利用率卷的可用空间占比小于-pyroscopedb.retention-policy-min-disk-available-percentage默认0.05即 5%并且可用磁盘空间小于-pyroscopedb.retention-policy-min-free-disk-gb默认10单位 GiB。换句话说两个阈值取“更严格”的关系只要可用空间足够大≥10 GiB或可用占比足够高≥5%都不会触发清理。源码中还特别说明Bavail表示当前用户可访问的空间而 Linux 通常为 root 预留一部分空间因此这里以“可用”而非“全部空闲”为判断依据。清理行为的细节与保护只删除已满足过期条件的 blockisExpired通过 ULID 中编码的时间戳判断block 创建时间早于now - Expiry才可删除Expiry默认值为4h与querier.query-store-after默认一致见 pkg/phlaredb/phlaredb.go 中DefaultRetentionExpiry。删除前会先通过evictBlock将 block 从内存查询路径中卸载再调用文件系统RemoveAll删除目录。若删除某个 block 后可用空间并未下降可能是 VolumeChecker 报告存在延迟清理会暂停到下一个周期避免激进删除见CleanupBlocksWhenHighDiskUtilization中的相关保护逻辑。日志示例触发删除时Pyroscope 会输出类似如下的 WARN 日志原文示例levelwarn callerpyroscopedb.go:231 ts2022-10-05T13:19:09.770693308Z msgdisk utilization is high, deleted oldest block pathdata/anonymous/local/01GDZYHKKKY2ANY6PCJJZGT1N8可以看到日志中的path字段正好对应上文提到的目录结构data/tenant-id/local/block-id。部署中若见到此类日志即说明数据盘正在接近写满需要及时扩容或调整数据保留策略。配置方式CLI 参数与 YAML 配置对照磁盘存储相关配置全部位于pyroscopedb配置块下。以默认值与 YAML 键的完整对照如下详见 reference-configuration-parameters参数注册见 pkg/phlaredb/phlaredb.goCLI 参数YAML 键默认值说明-pyroscopedb.data-pathdata_path./data本地存储目录-pyroscopedb.max-block-durationmax_block_duration1hblock 时长上限超过则强制写盘-pyroscopedb.retention-policy-min-free-disk-gbmin_free_disk_gb10需要保留的最小可用磁盘空间GiB-pyroscopedb.retention-policy-min-disk-available-percentagemin_disk_available_percentage0.05需要保留的最小可用磁盘空间占比-pyroscopedb.retention-policy-enforcement-intervalenforcement_interval5m磁盘保留策略的执行周期-pyroscopedb.retention-policy-disabledisable_enforcementfalse是否禁用磁盘保留策略执行对应的 YAML 配置片段示例pyroscopedb: # Directory used for local storage. data_path: ./data # Upper limit to the duration of a Pyroscope block. max_block_duration: 1h # How much available disk space to keep in GiB. min_free_disk_gb: 10 # Which percentage of free disk space to keep. min_disk_available_percentage: 0.05 # How often to enforce disk retention. enforcement_interval: 5m # Disable retention policy enforcement. disable_enforcement: false配置与运维建议基于上述机制实践中有几点值得注意为数据路径规划独立、充足的存储卷head block 是内存缓冲落盘后的local目录是查询与上传的本地缓存两者叠加会持续增长高磁盘利用率触发的是“删除最旧已上传 block”的保护行为它本质上是应急手段不应作为常规容量管理方式。合理调整阈值如果数据卷较小可适当调低min_free_disk_gb与min_disk_available_percentage反之若希望更早预警可调高阈值让清理更早介入。注意两个条件需同时满足才触发。谨慎使用禁用开关disable_enforcement仅在明确知道风险例如数据卷由外部容量管理系统保障时才建议开启否则一旦磁盘写满最近的数据写入将直接失败。结合对象存储使用配置对象存储后已上传 block 的本地副本可以被安全回收磁盘清理策略也因此可以更积极地执行从而实现“远端保数据、本地保性能”的架构。如需进一步了解 block 在磁盘上的具体文件布局可阅读 block format关于对象存储接入方式见 configure-object-storage-backend。【免费下载链接】pyroscopeContinuous Profiling Platform. Debug performance issues down to a single line of code项目地址: https://gitcode.com/GitHub_Trending/py/pyroscope创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表