balloond: tune defaults: critical floor 256m, bias 400m

Now that critical_guest_available is a hard floor, lower it from 400m
to 256m (guests can safely operate with 256 MiB free). Increase
guest_available_bias from 300m to 400m for stronger graduated
resistance as the balloon fills, keeping the comfortable equilibrium
point around 656 MiB.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Davíð Steinn Geirsson 2026-02-18 21:31:13 +00:00
parent 4791e391f0
commit 2880cbcdc4
4 changed files with 15 additions and 15 deletions

View file

@ -171,8 +171,8 @@ Dynamic balloon memory management for all VMs:
--min-poll-interval <DURATION> Min poll interval under pressure (default: 250ms)
--psi-ceiling <PERCENT> PSI avg10 % for min interval (default: 25)
--critical-host-percent <PERCENT> Host critical threshold, % of RAM (default: 5)
--critical-guest-available <SIZE> Guest critical threshold, hard floor for free memory (default: 400m)
--guest-available-bias <SIZE> Guest bias term, soft cushion above floor (default: 300m)
--critical-guest-available <SIZE> Guest critical threshold, hard floor for free memory (default: 256m)
--guest-available-bias <SIZE> Guest bias term, soft cushion above floor (default: 400m)
--log-level <LEVEL> error, warn, info, debug, trace (default: warn)
--quiet Suppress all log output
```
@ -234,8 +234,8 @@ to fixed interval if PSI is unavailable.
minPollInterval = "250ms";
psiCeiling = 25;
criticalHostPercent = 5;
criticalGuestAvailable = "400m";
guestAvailableBias = "300m";
criticalGuestAvailable = "256m";
guestAvailableBias = "400m";
};
# Tray proxy configuration

View file

@ -155,8 +155,8 @@ For mpv, make sure you use `--vo=wlshm`. Other backends probably won't work.
| `vmsilo-balloond.minPollInterval` | string | `"250ms"` | Min poll interval under memory pressure |
| `vmsilo-balloond.psiCeiling` | int | `25` | PSI avg10 % that maps to minimum poll interval |
| `vmsilo-balloond.criticalHostPercent` | int | `5` | Host critical threshold as percentage of total RAM |
| `vmsilo-balloond.criticalGuestAvailable` | string | `"400m"` | Guest critical threshold — hard floor for guest free memory |
| `vmsilo-balloond.guestAvailableBias` | string | `"300m"` | Guest bias term — soft cushion above floor that scales with balloon fullness |
| `vmsilo-balloond.criticalGuestAvailable` | string | `"256m"` | Guest critical threshold — hard floor for guest free memory |
| `vmsilo-balloond.guestAvailableBias` | string | `"400m"` | Guest bias term — soft cushion above floor that scales with balloon fullness |
| `vmsilo-balloond.extraArgs` | list of strings | `[]` | Extra command line arguments for vmsilo-balloond daemon |
| `vmsilo-tray.logLevel` | string | `"info"` | Log level for tray proxy host and guest daemons (error, warn, info, debug, trace) |
| `isolatedPciDevices` | list of strings | `[]` | PCI devices to isolate with vfio-pci |

View file

@ -620,14 +620,14 @@ in
criticalGuestAvailable = lib.mkOption {
type = lib.types.str;
default = "400m";
description = "Guest critical threshold hard floor for guest free memory. Balloon inflation will never push guest free memory below this value (e.g. \"400m\", \"256m\").";
example = "256m";
default = "256m";
description = "Guest critical threshold hard floor for guest free memory. Balloon inflation will never push guest free memory below this value (e.g. \"256m\", \"400m\").";
example = "400m";
};
guestAvailableBias = lib.mkOption {
type = lib.types.str;
default = "300m";
default = "400m";
description = "Guest bias term soft cushion above the critical floor that scales with balloon fullness, discouraging inflation as the guest approaches the floor (e.g. \"300m\", \"500m\").";
example = "500m";
};

View file

@ -83,11 +83,11 @@ pub struct Args {
/// Guest critical threshold — hard floor for guest free memory (e.g. "400m", "256m").
/// Balloon inflation is never allowed to push guest free memory below this value.
#[arg(long, value_parser = parse_size, default_value = "400m")]
#[arg(long, value_parser = parse_size, default_value = "256m")]
pub critical_guest_available: u64,
/// Guest bias term (e.g. "300m", "314572800").
#[arg(long, value_parser = parse_size, default_value = "300m")]
/// Guest bias term (e.g. "400m", "314572800").
#[arg(long, value_parser = parse_size, default_value = "400m")]
pub guest_available_bias: u64,
/// Log level (error, warn, info, debug, trace).
@ -205,8 +205,8 @@ mod tests {
assert_eq!(args.min_poll_interval, Duration::from_millis(250));
assert_eq!(args.psi_ceiling, 25);
assert_eq!(args.critical_host_percent, 5);
assert_eq!(args.critical_guest_available, 400 * 1024 * 1024);
assert_eq!(args.guest_available_bias, 300 * 1024 * 1024);
assert_eq!(args.critical_guest_available, 256 * 1024 * 1024);
assert_eq!(args.guest_available_bias, 400 * 1024 * 1024);
assert_eq!(args.log_level, LogLevel::Warn);
}