Last active
September 25, 2018 12:55
-
-
Save tetsu-koba/ae919c8e64bd96d527740e705c5f4c88 to your computer and use it in GitHub Desktop.
Linuxでネットワークインタフェースの活動状況を調べる by Rust ref: https://qiita.com/tetsu_koba/items/919337fd4ac4f173e56a
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[dependencies] | |
schedule_recv = "0.1" | |
chrono = "0.4" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$ ls /sys/class/net/ | |
enp0s31f6 enx00051bd1473c lo wlp4s0 | |
$ cargo run enp0s31f6 | |
Finished dev [unoptimized + debuginfo] target(s) in 0.01s | |
Running `target/debug/net_activity enp0s31f6` | |
t=1537868984, tx=405623729, rx=98837205807, tx/s=0.0 KB/s, rx/s=0.1 KB/s | |
t=1537868986, tx=405623729, rx=98837206182, tx/s=0.0 KB/s, rx/s=0.2 KB/s | |
t=1537868988, tx=405623930, rx=98837208653, tx/s=0.1 KB/s, rx/s=1.2 KB/s | |
t=1537868990, tx=405624302, rx=98837209502, tx/s=0.2 KB/s, rx/s=0.4 KB/s | |
^C |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
use std::env; | |
use std::fs; | |
extern crate chrono; | |
extern crate schedule_recv; | |
use schedule_recv::periodic_ms; | |
fn read_transfer_bytes(f: &str) -> u64 { | |
match fs::read_to_string(f) { | |
Ok(s) => s.trim().parse().unwrap_or(0), | |
Err(err) => { | |
panic!("Failed to read:{} Err={:?}", f, err); | |
} | |
} | |
} | |
fn net_activity(ifname: &str) { | |
let interval = 2000; | |
let txf = &format!("/sys/class/net/{}/statistics/tx_bytes", ifname); | |
let rxf = &format!("/sys/class/net/{}/statistics/rx_bytes", ifname); | |
let tick = periodic_ms(interval); | |
let mut tx_prev = read_transfer_bytes(txf); | |
let mut rx_prev = read_transfer_bytes(rxf); | |
let td = interval as f64 * 1e-3; | |
loop { | |
tick.recv().unwrap(); | |
let tx = read_transfer_bytes(txf); | |
let rx = read_transfer_bytes(rxf); | |
println!( | |
"t={}, tx={}, rx={}, tx/s={:.1} KB/s, rx/s={:.1} KB/s", | |
chrono::Utc::now().timestamp(), | |
tx, | |
rx, | |
((tx - tx_prev) as f64) / td / 1024f64, | |
((rx - rx_prev) as f64) / td / 1024f64 | |
); | |
tx_prev = tx; | |
rx_prev = rx; | |
} | |
} | |
fn main() { | |
let args: Vec<String> = env::args().collect(); | |
if args.len() < 2 { | |
eprintln!("Usage: {} ifname", args[0]); | |
eprintln!(" For example, {} eth0", args[0]); | |
eprintln!(" You can find ifname by `ls /sys/class/net`"); | |
return; | |
} | |
net_activity(&args[1]); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment