void dumpCgroupOverview()

in src/oomd/plugins/DumpCgroupOverview.cpp [34:66]


void dumpCgroupOverview(const Oomd::CgroupContext& cgroup_ctx, bool always) {
  // Only log on exceptional cases
  auto pressure = cgroup_ctx.mem_pressure().value_or(Oomd::ResourcePressure{});
  bool should_dump = (always || (pressure.sec_10 >= 1 && pressure.sec_60 > 0));
  if (!should_dump) {
    return;
  }

  const auto& path = cgroup_ctx.cgroup();
  const int64_t current = cgroup_ctx.current_usage().value_or(0);
  // TODO(dschatzberg): Report error
  auto meminfo = Oomd::Fs::getMeminfo();
  int64_t swapfree = 0;
  int64_t swaptotal = 0;
  if (meminfo) {
    swapfree = (*meminfo)["SwapFree"];
    swaptotal = (*meminfo)["SwapTotal"];
  }
  int64_t pgscan = 0;
  // TODO(dschatzberg): Report error
  auto vmstat = Oomd::Fs::getVmstat();
  if (vmstat) {
    pgscan = (*vmstat)[kPgscanSwap] + (*vmstat)[kPgscanDirect];
  }

  std::ostringstream oss;
  oss << std::setprecision(2) << std::fixed;
  oss << "cgroup=" << path.relativePath() << " total=" << current / 1024 / 1024
      << "MB pressure=" << pressure.sec_10 << ":" << pressure.sec_60 << ":"
      << pressure.sec_300 << " swapfree=" << swapfree / 1024 / 1024 << "MB/"
      << swaptotal / 1024 / 1024 << "MB pgscan=" << pgscan;
  OLOG << oss.str();
}