Skip to content

Commit 7af896b

Browse files
committed
feat: support linux v6.12 balloon stat
When the guest runs a kernel >= v6.12, the balloon stats API will not crash and will return additional metrics: oom_kill, alloc_stall, async_scan, direct_scan, async_reclaim, direct_reclaim these metrics can be found in the related kernel commit: 74c025c5d7e4ac7c7ad269c1ee64da4bdfe4770c To avoid any misunderstanding, these metrics are omitted when the guest kernel < v6.12. Signed-off-by: 刘顺钰 <[email protected]>
1 parent 3c10d9c commit 7af896b

File tree

4 files changed

+81
-5
lines changed

4 files changed

+81
-5
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ and this project adheres to
1919
- [#4028](https://github.com/firecracker-microvm/firecracker/pull/4028):
2020
Firecracker now creates the log and metrics files if they do not exist,
2121
simplifying the launch of Firecracker by removing a manual step.
22+
- [#5516](https://github.com/firecracker-microvm/firecracker/pull/5516): Balloon
23+
stat now supports guest kernel >= 6.12. Now we have a metric to analyze the
24+
memory performance.
2225

2326
### Deprecated
2427

src/vmm/src/devices/virtio/balloon/device.rs

Lines changed: 53 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,11 @@ use super::{
1919
BALLOON_DEV_ID, BALLOON_NUM_QUEUES, BALLOON_QUEUE_SIZES, DEFLATE_INDEX, INFLATE_INDEX,
2020
MAX_PAGE_COMPACT_BUFFER, MAX_PAGES_IN_DESC, MIB_TO_4K_PAGES, STATS_INDEX,
2121
VIRTIO_BALLOON_F_DEFLATE_ON_OOM, VIRTIO_BALLOON_F_STATS_VQ, VIRTIO_BALLOON_PFN_SHIFT,
22-
VIRTIO_BALLOON_S_AVAIL, VIRTIO_BALLOON_S_CACHES, VIRTIO_BALLOON_S_HTLB_PGALLOC,
23-
VIRTIO_BALLOON_S_HTLB_PGFAIL, VIRTIO_BALLOON_S_MAJFLT, VIRTIO_BALLOON_S_MEMFREE,
24-
VIRTIO_BALLOON_S_MEMTOT, VIRTIO_BALLOON_S_MINFLT, VIRTIO_BALLOON_S_SWAP_IN,
22+
VIRTIO_BALLOON_S_ALLOC_STALL, VIRTIO_BALLOON_S_ASYNC_RECLAIM, VIRTIO_BALLOON_S_ASYNC_SCAN,
23+
VIRTIO_BALLOON_S_AVAIL, VIRTIO_BALLOON_S_CACHES, VIRTIO_BALLOON_S_DIRECT_RECLAIM,
24+
VIRTIO_BALLOON_S_DIRECT_SCAN, VIRTIO_BALLOON_S_HTLB_PGALLOC, VIRTIO_BALLOON_S_HTLB_PGFAIL,
25+
VIRTIO_BALLOON_S_MAJFLT, VIRTIO_BALLOON_S_MEMFREE, VIRTIO_BALLOON_S_MEMTOT,
26+
VIRTIO_BALLOON_S_MINFLT, VIRTIO_BALLOON_S_OOM_KILL, VIRTIO_BALLOON_S_SWAP_IN,
2527
VIRTIO_BALLOON_S_SWAP_OUT,
2628
};
2729
use crate::devices::virtio::balloon::BalloonError;
@@ -133,6 +135,24 @@ pub struct BalloonStats {
133135
/// in the guest.
134136
#[serde(skip_serializing_if = "Option::is_none")]
135137
pub hugetlb_failures: Option<u64>,
138+
/// OOM killer invocations. since linux v6.12.
139+
#[serde(skip_serializing_if = "Option::is_none")]
140+
pub oom_kill: Option<u64>,
141+
/// Stall count of memory allocatoin. since linux v6.12.
142+
#[serde(skip_serializing_if = "Option::is_none")]
143+
pub alloc_stall: Option<u64>,
144+
/// Amount of memory scanned asynchronously. since linux v6.12.
145+
#[serde(skip_serializing_if = "Option::is_none")]
146+
pub async_scan: Option<u64>,
147+
/// Amount of memory scanned directly. since linux v6.12.
148+
#[serde(skip_serializing_if = "Option::is_none")]
149+
pub direct_scan: Option<u64>,
150+
/// Amount of memory reclaimed asynchronously. since linux v6.12.
151+
#[serde(skip_serializing_if = "Option::is_none")]
152+
pub async_reclaim: Option<u64>,
153+
/// Amount of memory reclaimed directly. since linux v6.12.
154+
#[serde(skip_serializing_if = "Option::is_none")]
155+
pub direct_reclaim: Option<u64>,
136156
}
137157

138158
impl BalloonStats {
@@ -149,6 +169,12 @@ impl BalloonStats {
149169
VIRTIO_BALLOON_S_CACHES => self.disk_caches = val,
150170
VIRTIO_BALLOON_S_HTLB_PGALLOC => self.hugetlb_allocations = val,
151171
VIRTIO_BALLOON_S_HTLB_PGFAIL => self.hugetlb_failures = val,
172+
VIRTIO_BALLOON_S_OOM_KILL => self.oom_kill = val,
173+
VIRTIO_BALLOON_S_ALLOC_STALL => self.alloc_stall = val,
174+
VIRTIO_BALLOON_S_ASYNC_SCAN => self.async_scan = val,
175+
VIRTIO_BALLOON_S_DIRECT_SCAN => self.direct_scan = val,
176+
VIRTIO_BALLOON_S_ASYNC_RECLAIM => self.async_reclaim = val,
177+
VIRTIO_BALLOON_S_DIRECT_RECLAIM => self.direct_reclaim = val,
152178
_ => {
153179
return Err(BalloonError::MalformedPayload);
154180
}
@@ -694,6 +720,12 @@ pub(crate) mod tests {
694720
disk_caches: Some(0),
695721
hugetlb_allocations: Some(0),
696722
hugetlb_failures: Some(0),
723+
oom_kill: None,
724+
alloc_stall: None,
725+
async_scan: None,
726+
direct_scan: None,
727+
async_reclaim: None,
728+
direct_reclaim: None,
697729
};
698730

699731
let mut stat = BalloonStat {
@@ -730,6 +762,24 @@ pub(crate) mod tests {
730762
stat.tag = VIRTIO_BALLOON_S_HTLB_PGFAIL;
731763
stats.update_with_stat(&stat).unwrap();
732764
assert_eq!(stats.hugetlb_failures, Some(1));
765+
stat.tag = VIRTIO_BALLOON_S_OOM_KILL;
766+
stats.update_with_stat(&stat).unwrap();
767+
assert_eq!(stats.oom_kill, Some(1));
768+
stat.tag = VIRTIO_BALLOON_S_ALLOC_STALL;
769+
stats.update_with_stat(&stat).unwrap();
770+
assert_eq!(stats.alloc_stall, Some(1));
771+
stat.tag = VIRTIO_BALLOON_S_ASYNC_SCAN;
772+
stats.update_with_stat(&stat).unwrap();
773+
assert_eq!(stats.async_scan, Some(1));
774+
stat.tag = VIRTIO_BALLOON_S_DIRECT_SCAN;
775+
stats.update_with_stat(&stat).unwrap();
776+
assert_eq!(stats.direct_scan, Some(1));
777+
stat.tag = VIRTIO_BALLOON_S_ASYNC_RECLAIM;
778+
stats.update_with_stat(&stat).unwrap();
779+
assert_eq!(stats.async_reclaim, Some(1));
780+
stat.tag = VIRTIO_BALLOON_S_DIRECT_RECLAIM;
781+
stats.update_with_stat(&stat).unwrap();
782+
assert_eq!(stats.direct_reclaim, Some(1));
733783
}
734784

735785
#[test]

src/vmm/src/devices/virtio/balloon/mod.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ pub const STATS_INDEX: usize = 2;
5353
const VIRTIO_BALLOON_F_STATS_VQ: u32 = 1; // Enable statistics.
5454
const VIRTIO_BALLOON_F_DEFLATE_ON_OOM: u32 = 2; // Deflate balloon on OOM.
5555

56-
// The statistics tags.
56+
// The statistics tags. defined in linux "include/uapi/linux/virtio_balloon.h".
5757
const VIRTIO_BALLOON_S_SWAP_IN: u16 = 0;
5858
const VIRTIO_BALLOON_S_SWAP_OUT: u16 = 1;
5959
const VIRTIO_BALLOON_S_MAJFLT: u16 = 2;
@@ -64,6 +64,12 @@ const VIRTIO_BALLOON_S_AVAIL: u16 = 6;
6464
const VIRTIO_BALLOON_S_CACHES: u16 = 7;
6565
const VIRTIO_BALLOON_S_HTLB_PGALLOC: u16 = 8;
6666
const VIRTIO_BALLOON_S_HTLB_PGFAIL: u16 = 9;
67+
const VIRTIO_BALLOON_S_OOM_KILL: u16 = 10;
68+
const VIRTIO_BALLOON_S_ALLOC_STALL: u16 = 11;
69+
const VIRTIO_BALLOON_S_ASYNC_SCAN: u16 = 12;
70+
const VIRTIO_BALLOON_S_DIRECT_SCAN: u16 = 13;
71+
const VIRTIO_BALLOON_S_ASYNC_RECLAIM: u16 = 14;
72+
const VIRTIO_BALLOON_S_DIRECT_RECLAIM: u16 = 15;
6773

6874
/// Balloon device related errors.
6975
#[derive(Debug, thiserror::Error, displaydoc::Display)]

src/vmm/src/devices/virtio/balloon/persist.rs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,12 @@ pub struct BalloonStatsState {
4141
disk_caches: Option<u64>,
4242
hugetlb_allocations: Option<u64>,
4343
hugetlb_failures: Option<u64>,
44+
oom_kill: Option<u64>,
45+
alloc_stall: Option<u64>,
46+
async_scan: Option<u64>,
47+
direct_scan: Option<u64>,
48+
async_reclaim: Option<u64>,
49+
direct_reclaim: Option<u64>,
4450
}
4551

4652
impl BalloonStatsState {
@@ -56,6 +62,12 @@ impl BalloonStatsState {
5662
disk_caches: stats.disk_caches,
5763
hugetlb_allocations: stats.hugetlb_allocations,
5864
hugetlb_failures: stats.hugetlb_failures,
65+
oom_kill: stats.oom_kill,
66+
alloc_stall: stats.alloc_stall,
67+
async_scan: stats.async_scan,
68+
direct_scan: stats.direct_scan,
69+
async_reclaim: stats.async_reclaim,
70+
direct_reclaim: stats.direct_reclaim,
5971
}
6072
}
6173

@@ -75,6 +87,12 @@ impl BalloonStatsState {
7587
disk_caches: self.disk_caches,
7688
hugetlb_allocations: self.hugetlb_allocations,
7789
hugetlb_failures: self.hugetlb_failures,
90+
oom_kill: self.oom_kill,
91+
alloc_stall: self.alloc_stall,
92+
async_scan: self.async_scan,
93+
direct_scan: self.direct_scan,
94+
async_reclaim: self.async_reclaim,
95+
direct_reclaim: self.direct_reclaim,
7896
}
7997
}
8098
}
@@ -166,7 +184,6 @@ impl Persist<'_> for Balloon {
166184

167185
#[cfg(test)]
168186
mod tests {
169-
170187
use super::*;
171188
use crate::devices::virtio::device::VirtioDevice;
172189
use crate::devices::virtio::test_utils::{default_interrupt, default_mem};

0 commit comments

Comments
 (0)