runtime-rs: enable vm hugepage

support vm hugepage,set the hugetlbfs mount point as vm  memory path

Fixes:#5560
Signed-off-by: Zhongtao Hu <zhongtaohu.tim@linux.alibaba.com>
This commit is contained in:
Zhongtao Hu 2022-12-02 14:11:46 +08:00
parent 5ef7ed72ae
commit fc4a67eec3
5 changed files with 27 additions and 5 deletions

View File

@ -136,6 +136,14 @@ block_device_driver = "@DEFBLOCKSTORAGEDRIVER_DB@"
# of shim, does not need an external virtiofsd process. # of shim, does not need an external virtiofsd process.
shared_fs = "@DBSHAREDFS@" shared_fs = "@DBSHAREDFS@"
# Enable huge pages for VM RAM, default false
# Enabling this will result in the VM memory
# being allocated using huge pages.
# This is useful when you want to use vhost-user network
# stacks within the container. This will automatically
# result in memory pre allocation
#enable_hugepages = true
[agent.@PROJECT_TYPE@] [agent.@PROJECT_TYPE@]
container_pipe_size=@PIPESIZE@ container_pipe_size=@PIPESIZE@
# If enabled, make the agent display debug-level messages. # If enabled, make the agent display debug-level messages.

View File

@ -7,7 +7,7 @@
use super::vmm_instance::VmmInstance; use super::vmm_instance::VmmInstance;
use crate::{ use crate::{
device::Device, hypervisor_persist::HypervisorState, kernel_param::KernelParams, VmmState, device::Device, hypervisor_persist::HypervisorState, kernel_param::KernelParams, VmmState,
HYPERVISOR_DRAGONBALL, VM_ROOTFS_DRIVER_BLK, DEV_HUGEPAGES, HUGETLBFS, HYPERVISOR_DRAGONBALL, SHMEM, VM_ROOTFS_DRIVER_BLK,
}; };
use anyhow::{anyhow, Context, Result}; use anyhow::{anyhow, Context, Result};
use async_trait::async_trait; use async_trait::async_trait;
@ -186,11 +186,18 @@ impl DragonballInner {
fn set_vm_base_config(&mut self) -> Result<()> { fn set_vm_base_config(&mut self) -> Result<()> {
let serial_path = [&self.run_dir, "console.sock"].join("/"); let serial_path = [&self.run_dir, "console.sock"].join("/");
let (mem_type, mem_file_path) = if self.config.memory_info.enable_hugepages {
(String::from(HUGETLBFS), String::from(DEV_HUGEPAGES))
} else {
(String::from(SHMEM), String::from(""))
};
let vm_config = VmConfigInfo { let vm_config = VmConfigInfo {
serial_path: Some(serial_path), serial_path: Some(serial_path),
mem_size_mib: self.config.memory_info.default_memory as usize, mem_size_mib: self.config.memory_info.default_memory as usize,
vcpu_count: self.config.cpu_info.default_vcpus as u8, vcpu_count: self.config.cpu_info.default_vcpus as u8,
max_vcpu_count: self.config.cpu_info.default_maxvcpus as u8, max_vcpu_count: self.config.cpu_info.default_maxvcpus as u8,
mem_type,
mem_file_path,
..Default::default() ..Default::default()
}; };
info!(sl!(), "vm config: {:?}", vm_config); info!(sl!(), "vm config: {:?}", vm_config);

View File

@ -327,9 +327,9 @@ impl VmmInstance {
} }
} }
} }
return Err(anyhow::anyhow!( Err(anyhow::anyhow!(
"After {} attempts, it still doesn't work.", "After {} attempts, it still doesn't work.",
REQUEST_RETRY REQUEST_RETRY
)); ))
} }
} }

View File

@ -26,6 +26,13 @@ use kata_types::config::hypervisor::Hypervisor as HypervisorConfig;
// Config which driver to use as vm root dev // Config which driver to use as vm root dev
const VM_ROOTFS_DRIVER_BLK: &str = "virtio-blk"; const VM_ROOTFS_DRIVER_BLK: &str = "virtio-blk";
const VM_ROOTFS_DRIVER_PMEM: &str = "virtio-pmem"; const VM_ROOTFS_DRIVER_PMEM: &str = "virtio-pmem";
// before using hugepages for VM, we need to mount hugetlbfs
// /dev/hugepages will be the mount point
// mkdir -p /dev/hugepages
// mount -t hugetlbfs none /dev/hugepages
const DEV_HUGEPAGES: &str = "/dev/hugepages";
pub const HUGETLBFS: &str = "hugetlbfs";
const SHMEM: &str = "shmem";
pub const HYPERVISOR_DRAGONBALL: &str = "dragonball"; pub const HYPERVISOR_DRAGONBALL: &str = "dragonball";
#[derive(PartialEq)] #[derive(PartialEq)]

View File

@ -26,7 +26,7 @@ pub fn to_disk<T: serde::Serialize>(value: &T, sid: &str) -> Result<()> {
serde_json::to_writer_pretty(f, &j)?; serde_json::to_writer_pretty(f, &j)?;
return Ok(()); return Ok(());
} }
return Err(anyhow!("invalid sid {}", sid)); Err(anyhow!("invalid sid {}", sid))
} }
pub fn from_disk<T>(sid: &str) -> Result<T> pub fn from_disk<T>(sid: &str) -> Result<T>
@ -41,7 +41,7 @@ where
let reader = BufReader::new(file); let reader = BufReader::new(file);
return serde_json::from_reader(reader).map_err(|e| anyhow!(e.to_string())); return serde_json::from_reader(reader).map_err(|e| anyhow!(e.to_string()));
} }
return Err(anyhow!("invalid sid {}", sid)); Err(anyhow!("invalid sid {}", sid))
} }
#[cfg(test)] #[cfg(test)]