|
1 | 1 | use combine::parser::EasyParser; |
2 | 2 | use criterion::{Criterion, criterion_group, criterion_main}; |
3 | 3 | use lustre_collector::quota::parse as combine_parse; |
| 4 | +use memory_benchmarking::{BencherOutput, MemoryUsage, aggregate_samples, get_memory_stats}; |
4 | 5 | use std::{fs::File, io::Read, time::Duration}; |
5 | | -use sysinfo::{Pid, ProcessExt, System, SystemExt}; |
6 | | - |
7 | | -#[derive(serde::Serialize)] |
8 | | -struct BencherOutput { |
9 | | - memory_usage: BencherMetrics, |
10 | | -} |
11 | | - |
12 | | -#[derive(serde::Serialize)] |
13 | | -struct BencherMetrics { |
14 | | - start_rss_mib: MetricEntry, |
15 | | - peak_rss_mib: MetricEntry, |
16 | | - end_rss_mib: MetricEntry, |
17 | | - memory_growth_mib: MetricEntry, |
18 | | - peak_over_start_rss_ratio: MetricEntry, |
19 | | - avg_runtime_rss_mib: MetricEntry, |
20 | | - start_virtual_mib: MetricEntry, |
21 | | - peak_virtual_mib: MetricEntry, |
22 | | - end_virtual_mib: MetricEntry, |
23 | | - virtual_growth_mib: MetricEntry, |
24 | | - peak_over_start_virtual_ratio: MetricEntry, |
25 | | - avg_runtime_virtual_mib: MetricEntry, |
26 | | -} |
27 | | - |
28 | | -#[derive(serde::Serialize)] |
29 | | -struct MetricEntry { |
30 | | - value: f64, |
31 | | - #[serde(skip_serializing_if = "Option::is_none")] |
32 | | - lower_value: Option<f64>, |
33 | | - #[serde(skip_serializing_if = "Option::is_none")] |
34 | | - upper_value: Option<f64>, |
35 | | -} |
36 | | - |
37 | | -#[derive(Clone, Debug, serde::Serialize)] |
38 | | -struct MemoryUsage { |
39 | | - start_rss: f64, |
40 | | - end_rss: f64, |
41 | | - memory_growth: f64, |
42 | | - peak_over_start_rss_ratio: f64, |
43 | | - avg_rss: f64, |
44 | | - min_rss: f64, |
45 | | - max_rss: f64, |
46 | | - start_virtual: f64, |
47 | | - end_virtual: f64, |
48 | | - virtual_growth: f64, |
49 | | - peak_over_start_virtual_ratio: f64, |
50 | | - avg_virtual: f64, |
51 | | - min_virtual: f64, |
52 | | - max_virtual: f64, |
53 | | -} |
54 | | - |
55 | | -impl From<MemoryUsage> for BencherOutput { |
56 | | - fn from(x: MemoryUsage) -> Self { |
57 | | - BencherOutput { |
58 | | - memory_usage: BencherMetrics { |
59 | | - start_rss_mib: MetricEntry { |
60 | | - value: x.start_rss, |
61 | | - lower_value: None, |
62 | | - upper_value: None, |
63 | | - }, |
64 | | - peak_rss_mib: MetricEntry { |
65 | | - value: x.max_rss, |
66 | | - lower_value: None, |
67 | | - upper_value: None, |
68 | | - }, |
69 | | - end_rss_mib: MetricEntry { |
70 | | - value: x.end_rss, |
71 | | - lower_value: None, |
72 | | - upper_value: None, |
73 | | - }, |
74 | | - memory_growth_mib: MetricEntry { |
75 | | - value: x.memory_growth, |
76 | | - lower_value: None, |
77 | | - upper_value: None, |
78 | | - }, |
79 | | - peak_over_start_rss_ratio: MetricEntry { |
80 | | - value: x.peak_over_start_rss_ratio, |
81 | | - lower_value: None, |
82 | | - upper_value: None, |
83 | | - }, |
84 | | - avg_runtime_rss_mib: MetricEntry { |
85 | | - value: x.avg_rss, |
86 | | - lower_value: Some(x.min_rss), |
87 | | - upper_value: Some(x.max_rss), |
88 | | - }, |
89 | | - start_virtual_mib: MetricEntry { |
90 | | - value: x.start_virtual, |
91 | | - lower_value: None, |
92 | | - upper_value: None, |
93 | | - }, |
94 | | - peak_virtual_mib: MetricEntry { |
95 | | - value: x.max_virtual, |
96 | | - lower_value: None, |
97 | | - upper_value: None, |
98 | | - }, |
99 | | - end_virtual_mib: MetricEntry { |
100 | | - value: x.end_virtual, |
101 | | - lower_value: None, |
102 | | - upper_value: None, |
103 | | - }, |
104 | | - virtual_growth_mib: MetricEntry { |
105 | | - value: x.virtual_growth, |
106 | | - lower_value: None, |
107 | | - upper_value: None, |
108 | | - }, |
109 | | - peak_over_start_virtual_ratio: MetricEntry { |
110 | | - value: x.peak_over_start_virtual_ratio, |
111 | | - lower_value: None, |
112 | | - upper_value: None, |
113 | | - }, |
114 | | - avg_runtime_virtual_mib: MetricEntry { |
115 | | - value: x.avg_virtual, |
116 | | - lower_value: Some(x.min_virtual), |
117 | | - upper_value: Some(x.max_virtual), |
118 | | - }, |
119 | | - }, |
120 | | - } |
121 | | - } |
122 | | -} |
123 | | - |
124 | | -fn get_memory_stats() -> (f64, f64) { |
125 | | - let mut system = System::new(); |
126 | | - system.refresh_process(Pid::from(std::process::id() as usize)); |
127 | | - |
128 | | - if let Some(process) = system.process(Pid::from(std::process::id() as usize)) { |
129 | | - (process.memory() as f64, process.virtual_memory() as f64) |
130 | | - } else { |
131 | | - (0.0, 0.0) |
132 | | - } |
133 | | -} |
134 | 6 |
|
135 | 7 | async fn test_combine_with_mem(buffer: &str) -> MemoryUsage { |
136 | 8 | let (start_rss, start_virtual) = get_memory_stats(); |
@@ -260,62 +132,5 @@ pub fn combine_memory(c: &mut Criterion) { |
260 | 132 | } |
261 | 133 | } |
262 | 134 |
|
263 | | -fn aggregate_samples(samples: &[MemoryUsage]) -> MemoryUsage { |
264 | | - let size = samples.len() as f64; |
265 | | - const MIB_CONVERSION_FACTOR: f64 = 1_048_576.0; |
266 | | - |
267 | | - MemoryUsage { |
268 | | - start_rss: samples.iter().map(|x| x.start_rss).sum::<f64>() / size / MIB_CONVERSION_FACTOR, |
269 | | - end_rss: samples.iter().map(|x| x.end_rss).sum::<f64>() / size / MIB_CONVERSION_FACTOR, |
270 | | - memory_growth: samples.iter().map(|x| x.memory_growth).sum::<f64>() |
271 | | - / size |
272 | | - / MIB_CONVERSION_FACTOR, |
273 | | - peak_over_start_rss_ratio: samples |
274 | | - .iter() |
275 | | - .map(|x| x.peak_over_start_rss_ratio) |
276 | | - .sum::<f64>() |
277 | | - / size, |
278 | | - avg_rss: samples.iter().map(|x| x.avg_rss).sum::<f64>() / size / MIB_CONVERSION_FACTOR, |
279 | | - min_rss: samples |
280 | | - .iter() |
281 | | - .map(|x| x.min_rss) |
282 | | - .fold(f64::INFINITY, f64::min) |
283 | | - / MIB_CONVERSION_FACTOR, |
284 | | - max_rss: samples |
285 | | - .iter() |
286 | | - .map(|x| x.max_rss) |
287 | | - .fold(f64::NEG_INFINITY, f64::max) |
288 | | - / MIB_CONVERSION_FACTOR, |
289 | | - |
290 | | - start_virtual: samples.iter().map(|x| x.start_virtual).sum::<f64>() |
291 | | - / size |
292 | | - / MIB_CONVERSION_FACTOR, |
293 | | - end_virtual: samples.iter().map(|x| x.end_virtual).sum::<f64>() |
294 | | - / size |
295 | | - / MIB_CONVERSION_FACTOR, |
296 | | - virtual_growth: samples.iter().map(|x| x.virtual_growth).sum::<f64>() |
297 | | - / size |
298 | | - / MIB_CONVERSION_FACTOR, |
299 | | - peak_over_start_virtual_ratio: samples |
300 | | - .iter() |
301 | | - .map(|x| x.peak_over_start_virtual_ratio) |
302 | | - .sum::<f64>() |
303 | | - / size, |
304 | | - avg_virtual: samples.iter().map(|x| x.avg_virtual).sum::<f64>() |
305 | | - / size |
306 | | - / MIB_CONVERSION_FACTOR, |
307 | | - min_virtual: samples |
308 | | - .iter() |
309 | | - .map(|x| x.min_virtual) |
310 | | - .fold(f64::INFINITY, f64::min) |
311 | | - / MIB_CONVERSION_FACTOR, |
312 | | - max_virtual: samples |
313 | | - .iter() |
314 | | - .map(|x| x.max_virtual) |
315 | | - .fold(f64::NEG_INFINITY, f64::max) |
316 | | - / MIB_CONVERSION_FACTOR, |
317 | | - } |
318 | | -} |
319 | | - |
320 | 135 | criterion_group!(benches, combine_memory); |
321 | 136 | criterion_main!(benches); |
0 commit comments