in src/oomd/plugins/MemoryAbove.cpp [100:157]
Engine::PluginRet MemoryAbove::run(OomdContext& ctx) {
using std::chrono::steady_clock;
int64_t current_memory_usage = 0;
std::string current_cgroup;
for (const CgroupContext& cgroup_ctx : ctx.addToCacheAndGet(cgroups_)) {
if (debug_) {
OLOG << "cgroup \"" << cgroup_ctx.cgroup().relativePath() << "\" "
<< "memory.current=" << cgroup_ctx.current_usage().value_or(0)
<< "memory.stat (anon)=" << cgroup_ctx.anon_usage().value_or(0);
}
auto usage = is_anon_ ? cgroup_ctx.anon_usage().value_or(0)
: cgroup_ctx.current_usage().value_or(0);
if (current_memory_usage < usage) {
current_memory_usage = usage;
current_cgroup = cgroup_ctx.cgroup().relativePath();
}
}
const auto now = steady_clock::now();
if (current_memory_usage > threshold_) {
// Logging this on every positive match is too verbose. Daniel is
// fixing it properly but let's shut it up for the time being.
if (debug_) {
OLOG << "cgroup \"" << current_cgroup << "\" "
<< (is_anon_ ? "anon usage=" : "memory usage=")
<< current_memory_usage << " hit threshold=" << threshold_;
}
if (hit_thres_at_ == steady_clock::time_point()) {
hit_thres_at_ = now;
}
const auto diff =
std::chrono::duration_cast<std::chrono::seconds>(now - hit_thres_at_)
.count();
if (diff >= duration_) {
// Logging this on every positive match is too verbose. Daniel is
// fixing it properly but let's shut it up for the time being.
if (debug_) {
std::ostringstream oss;
oss << std::setprecision(2) << std::fixed;
oss << "cgroup \"" << current_cgroup << "\" "
<< "current memory usage " << current_memory_usage / 1024 / 1024
<< "MB is over the threshold of " << threshold_ / 1024 / 1024
<< "MB for " << duration_ << " seconds";
OLOG << oss.str();
}
return Engine::PluginRet::CONTINUE;
}
} else {
hit_thres_at_ = steady_clock::time_point();
}
return Engine::PluginRet::STOP;
}