Telegraf Lustre2 输入插件实战指南:采集 Lustre 并行文件系统的 OST/MDS 运行指标
2026/9/14 7:10:38 网站建设 项目流程

Telegraf Lustre2 输入插件实战指南:采集 Lustre 并行文件系统的 OST/MDS 运行指标

【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegraf

Lustre 是面向 HPC(高性能计算)环境的开源并行文件系统,其运行状态与性能统计信息以文本形式记录在proc/sys文件系统中。Telegraf 的lustre2输入插件(插件源码)专门在 OST、MDS 等 Lustre 服务节点上读取这些统计文件,将其转换为标准 Telegraf 指标。读完本文,你将掌握lustre2插件的完整配置方法、全部指标字段的语义与来源文件,以及基于源码理解其底层解析逻辑,从而在 HPC 集群监控中直接落地使用。

插件概览与适用场景

lustre2插件通过读取 Lustre 暴露在proc/sys伪文件系统中的统计条目来采集指标,报告的字段与官方 Lustre Monitoring and Statistics Guide 对应。它并不报告 Lustre 提供的全部信息,而是聚焦于一组精选的、可运维的指标子集。

该插件具备以下特征(见 README.md):

  • 版本起点:自 Telegraf v0.1.5 起提供;
  • 分类标签:属于system类输入插件;
  • 平台支持仅支持 Linux(💻 linux)。

从源码结构看(lustre2_notlinux.go),非 Linux 平台编译时插件依然会被注册,但Gather直接返回空,并在Init时输出"Current platform is not supported"警告;真正的采集逻辑全部位于带//go:build linux标签的 lustre2.go 中。

配置详解

lustre2插件在配置上非常灵活:Lustre 各版本的proc/sys文件布局会变化,插件特意允许用户通过三个数组参数自定义要扫描的路径(glob 模式),实现“面向未来”的兼容设计。

完整配置示例

以下为插件的默认配置(来源:sample.conf,同时被 README 通过@sample.conf指令内嵌):

# Read metrics from local Lustre service on OST, MDS # This plugin ONLY supports Linux [[inputs.lustre2]] ## An array of /proc globs to search for Lustre stats ## If not specified, the default will work on Lustre 2.12.x ## # mgs_procfiles = [ # "/sys/fs/lustre/mgs/*/eviction_count", # ] # ost_procfiles = [ # "/proc/fs/lustre/obdfilter/*/stats", # "/proc/fs/lustre/osd-ldiskfs/*/stats", # "/proc/fs/lustre/obdfilter/*/job_stats", # "/proc/fs/lustre/obdfilter/*/exports/*/stats", # "/proc/fs/lustre/osd-ldiskfs/*/brw_stats", # "/proc/fs/lustre/osd-zfs/*/brw_stats", # "/sys/fs/lustre/odbfilter/*/eviction_count", # ] # mds_procfiles = [ # "/proc/fs/lustre/mdt/*/md_stats", # "/proc/fs/lustre/mdt/*/job_stats", # "/proc/fs/lustre/mdt/*/exports/*/stats", # "/proc/fs/lustre/osd-ldiskfs/*/brw_stats", # "/proc/fs/lustre/osd-zfs/*/brw_stats", # "/sys/fs/lustre/mdt/*/eviction_count", # ]

三个核心配置参数

参数类型默认值(Lustre 2.12.x)作用
mgs_procfiles[]string/sys/fs/lustre/mgs/*/eviction_count管理服务(MGS)侧统计文件 glob,当前仅支持以eviction_count结尾的路径
ost_procfiles[]string见下方说明对象存储目标(OST)侧统计文件 glob 数组
mds_procfiles[]string见下方说明元数据目标(MDT)侧统计文件 glob 数组

OST 默认扫描文件(对应源码 lustre2.go#L64-L79):

  • /proc/fs/lustre/obdfilter/*/stats—— 读写字节数与调用次数;
  • /proc/fs/lustre/osd-ldiskfs/*/stats—— 缓存命中/未命中计数器(ldiskfs 后端);
  • /proc/fs/lustre/obdfilter/*/job_stats—— 按作业 ID 统计的 I/O;
  • /proc/fs/lustre/osd-ldiskfs/*/brw_stats—— 批量读写分布(ldiskfs);
  • /proc/fs/lustre/osd-zfs/*/brw_stats—— 批量读写分布(ZFS);
  • /sys/fs/lustre/obdfilter/*/eviction_count—— 驱逐计数。

MDT 默认扫描文件(lustre2.go#L81-L90):

  • /proc/fs/lustre/mdt/*/md_stats—— 元数据操作统计;
  • /proc/fs/lustre/mdt/*/job_stats—— 元数据目标作业统计;
  • /sys/fs/lustre/mdt/*/eviction_count—— 驱逐计数。

