拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Telegraf 内存监控实战指南:深入解析 mem 输入插件

Telegraf 内存监控实战指南深入解析 mem 输入插件【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegraf本指南以 Telegraf 的mem输入插件为核心系统讲解如何采集服务器物理内存与交换分区指标涵盖基础字段、平台差异字段、collect_extended扩展采集并结合仓库源码plugins/inputs/mem剖析其实现原理。读完本文你将能够独立配置[[inputs.mem]]、理解每个字段的含义与来源并正确解读 used 与 actual_used 的差异从而构建可靠的内存监控告警体系。插件概览mem是 Telegraf 自 v0.1.5 起内置的系统类输入插件用于采集操作系统内存使用情况数据来源包括 Linux 的/proc/meminfo、Windows 的性能计数器以及 Darwin/FreeBSD/OpenBSD 等平台的内存统计接口。它按Gauge瞬时值类型输出名为mem的指标不携带任何标签。在插件注册表中mem通过 mem.go 的init()函数完成注册func init() { ps : psutil.NewSystemPS() inputs.Add(mem, func() telegraf.Input { return Mem{ps: ps} }) }插件底层依赖 gopsutil/v4 的mem.VirtualMemoryStat结构体获取内存数据整个采集流程由Gather()方法驱动先调用ps.VMStat()取得虚拟内存快照再按当前平台runtime.GOOS填充对应字段最后通过acc.AddGauge(mem, fields, nil)写入指标。配置与启用启用mem插件只需在 Telegraf 配置文件中加入如下片段与 sample.conf 完全一致# Read metrics about memory usage [[inputs.mem]] ## Collect extended memory statistics from /proc/meminfo (Linux) ## or from performance counters (Windows). # collect_extended false参数说明collect_extended参数默认值作用collect_extendedfalse是否额外采集平台级扩展内存统计。Linux 下读取/proc/meminfo中的扩展项如Active(anon)、PercpuWindows 下读取性能计数器中的提交/虚拟内存信息该参数并非在所有平台生效。从 mem.go 的Init()逻辑可以看到func (ms *Mem) Init() error { ms.platform runtime.GOOS if ms.CollectExtended !extendedMemorySupported { ms.Log.Warn(collect_extended is not supported on this platform, ignoring) ms.CollectExtended false } return nil }extendedMemorySupported是一个按构建标签区分的常量在 mem_linux.go 与 mem_windows.go 中为true而在 mem_other.go针对其余平台中为false。也就是说在 macOS、FreeBSD、OpenBSD 等平台上即使显式开启该选项也只会被警告后忽略不会报错。与其他插件一样mem同样支持全局配置选项中描述的指标修改、标签筛选、别名与执行顺序等功能详见 CONFIGURATION.md 的 Plugins 一节。采集指标总览mem输出的字段集合取决于运行平台所有数值字段单位均为字节bytes。下列字段中的平台标注表示该字段仅在这些平台上出现未标注的平台通用字段在所有平台都输出。通用字段所有平台字段类型说明totalinteger物理内存总量availableinteger在不触发交换的前提下可用于启动新应用的估算内存量usedinteger已使用内存used_percentfloat已用内存占总内存的百分比available_percentfloat可用内存占总内存的百分比从源码mem.go可以看出used_percent与available_percent由插件自行计算fields : map[string]interface{}{ total: vm.Total, available: vm.Available, used: vm.Used, used_percent: 100 * float64(vm.Used) / float64(vm.Total), available_percent: 100 * float64(vm.Available) / float64(vm.Total), }Linux 平台字段字段类型对应 /proc/meminfo 来源activeintegerActivebufferedintegerBufferscachedintegerCachedcommit_limitintegerCommitLimitcommitted_asintegerCommitted_ASdirtyintegerDirtyfreeintegerMemFreehigh_free/high_totalintegerHighFree / HighTotalx86 高内存区huge_pages_free/huge_pages_total/huge_page_sizeintegerHugePages_Free / HugePages_Total / HugepagesizeinactiveintegerInactivelow_free/low_totalintegerLowFree / LowTotalx86 低内存区mappedintegerMappedpage_tablesintegerPageTablessharedintegerShmemslabintegerSlabsreclaimable/sunreclaimintegerSReclaimable / SUnreclaimswap_cachedintegerSwapCachedswap_free/swap_totalintegerSwapFree / SwapTotalvmalloc_chunk/vmalloc_total/vmalloc_usedintegerVmallocChunk / VmallocTotal / VmallocUsedwrite_back/write_back_tmpintegerWriteback / WritebackTmp仓库测试数据 testdata/normal/proc/meminfo 展示了一份完整的/proc/meminfo样例上面字段与文件中的键一一对应例如MemTotal: 16201888 kB、MemAvailable: 14221924 kB、CommitLimit: 12295244 kB等便于你对照理解字段来源。DarwinmacOS平台字段active、free、inactive、wired。FreeBSD 平台字段active、buffered、cached、free、inactive、laundry、wired。OpenBSD 平台字段active、cached、free、inactive、wired。各平台的字段映射逻辑集中在 mem.go 的switch ms.platform分支中例如 FreeBSD 分支会额外写入laundryBSD 的换页清洗内存与wired内核锁定的不可回收内存。collect_extended 扩展字段详解开启collect_extended true后插件会调用平台相关的getExtendedMemoryFields()将额外字段合并进指标中见 mem.go。Linux 扩展字段字段类型说明active_fileinteger活跃文件缓存页inactive_fileinteger非活跃文件缓存页active_anoninteger活跃匿名页进程堆栈等inactive_anoninteger非活跃匿名页unevictableinteger不可回收页如 mlock 锁定内存percpuinteger每 CPU 分配器占用的内存其实现位于 mem_linux.go通过 gopsutil 的mem.NewExLinux().VirtualMemory()读取func getExtendedMemoryFields() (map[string]interface{}, error) { exVM, err : mem.NewExLinux().VirtualMemory() ... return map[string]interface{}{ active_file: exVM.ActiveFile, inactive_file: exVM.InactiveFile, active_anon: exVM.ActiveAnon, inactive_anon: exVM.InactiveAnon, unevictable: exVM.Unevictable, percpu: exVM.Percpu, }, nil }Windows 扩展字段字段类型说明commit_limitinteger系统可提交的虚拟内存上限commit_totalinteger当前已提交的虚拟内存总量virtual_total/virtual_availinteger虚拟地址空间总量 / 可用量phys_total/phys_availinteger物理内存总量 / 可用量page_file_total/page_file_availinteger页面文件总量 / 可用量对应实现见 mem_windows.go使用mem.NewExWindows().VirtualMemory()从 Windows 性能数据中获取。需要注意扩展字段采集若发生异常插件不会中断整体采集而是通过acc.AddError(...)上报错误并继续输出基础字段mem.go。实际输出示例默认配置下在 Linux 主机上的输出形如时间戳为纳秒mem active9299595264i,available16818249728i,available_percent80.41654254645131,buffered2383761408i,cached13316689920i,commit_limit14751920128i,committed_as11781156864i,dirty122880i,free1877688320i,high_free0i,high_total0i,huge_page_size2097152i,huge_pages_free0i,huge_pages_total0i,inactive7549939712i,low_free0i,low_total0i,mapped416763904i,page_tables19787776i,shared670679040i,slab2081071104i,sreclaimable1923395584i,sunreclaim157675520i,swap_cached1302528i,swap_free4286128128i,swap_total4294963200i,total20913917952i,used3335778304i,used_percent15.95004011996231,vmalloc_chunk0i,vmalloc_total35184372087808i,vmalloc_used0i,write_back0i,write_back_tmp0i 1574712869000000000开启collect_extended true后Linux 输出会追加active_anon、active_file、inactive_anon、inactive_file、unevictable、percpu六个字段mem active9299595264i,active_anon5765169152i,active_file3534426112i,available16818249728i,available_percent80.41654254645131,buffered2383761408i,cached13316689920i,commit_limit14751920128i,committed_as11781156864i,dirty122880i,free1877688320i,high_free0i,high_total0i,huge_page_size2097152i,huge_pages_free0i,huge_pages_total0i,inactive7549939712i,inactive_anon1081245696i,inactive_file6468694016i,low_free0i,low_total0i,mapped416763904i,page_tables19787776i,percpu5765120i,shared670679040i,slab2081071104i,sreclaimable1923395584i,sunreclaim157675520i,swap_cached1302528i,swap_free4286128128i,swap_total4294963200i,total20913917952i,unevictable143360i,used3335778304i,used_percent15.95004011996231,vmalloc_chunk0i,vmalloc_total35184372087808i,vmalloc_used0i,write_back0i,write_back_tmp0i 1574712869000000000理解 used 与 availableLinux ate my RAMREADME 特别提示了一个常见误区used与actual_used真实占用含义不同。Linux 的页面缓存page cache即cached与buffered会主动占用空闲内存来加速文件 I/O但这些内存在应用需要时会被内核立即回收。因此used通常被统计为total - free其中包含大量可回收的缓存数值偏高不代表真实占用真正反映内存吃紧的指标是available可用内存与available_percent它已扣除了不可回收的缓存占用是判断是否需要告警的关键依据。推荐以available_percent或available作为内存告警的基准例如低于 10% 触发告警而不是used_percent以免被页面缓存虚高的 used 数值误导。本文不涉及对外部参考链接的转载以上解释基于 Linux 内存管理机制与插件字段定义。源码验证与测试仓库为mem插件提供了完整的单元测试可佐证上述字段映射行为mem_test.go 使用psutiltest.MockPS模拟VMStat()返回值将插件platform强制设为linux后调用Gather()再通过testutil.RequireMetricsEqual断言输出的 35 个字段与预期完全一致包括active、commit_limit、huge_pages_*、vmalloc_*、write_back_*等测试数据 testdata/normal/proc/meminfo 与 testdata/missing_fields/proc/meminfo 分别模拟完整与缺失字段的/proc/meminfo场景用于验证插件对异常输入的处理。如果你修改了该插件可运行go test ./plugins/inputs/mem/执行这些测试进行回归验证。此外官方文档 docs/INPUTS.md 与 docs/AGGREGATORS_AND_PROCESSORS.md 提供了关于输入插件及处理管线的更多上下文。最佳实践小结开箱即用基础内存监控只需[[inputs.mem]]一行配置无需额外参数按需扩展Linux 或 Windows 环境如需更细粒度的内存拆解匿名页/文件页、提交限额、页面文件开启collect_extended true告警基准优先使用available_percent判断内存压力避免缓存导致误报平台兼容在 macOS/FreeBSD/OpenBSD 上collect_extended会被自动忽略配置可跨平台保留但需了解其行为差异字段单位所有数值均为字节告警阈值换算时注意与 GB/MB 的单位转换。【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegraf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门