Add "kernel_heap_monitor" feature
This commit is contained in:
parent
d3e84d2269
commit
3b90df67dc
6
.github/workflows/main.yml
vendored
6
.github/workflows/main.yml
vendored
@ -68,6 +68,12 @@ jobs:
|
|||||||
if: ${{ failure() }}
|
if: ${{ failure() }}
|
||||||
run: docker exec ${{ github.job }} bash -c "cat /root/occlum/build/test/.fail"
|
run: docker exec ${{ github.job }} bash -c "cat /root/occlum/build/test/.fail"
|
||||||
|
|
||||||
|
- name: Integration test with optional Occlum features
|
||||||
|
run: |
|
||||||
|
docker exec ${{ github.job }} bash -c 'source /opt/intel/sgxsdk/environment; cd /root/occlum; make clean && LIBOS_FEATURES="kernel_heap_monitor" make install'
|
||||||
|
docker exec ${{ github.job }} bash -c "cd /root/occlum; SGX_MODE=SIM make test-glibc"
|
||||||
|
shell: bash
|
||||||
|
|
||||||
# Make_test_on_centos:
|
# Make_test_on_centos:
|
||||||
# runs-on: ubuntu-18.04
|
# runs-on: ubuntu-18.04
|
||||||
|
|
||||||
|
@ -50,6 +50,7 @@ dcap = [] # DCAP support. The compilation relies on DCAP package.
|
|||||||
cov = ["sgx_cov"] # Enable coverage colletcion.
|
cov = ["sgx_cov"] # Enable coverage colletcion.
|
||||||
hyper_mode = [] # For running in hyper mode.
|
hyper_mode = [] # For running in hyper mode.
|
||||||
pku = [] # PKU Support
|
pku = [] # PKU Support
|
||||||
|
kernel_heap_monitor = []# Kernel heap usage tracking. With overhead.
|
||||||
|
|
||||||
[target.'cfg(not(target_env = "sgx"))'.dependencies]
|
[target.'cfg(not(target_env = "sgx"))'.dependencies]
|
||||||
sgx_types = { path = "../../deps/rust-sgx-sdk/sgx_types" }
|
sgx_types = { path = "../../deps/rust-sgx-sdk/sgx_types" }
|
||||||
|
@ -45,7 +45,7 @@ LIBOS_LOG ?= error
|
|||||||
|
|
||||||
LIBOS_SONAME := libocclum-libos.so.$(MAJOR_VER_NUM)
|
LIBOS_SONAME := libocclum-libos.so.$(MAJOR_VER_NUM)
|
||||||
|
|
||||||
LIBOS_FEATURES :=
|
LIBOS_FEATURES := $(LIBOS_FEATURES)
|
||||||
|
|
||||||
ifeq ($(SGX_MODE), HW)
|
ifeq ($(SGX_MODE), HW)
|
||||||
LIBOS_CORE_LIB_NAME := occlum-libos-core
|
LIBOS_CORE_LIB_NAME := occlum-libos-core
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
use super::*;
|
use super::*;
|
||||||
|
use crate::util::kernel_alloc::KernelAlloc;
|
||||||
use crate::vm::USER_SPACE_VM_MANAGER;
|
use crate::vm::USER_SPACE_VM_MANAGER;
|
||||||
|
|
||||||
pub struct MemInfoINode;
|
pub struct MemInfoINode;
|
||||||
@ -15,13 +16,26 @@ impl ProcINode for MemInfoINode {
|
|||||||
fn generate_data_in_bytes(&self) -> vfs::Result<Vec<u8>> {
|
fn generate_data_in_bytes(&self) -> vfs::Result<Vec<u8>> {
|
||||||
let total_ram = USER_SPACE_VM_MANAGER.get_total_size();
|
let total_ram = USER_SPACE_VM_MANAGER.get_total_size();
|
||||||
let free_ram = USER_SPACE_VM_MANAGER.get_precise_free_size();
|
let free_ram = USER_SPACE_VM_MANAGER.get_precise_free_size();
|
||||||
|
let kernel_heap_total = KernelAlloc::get_kernel_heap_config();
|
||||||
|
let kernel_heap_peak_used = KernelAlloc::get_kernel_heap_peak_used();
|
||||||
|
let kernel_heap_in_use = if let Some(bytes) = KernelAlloc::get_kernel_mem_size() {
|
||||||
|
format!("{} kB", bytes / KB)
|
||||||
|
} else {
|
||||||
|
"Feature not enabled".to_string()
|
||||||
|
};
|
||||||
Ok(format!(
|
Ok(format!(
|
||||||
"MemTotal: {} kB\n\
|
"MemTotal: {} kB\n\
|
||||||
MemFree: {} kB\n\
|
MemFree: {} kB\n\
|
||||||
MemAvailable: {} kB\n",
|
MemAvailable: {} kB\n\
|
||||||
|
KernelHeapTotal: {} kB\n\
|
||||||
|
KernelHeapPeakUsed: {} kB\n\
|
||||||
|
KernelHeapInUse: {}\n",
|
||||||
total_ram / KB,
|
total_ram / KB,
|
||||||
free_ram / KB,
|
free_ram / KB,
|
||||||
free_ram / KB,
|
free_ram / KB,
|
||||||
|
kernel_heap_total / KB,
|
||||||
|
kernel_heap_peak_used / KB,
|
||||||
|
kernel_heap_in_use,
|
||||||
)
|
)
|
||||||
.into_bytes())
|
.into_bytes())
|
||||||
}
|
}
|
||||||
|
81
src/libos/src/util/kernel_alloc.rs
Normal file
81
src/libos/src/util/kernel_alloc.rs
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
use std::alloc::{GlobalAlloc, Layout, System};
|
||||||
|
use std::sync::atomic::{AtomicUsize, Ordering};
|
||||||
|
|
||||||
|
// This file provides "KernelAlloc", a wrapper for sgx_std "System" allocator, is used as
|
||||||
|
// the global allocator for Occlum kernel. Currently, this can provides the ability to
|
||||||
|
// monitor the kernel heap usage.
|
||||||
|
|
||||||
|
pub struct KernelAlloc {
|
||||||
|
size: AtomicUsize,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl KernelAlloc {
|
||||||
|
pub fn get_kernel_mem_size() -> Option<usize> {
|
||||||
|
cfg_if! {
|
||||||
|
if #[cfg(feature = "kernel_heap_monitor")] {
|
||||||
|
Some(ALLOC.size.load(Ordering::Relaxed))
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_kernel_heap_config() -> usize {
|
||||||
|
std::enclave::get_heap_size()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_kernel_heap_peak_used() -> usize {
|
||||||
|
sgx_trts::enclave::rsgx_get_peak_heap_used()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe impl GlobalAlloc for KernelAlloc {
|
||||||
|
#[inline]
|
||||||
|
unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
|
||||||
|
let ptr = System.alloc(layout);
|
||||||
|
if !ptr.is_null() {
|
||||||
|
self.size.fetch_add(layout.size(), Ordering::Relaxed);
|
||||||
|
}
|
||||||
|
|
||||||
|
ptr
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
unsafe fn alloc_zeroed(&self, layout: Layout) -> *mut u8 {
|
||||||
|
let ptr = System.alloc_zeroed(layout);
|
||||||
|
if !ptr.is_null() {
|
||||||
|
self.size.fetch_add(layout.size(), Ordering::Relaxed);
|
||||||
|
}
|
||||||
|
|
||||||
|
ptr
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {
|
||||||
|
System.dealloc(ptr, layout);
|
||||||
|
self.size.fetch_sub(layout.size(), Ordering::Relaxed);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
unsafe fn realloc(&self, ptr: *mut u8, layout: Layout, new_size: usize) -> *mut u8 {
|
||||||
|
let ptr = System.realloc(ptr, layout, new_size);
|
||||||
|
if !ptr.is_null() {
|
||||||
|
let old_size = layout.size();
|
||||||
|
if new_size > old_size {
|
||||||
|
// grow
|
||||||
|
self.size.fetch_add(new_size - old_size, Ordering::Relaxed);
|
||||||
|
} else if new_size < old_size {
|
||||||
|
// shrink
|
||||||
|
self.size.fetch_sub(old_size - new_size, Ordering::Relaxed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ptr
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "kernel_heap_monitor")]
|
||||||
|
#[global_allocator]
|
||||||
|
static ALLOC: KernelAlloc = KernelAlloc {
|
||||||
|
size: AtomicUsize::new(0),
|
||||||
|
};
|
@ -3,6 +3,7 @@ use super::*;
|
|||||||
pub mod dirty;
|
pub mod dirty;
|
||||||
pub mod host_file_util;
|
pub mod host_file_util;
|
||||||
pub mod hosts_parser_util;
|
pub mod hosts_parser_util;
|
||||||
|
pub mod kernel_alloc;
|
||||||
pub mod log;
|
pub mod log;
|
||||||
pub mod mem_util;
|
pub mod mem_util;
|
||||||
pub mod mpx_util;
|
pub mod mpx_util;
|
||||||
|
Loading…
Reference in New Issue
Block a user