从源码看,三个参数的默认值仅在各自数组长度为 0 时才会被填充(if len(l.MgsProcfiles) == 0等判断),因此你完全可以只覆盖其中一个数组、保留其他默认值,例如只自定义ost_procfiles以适配 Lustre 新版本布局。

文件类型与处理分派

在 Gather 方法 中,插件根据文件路径的后缀自动分派解析器,这一点对自定义配置非常关键:

路径后缀分派解析函数说明
brw_statsgetLustreProcBrwStats批量读写分布直方图
job_statsgetLustreProcStats(jobstats 字段表)按 jobid 聚合的统计
eviction_countgetLustreEvictionCount驱逐计数(MGS/MDT/OST 通用)
其他(如statsmd_statsgetLustreProcStats(普通字段表)常规计数器

值得注意的是,mgs_procfiles数组中的条目如果不以eviction_count结尾,插件会直接返回错误no handler found for mgs procfile pattern ...(lustre2.go#L92-L100)——即 MGS 目录下目前只支持驱逐计数这一种文件。

指标说明(Metrics)

lustre2插件输出的测量名统一为lustre2,通过不同的 tags 与 fields 区分数据来源。以下内容完整继承自 README.md 的 Metrics 章节,并结合源码补充了字段提取细节。

健康状态(health)

来源文件:/sys/fs/lustre/health_check(若不存在则回退到旧的/proc/fs/lustre/health_check,参见 getLustreHealth)。

  • tags:无
  • fields:
    • health:文件内容为healthy时值为1,否则为0(源码将字符串与"healthy"精确比较后转为 uint64)

OST 常规统计

来源文件:/proc/fs/lustre/obdfilter/*/stats/proc/fs/lustre/osd-ldiskfs/*/stats

  • tags:
    • name:OST 目标名(取自路径倒数第二段,如OST0001
  • fields:
    • write_bytes
    • write_calls
    • read_bytes
    • read_calls
    • cache_hit(samples 值,为向后兼容保留)
    • cache_hit_samples
    • cache_hit_pages
    • cache_miss(samples 值,为向后兼容保留)
    • cache_miss_samples
    • cache_miss_pages
    • cache_access(samples 值,为向后兼容保留)
    • cache_access_samples
    • cache_access_pages

字段提取原理:以read_bytes 203238095 samples [bytes] 4096 1048576 78026117632000这类行为例,wantedOstFields(lustre2.go#L469-L526)通过mapping结构指定行首关键字与取第几列(field字段):read_bytes/write_bytes的调用次数取第 1 列、字节数取第 6 列;cache_*的 samples 默认取第 1 列、pages 取第 6 列。测试用例 TestCacheStatsReportSamplesAndPages 验证了这些字段会同时以“原始名(samples 值)+_samples+_pages”三种形态上报。

OST 客户端(exports)统计

来源文件:/proc/fs/lustre/obdfilter/*/exports/*/stats(按客户端 NID 细分)。

  • tags:
    • name:OST 目标名
    • client:客户端 NID
  • fields:
    • write_bytes
    • write_calls
    • read_bytes
    • read_calls

路径解析细节getLustreProcStats中,对包含/exports/的路径,目标名取倒数第 4 段、客户端 NID 取倒数第 2 段(lustre2.go#L220-L239)。例如测试目录中的/proc/fs/lustre/obdfilter/OST0001/exports/10.2.4.27@o2ib1/stats会生成name=OST0001, client=10.2.4.27@o2ib1的指标。

OST 作业统计(job_stats)

来源文件:/proc/fs/lustre/obdfilter/*/job_stats

  • tags:
    • name:OST 目标名
    • jobid:作业 ID(Lustre jobid)
  • fields:
    • jobstats_ost_getattr
    • jobstats_ost_setattr
    • jobstats_ost_sync
    • jobstats_punch
    • jobstats_destroy
    • jobstats_create
    • jobstats_ost_statfs
    • jobstats_get_info
    • jobstats_set_info
    • jobstats_quotactl
    • jobstats_read_bytes
    • jobstats_read_calls
    • jobstats_read_max_size
    • jobstats_read_min_size
    • jobstats_write_bytes
    • jobstats_write_calls
    • jobstats_write_max_size
    • jobstats_write_min_size

解析要点job_stats文件以- job_id: <jobid>分段,插件按"- "拆分段落、读取job_id行生成jobidtag(lustre2.go#L250-L259)。同时,wantedOstJobstatsFields同时支持旧格式(read/write行)与新格式(read_bytes/write_bytes行)两种 inProc 关键字,字段分别取第 3/7/9/11 列对应 calls、min、max、bytes。

MDT 元数据统计

来源文件:/proc/fs/lustre/mdt/*/md_stats

  • tags:
    • name:MDT 目标名
  • fields:
    • open
    • close
    • mknod
    • link
    • unlink
    • mkdir
    • rmdir
    • rename
    • getattr
    • setattr
    • getxattr
    • setxattr
    • statfs
    • sync
    • samedir_rename
    • crossdir_rename

MDT 客户端(exports)统计

来源文件:/proc/fs/lustre/mdt/*/exports/*/stats

  • tags:
    • name:MDT 目标名
    • client:客户端 NID
  • fields:与上节 MDT 常规统计完全相同(openclosemknodlinkunlinkmkdirrmdirrenamegetattrsetattrgetxattrsetxattrstatfssyncsamedir_renamecrossdir_rename

MDT 作业统计(job_stats)

来源文件:/proc/fs/lustre/mdt/*/job_stats

  • tags:
    • name:MDT 目标名
    • jobid:作业 ID
  • fields:
    • jobstats_close
    • jobstats_crossdir_rename
    • jobstats_getattr
    • jobstats_getxattr
    • jobstats_link
    • jobstats_mkdir
    • jobstats_mknod
    • jobstats_open
    • jobstats_rename
    • jobstats_rmdir
    • jobstats_samedir_rename
    • jobstats_setattr
    • jobstats_setxattr
    • jobstats_statfs
    • jobstats_sync
    • jobstats_unlink

驱逐计数(eviction_count)

来源文件:/proc/fs/lustre/*/*/eviction_count(含/sys/fs/lustre/mgs|obdfilter|mdt/*/eviction_count)。

  • tags:
    • name:MGT/MDT/OST 目标名
  • fields:
    • evictions:驱逐次数

brw_stats 批量读写分布(源码级补充)

除 README 列出的指标外,插件还会解析brw_stats文件,按brw_sectionbucket两个 tag 组织指标(wantedBrwstatsFields)。brw_stats文件包含“标题行 + 桶行”结构(参见测试数据 brw_stats):

  • tags:
    • name:OST 目标名
    • brw_section:分类标题(如pages per bulk r/wdiscontiguous pagesdisk I/Os in flightI/O time (1/1000s)disk I/O size),上报时转换为下划线命名
    • bucket:桶值(如1161K1M
  • fields:
    • read_ios:读 I/O 次数(列 1)
    • read_percent:读占比(列 2)
    • write_ios:写 I/O 次数(列 5)
    • write_percent:写占比(列 6)

解析器会跳过snapshot_time行与空行,并容忍无权限读取的文件(仅记录 Debug 日志后跳过,lustre2.go#L320-L327)。

运行示例与输出格式

在配置了lustre2插件的 Telegraf 实例上,采集到的数据形如(来源:README.md 的 Example Output 章节):

lustre2,host=oss2,jobid=42990218,name=wrk-OST0041 jobstats_ost_setattr=0i,jobstats_ost_sync=0i,jobstats_punch=0i,jobstats_read_bytes=4096i,jobstats_read_calls=1i,jobstats_read_max_size=4096i,jobstats_read_min_size=4096i,jobstats_write_bytes=310206488i,jobstats_write_calls=7423i,jobstats_write_max_size=53048i,jobstats_write_min_size=8820i 1556525847000000000 lustre2,host=mds1,jobid=42992017,name=wrk-MDT0000 jobstats_close=31798i,jobstats_crossdir_rename=0i,jobstats_getattr=34146i,jobstats_getxattr=15i,jobstats_link=0i,jobstats_mkdir=658i,jobstats_mknod=0i,jobstats_open=31797i,jobstats_rename=0i,jobstats_rmdir=0i,jobstats_samedir_rename=0i,jobstats_setattr=1788i,jobstats_setxattr=0i,jobstats_statfs=0i,jobstats_sync=0i,jobstats_unlink=0i 1556525828000000000

可以看到,host为 Telegraf 自动添加的主机 tag,namejobid则来自 Lustre 统计文件;所有字段均以整数类型(i后缀)上报,方便后续在 InfluxDB、Prometheus 等时序存储中直接聚合。

全局配置选项与插件通用能力

与其他 Telegraf 插件一样,lustre2支持在配置中使用 Telegraf 的通用配置机制,例如:

  • 指标与字段的改名、过滤(namepassfieldpasstagexclude等);
  • 自定义 tag 注入;
  • 通过别名(alias)复用同一插件采集不同路径集合;
  • 配置插件执行顺序。

详细说明参见 docs/CONFIGURATION.md。你可以在[[inputs.lustre2]]区块内按需叠加这些通用选项。

源码解析与测试验证

核心采集流程

lustre2的采集入口是Gather方法(lustre2.go#L49-L169),整体流程为:

  1. 调用getLustreHealth()读取健康状态;
  2. 按需填充 MGS/OST/MDS 三组默认 glob;
  3. 依次对三组 glob 展开(filepath.Glob)并按后缀分派解析;
  4. 所有解析结果统一汇总到allFields(键为tags结构体:name、brwSection、bucket、job、client);
  5. 最后将allFields中的每个条目以lustre2为测量名、按 tag 映射关系(namebrw_sectionbucketjobidclient)调用acc.AddFields输出。

测试用例

插件自带完整的表驱动测试(lustre2_test.go),会遍历testcases目录下的每个子目录:

  • v2.12:模拟 Lustre 2.12 的完整目录布局(含procsys两套伪文件),验证默认配置下的采集结果;
  • v2.12_no_client_stats:验证没有 exports 客户端统计文件时的行为;
  • custom_locations:验证自定义非默认路径(/host_proc/...)的 glob 配置。

每个测试目录内的telegraf.conf定义了插件配置(如 v2.12 配置),测试通过设置内部字段rootdir将文件读取根目录重定向到测试目录,从而在不依赖真实 Lustre 集群的情况下完成端到端验证。此外还有针对缓存统计字段形态的独立单测 TestCacheStatsReportSamplesAndPages。

注册与打包

插件通过inputs.Add("lustre2", ...)注册到 Telegraf 插件注册表(lustre2.go#L795-L798),并作为内置输入插件随 Telegraf 二进制分发,无需额外安装。sample.conf通过//go:embed嵌入二进制,SampleConfig()返回的配置即上文的默认示例。

实战建议

  1. 平台前提lustre2仅支持 Linux,且必须运行在能够访问 Lustreproc/sys统计文件的节点上(通常是 OST/MDS 服务节点或已挂载 Lustre 的客户端);
  2. 版本适配:默认 glob 面向 Lustre 2.12.x。若你的集群是其他版本,建议先在各节点执行ls /proc/fs/lustre/obdfilter/*/确认文件布局,再通过ost_procfiles/mds_procfiles/mgs_procfiles定制;
  3. 权限注意brw_stats等文件可能因权限不足无法读取,插件对此会以 Debug 日志记录并跳过,不会导致整个采集失败,可通过日志观察确认;
  4. 组合使用:结合 Telegraf 通用过滤配置(见 docs/CONFIGURATION.md),可以按nameclientjobid标签拆分出“按客户端”“按作业”等不同维度的监控视图。

相关资源

  • 插件文档:plugins/inputs/lustre2/README.md
  • 实现源码:plugins/inputs/lustre2/lustre2.go(Linux)、plugins/inputs/lustre2/lustre2_notlinux.go(非 Linux 占位)
  • 默认配置:plugins/inputs/lustre2/sample.conf
  • 测试用例:plugins/inputs/lustre2/lustre2_test.go 及 testcases 下的模拟数据目录

【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegraf

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询