くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

Fluent BitのMem.usedは正確じゃないらしい

前回の続き。

www.memory-lovers.blog

Fluent BitのMemory Metoricsを使って、
メモリ使用量を計測していたけど、
freeコマンドと比較すると値がおかしい。。

いくつかのIssueを見てみると、すでに指摘されているっぽい。

回避方法

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.usedtotal - freeでの計算による結果のため、
BuffersCachedなどが考慮されておらず、
Mem.used / Mem.totalでメモリ使用率を計算しようとすると、
常に使用率が高い状態になる。。

freeコマンドではその点が考慮されているため、
乖離が出ているっぽいらしい。

以下のPRで追加されていて、Mem.availableが追加されるかもしれない。


以上!! なるほど、難しい。。(*´ω`*)

参考にしたサイトさま