前回の続き。
Fluent BitのMemory Metoricsを使って、
メモリ使用量を計測していたけど、
free
コマンドと比較すると値がおかしい。。
いくつかのIssueを見てみると、すでに指摘されているっぽい。
- mem input: Treat buffer/cache memory as available, rather than used by nigels-com · Pull Request #1617 · fluent/fluent-bit
- mem input plugin: useless Mem.free metric reported · Issue #1194 · fluent/fluent-bit
回避方法
Issue#1194でMemory Metricsではなく、
free
コマンドの結果を利用するワークアラウンドが乗ってたので、それを利用すればOK
[INPUT] name exec command free | sed -n '2p' | awk '{printf("{\"Mem.total\":%d, \"Mem.used\":%d, \"Mem.free\":%d, \"Mem.available\":%d}", $2, $3, $4, $7)}' parser json
おまけ:Memory Metricsはsysinfo(2)を使っている
Memory MetricsはC言語のsysinfo(2)を使っているよう。
ソースコードの該当箇所はこのあたり。
/* set values in KBs */ m_info->mem_total = calc_kb(info.totalram, info.mem_unit); /* * This value seems to be MemAvailable if it is supported * or MemFree on legacy Linux. */ m_info->mem_free = calc_kb(info.freeram, info.mem_unit); m_info->mem_used = m_info->mem_total - m_info->mem_free; m_info->swap_total = calc_kb(info.totalswap, info.mem_unit); m_info->swap_free = calc_kb(info.freeswap, info.mem_unit); m_info->swap_used = m_info->swap_total - m_info->swap_free;
sysinfo(2)は、/proc/meminfo
の値を取得しているようで、
そのMemFree
自体が期待した値(空きメモリ量)ではないっぽい。
また、Mem.used
がtotal - free
での計算による結果のため、
Buffers
やCached
などが考慮されておらず、
Mem.used / Mem.total
でメモリ使用率を計算しようとすると、
常に使用率が高い状態になる。。
free
コマンドではその点が考慮されているため、
乖離が出ているっぽいらしい。
以下のPRで追加されていて、Mem.available
が追加されるかもしれない。
以上!! なるほど、難しい。。(*´ω`*)