kata-containers / cgroups-rs

Native Rust library for managing control groups under Linux
https://crates.io/crates/cgroups-rs
Other
114 stars 45 forks source link

Panic on reading memory stats #115

Closed xueruini closed 1 year ago

xueruini commented 1 year ago

Describe the bug

The lib crashes on get_max_value("memory.max") like values (the backtrace is provided as follows).

1e8f492ed79f21fca179d09544cb97f

8badf3ce6c43f48414685a75721ae6d

The /proc/<pic>/cgroup of the process contains only 1 line:

0::/

The MVP

use procfs::{Meminfo, ProcError};
use cgroups_rs::memory::MemController;
use cgroups_rs::*;

pub fn flush_memory_usage() {
    let container_total = cgroup_node_mem_total()
        .map_err(|e| {
            println!("flush_memory_usage cgroup_node_mem_total: {}", e);
        })
        .unwrap_or_default();
        println!("container total mem: {}", container_total);

}

pub fn cgroup_node_mem_total() -> Result<u64, ProcError> {
            // Acquire a handle for the cgroup hierarchy.
            let hier = cgroups_rs::hierarchies::auto();
            let cg = Cgroup::load(hier, String::from(""));
            let mc: &MemController = cg.controller_of().unwrap();
            Ok(mc.memory_stat().stat.hierarchical_memory_limit as u64)
}

fn main() {
        flush_memory_usage();
}

The full log:

xxx@fancybox:~/workspace/cgtest$ RUST_BACKTRACE=1 cargo r
   Compiling cgtest v0.1.0 (/home/xueruini/workspace/cgtest)
    Finished dev [unoptimized + debuginfo] target(s) in 1.21s
     Running `target/debug/cgtest`
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Error { kind: ReadFailed("/sys/fs/cgroup/memory.high"), cause: Some(Os { code: 2, kind: NotFound, message: "No such file or directory" }) }', /home/xxxx/.cargo/registry/src/rsproxy.cn-8f6827c7555bfaf8/cgroups-rs-0.3.2/src/memory.rs:587:34
stack backtrace:
   0: rust_begin_unwind
             at /rustc/9eb3afe9ebe9c7d2b84b71002d44f4a0edac95e0/library/std/src/panicking.rs:575:5
   1: core::panicking::panic_fmt
             at /rustc/9eb3afe9ebe9c7d2b84b71002d44f4a0edac95e0/library/core/src/panicking.rs:64:14
   2: core::result::unwrap_failed
             at /rustc/9eb3afe9ebe9c7d2b84b71002d44f4a0edac95e0/library/core/src/result.rs:1790:5
   3: core::result::Result<T,E>::unwrap
             at /rustc/9eb3afe9ebe9c7d2b84b71002d44f4a0edac95e0/library/core/src/result.rs:1112:23
   4: cgroups_rs::memory::MemController::memory_stat_v2
             at /home/xxx/.cargo/registry/src/rsproxy.cn-8f6827c7555bfaf8/cgroups-rs-0.3.2/src/memory.rs:587:19
   5: cgroups_rs::memory::MemController::memory_stat
             at /home/xxx/.cargo/registry/src/rsproxy.cn-8f6827c7555bfaf8/cgroups-rs-0.3.2/src/memory.rs:621:20
   6: cgtest::cgroup_node_mem_total
             at ./src/main.rs:23:16
   7: cgtest::flush_memory_usage
             at ./src/main.rs:6:27
   8: cgtest::main
             at ./src/main.rs:27:2
   9: core::ops::function::FnOnce::call_once
             at /rustc/9eb3afe9ebe9c7d2b84b71002d44f4a0edac95e0/library/core/src/ops/function.rs:250:5
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

Expected behavior get_mem() should return as expected instead of panic.

Additional context

I tried this on various environments, including wsl2+ubuntu 20.04, wsl2+ubuntu 22.04, VirtualBox 7.0 + ubuntu 22.04.

xueruini commented 1 year ago

It is because the api only supports cgroup v1, while the systems are in v2.