Track memory usage in simulation

This commit is contained in:
Vecna 2024-06-04 06:26:58 -04:00
parent 461d7d4ce5
commit 3469fa67a4
3 changed files with 69 additions and 2 deletions

View File

@ -25,6 +25,7 @@ julianday = "1.2.0"
lazy_static = "1"
lox_cli = { path = "../lox_cli", version = "0.1", optional = true }
lox-library = { git = "https://gitlab.torproject.org/vecna/lox.git", version = "0.1.0" }
memory-stats = { version = "1.0.0", optional = true }
nalgebra = "0.29"
rand = { version = "0.8" }
#select = "0.6.0"
@ -45,7 +46,7 @@ base64 = "0.21.7"
faketime = "0.2"
[features]
simulation = ["faketime", "lox_cli"]
simulation = ["faketime", "lox_cli", "memory-stats"]
[[bin]]
name = "simulation"

View File

@ -18,6 +18,7 @@ use troll_patrol::{
use clap::Parser;
use lox_cli::{networking::*, *};
use lox_library::proto::{level_up::LEVEL_INTERVAL, trust_promotion::UNTRUSTED_INTERVAL};
use memory_stats::memory_stats;
use rand::{prelude::SliceRandom, Rng};
use serde::Deserialize;
use std::{
@ -223,9 +224,33 @@ pub async fn main() {
let mut true_neg = 0;
let mut true_pos = 0;
// Track memory use during simulation
let mut max_physical_mem = 0;
let mut max_virtual_mem = 0;
// Main loop
for day in 1..=config.num_days {
println!("Starting day {} of the simulation", day);
println!(
"We have {} users and {} bridges",
users.len(),
bridges.len()
);
println!(
"The censor has learned {} bridges",
censor.known_bridges.len()
);
if let Some(usage) = memory_stats() {
if usage.physical_mem > max_physical_mem {
max_physical_mem = usage.physical_mem;
}
if usage.virtual_mem > max_virtual_mem {
max_virtual_mem = usage.virtual_mem;
}
} else {
println!("Failed to get the current memory usage");
}
// USER TASKS
@ -305,7 +330,6 @@ pub async fn main() {
let new_blockages: HashMap<String, HashSet<String>> =
serde_json::from_slice(&new_blockages_resp).unwrap();
// TODO: Track more stats about new blockages
// Since we have only one censor, just convert to a set of bridges
let mut blocked_bridges = HashSet::<[u8; 20]>::new();
for (bridge, ccs) in new_blockages {
@ -356,11 +380,30 @@ pub async fn main() {
increment_simulated_date();
}
// Print various information about the simulation run
println!(
"\nSimulation ended with {} users and {} bridges",
users.len(),
bridges.len()
);
println!("The censor learned {} bridges", censor.known_bridges.len());
println!(
"\nMaximum physical memory usage during simulation: {}",
max_physical_mem
);
println!(
"Maximum virtual memory usage during simulation: {}\n",
max_virtual_mem
);
println!("True Positives: {}", true_pos);
println!("True Negatives: {}", true_neg);
println!("False Positives: {}", false_pos);
println!("False Negatives: {}", false_neg);
println!("\nFull stats per bridge:");
println!(
"Fingerprint,first_distributed,first_blocked,first_detected_blocked,first_positive_report"
);

View File

@ -27,6 +27,9 @@ use tokio::{
#[cfg(not(feature = "simulation"))]
use tokio_cron::{Job, Scheduler};
#[cfg(feature = "simulation")]
use memory_stats::memory_stats;
async fn shutdown_signal() {
tokio::signal::ctrl_c()
.await
@ -151,12 +154,27 @@ async fn context_manager(
max_historical_days: u32,
mut context_rx: mpsc::Receiver<Command>,
) {
#[cfg(feature = "simulation")]
let (mut max_physical_mem, mut max_virtual_mem) = (0, 0);
let db: Db = sled::open(&db_config.db_path).unwrap();
// Create negative report key for today if we don't have one
new_negative_report_key(&db, get_date());
while let Some(cmd) = context_rx.recv().await {
#[cfg(feature = "simulation")]
if let Some(usage) = memory_stats() {
if usage.physical_mem > max_physical_mem {
max_physical_mem = usage.physical_mem;
}
if usage.virtual_mem > max_virtual_mem {
max_virtual_mem = usage.virtual_mem;
}
} else {
println!("Failed to get the current memory usage");
}
use Command::*;
match cmd {
Request { req, sender } => {
@ -170,6 +188,11 @@ async fn context_manager(
println!("Sending Shutdown Signal, all threads should shutdown.");
drop(shutdown_sig);
println!("Shutdown Sent.");
#[cfg(feature = "simulation")]
println!(
"\nMaximum physical memory usage: {}\nMaximum virtual memory usage: {}\n",
max_physical_mem, max_virtual_mem
);
}
Update { _req, sender } => {
let blockages = update_daily_info(