From e7ab4fd7b8b1bc870630b95c8d872131f4a8ea45 Mon Sep 17 00:00:00 2001 From: Kamen Mladenov Date: Wed, 30 Apr 2025 13:44:42 +0300 Subject: feat(zkvms_guest_io): Add hardware information to metrics output --- zkvms_guest_io/Cargo.lock | 252 +++++++++++++++++++++++++++++++++++++++++++++ zkvms_guest_io/Cargo.toml | 3 + zkvms_guest_io/src/main.rs | 65 +++++++++++- 3 files changed, 319 insertions(+), 1 deletion(-) diff --git a/zkvms_guest_io/Cargo.lock b/zkvms_guest_io/Cargo.lock index a602607..88e6a86 100644 --- a/zkvms_guest_io/Cargo.lock +++ b/zkvms_guest_io/Cargo.lock @@ -52,6 +52,12 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "bitflags" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" + [[package]] name = "clap" version = "4.5.31" @@ -98,24 +104,119 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +[[package]] +name = "core-foundation" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "getopts" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14dbbfd5c71d70241ecf9e6f13737f7b5ce823821063188d7e46c41d371eebd5" +dependencies = [ + "unicode-width", +] + [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "io-kit-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617ee6cf8e3f66f3b4ea67a4058564628cde41901316e19f559e14c7c72c5e7b" +dependencies = [ + "core-foundation-sys", + "mach2", +] + [[package]] name = "is_terminal_polyfill" version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + [[package]] name = "json" version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "078e285eafdfb6c4b434e0d31e8cfcb5115b651496faca5749b88fafd4f23bfd" +[[package]] +name = "libc" +version = "0.2.172" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" + +[[package]] +name = "mach2" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" +dependencies = [ + "libc", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "ntapi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" +dependencies = [ + "winapi", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" +dependencies = [ + "bitflags", +] + [[package]] name = "once_cell" version = "1.20.3" @@ -140,6 +241,60 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "smbios-lib" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c18320ad3d997a100cb948fc020111936c530eddfde947f467083730e39e72" +dependencies = [ + "core-foundation", + "core-foundation-sys", + "getopts", + "io-kit-sys", + "libc", + "mach2", + "serde", + "serde_json", +] + [[package]] name = "strsim" version = "0.11.1" @@ -157,18 +312,112 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "sysinfo" +version = "0.34.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4b93974b3d3aeaa036504b8eefd4c039dced109171c1ae973f1dc63b2c7e4b2" +dependencies = [ + "libc", + "memchr", + "ntapi", + "objc2-core-foundation", + "windows", +] + [[package]] name = "unicode-ident" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + [[package]] name = "utf8parse" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" +dependencies = [ + "windows-core", + "windows-targets", +] + +[[package]] +name = "windows-core" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-result", + "windows-targets", +] + +[[package]] +name = "windows-implement" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-result" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" +dependencies = [ + "windows-targets", +] + [[package]] name = "windows-sys" version = "0.59.0" @@ -247,5 +496,8 @@ name = "zkvms_guest_io" version = "0.1.0" dependencies = [ "clap", + "itertools", "json", + "smbios-lib", + "sysinfo", ] diff --git a/zkvms_guest_io/Cargo.toml b/zkvms_guest_io/Cargo.toml index ce255d2..3ce76c7 100644 --- a/zkvms_guest_io/Cargo.toml +++ b/zkvms_guest_io/Cargo.toml @@ -5,4 +5,7 @@ edition = "2021" [dependencies] clap = { version = "4.5.31", features = ["derive"] } +itertools = "0.14.0" json = "0.12.4" +smbios-lib = "0.9.2" +sysinfo = "0.34.2" diff --git a/zkvms_guest_io/src/main.rs b/zkvms_guest_io/src/main.rs index 23b7aef..0b01e60 100644 --- a/zkvms_guest_io/src/main.rs +++ b/zkvms_guest_io/src/main.rs @@ -3,6 +3,9 @@ use std::process::{Command, Stdio}; use json::{object, parse, JsonValue, Null}; use std::io::{Error, Write}; use std::fs::{read_to_string, OpenOptions}; +use smbioslib::*; +use sysinfo::System; +use itertools::Itertools; /// A CLI tool for running and benchmarking a guest program inside all /// supported zkVMs. @@ -56,9 +59,69 @@ fn main() { let ignored = cli.ignore.unwrap_or(Vec::new()); let mut runs = object! { - "benchmarking": [] + "benchmarking": [], + "hardware": { + cpu: [], + memory: { + model: Null, + size: 0, + speed: Null, + }, + hardwareAcceleration: [], + accelerated: false + }, }; + // Always available information + let sys = System::new_all(); + + let cpus = sys.cpus().into_iter().unique_by(|c| c.brand()).collect::>(); + for cpu in cpus { + let mut hcpu = JsonValue::new_object(); + + hcpu["model"] = cpu.brand().into(); + // This core count will be wrong in case the system has more than one CPUs + hcpu["cores"] = System::physical_core_count().unwrap_or(0).into(); + hcpu["speed"] = cpu.frequency().into(); + + runs["hardware"]["cpu"].push(hcpu); + } + + runs["hardware"]["memory"]["size"] = sys.total_memory().into(); + + // Available with root permissions + // Note: it is not enough to just run the executable with sudo. runexec connects + // to DBus, so you'll need a proper root user session. + // Either login through another TTY as root, or use `machinectl shell root@` + if let Ok(sys) = table_load_from_device() { + // Fix CPU core counts + let cpus = sys.filter(|cpu: &SMBiosProcessorInformation| true).collect::>(); + for mut hcpu in runs["hardware"]["cpu"].members_mut() { + if let Some(cpu) = cpus.iter().find(|cpu| + if let Some(ver) = cpu.processor_version().ok() { + ver.trim() == hcpu["model"].to_string().trim() + } + else { + false + } + ) { + if let Some(CoreCount::Count(cores)) = cpu.core_count() { + hcpu["cores"] = cores.into(); + } + } + } + + // Add memory model and speed + if let Some(memory) = sys.find_map(|memory: SMBiosMemoryDevice| Some(memory)) { + if let Some(model) = memory.part_number().ok() { + runs["hardware"]["memory"]["model"] = model.trim().into(); + } + if let Some(MemorySpeed::MTs(speed)) = memory.speed() { + runs["hardware"]["memory"]["speed"] = speed.into(); + } + } + } + 'guest_iter: for zkvm_guest_command in zkvm_guest_commands.into_iter() { if ignored.iter().any(|i| zkvm_guest_command.contains(i)) { continue; -- cgit v1.2.3