let debug_file = ref ""
let csv_enabled = ref false
let csv_cpu = ref true
+let csv_mem = ref true
let csv_block = ref true
let csv_net = ref true
let init_file = ref DefaultInitFile
"-b", Arg.Set batch_mode,
" " ^ s_"Batch mode";
"-c", Arg.String set_uri,
- "uri " ^ s_"Connect to URI (default: Xen)";
+ "uri " ^ s_"Connect to libvirt URI";
"--connect", Arg.String set_uri,
- "uri " ^ s_"Connect to URI (default: Xen)";
+ "uri " ^ s_"Connect to libvirt URI";
"--csv", Arg.String set_csv,
"file " ^ s_"Log statistics to CSV file";
"--no-csv-cpu", Arg.Clear csv_cpu,
" " ^ s_"Disable CPU stats in CSV";
+ "--no-csv-mem", Arg.Clear csv_mem,
+ " " ^ s_"Disable memory stats in CSV";
"--no-csv-block", Arg.Clear csv_block,
" " ^ s_"Disable block device stats in CSV";
"--no-csv-net", Arg.Clear csv_net,
| _, "debug", filename -> debug_file := filename
| _, "csv", filename -> set_csv filename
| _, "csv-cpu", b -> csv_cpu := bool_of_string b
+ | _, "csv-mem", b -> csv_mem := bool_of_string b
| _, "csv-block", b -> csv_block := bool_of_string b
| _, "csv-net", b -> csv_net := bool_of_string b
| _, "batch", b -> batch_mode := bool_of_string b
prerr_endline (Libvirt.Virterror.to_string err);
(* If non-root and no explicit connection URI, print a warning. *)
if Unix.geteuid () <> 0 && name = None then (
- print_endline (s_"NB: If you want to monitor a local Xen hypervisor, you usually need to be root");
+ print_endline (s_"NB: If you want to monitor a local hypervisor, you usually need to be root");
);
exit 1 in
(* The following are since the last slice, or 0 if cannot be calculated: *)
rd_cpu_time : float; (* CPU time used in nanoseconds. *)
rd_percent_cpu : float; (* CPU time as percent of total. *)
+ rd_mem_bytes : int64; (* Memory usage in bytes *)
+ rd_mem_percent: int64; (* Memory usage as percent of total *)
(* The following are since the last slice, or None if cannot be calc'd: *)
rd_block_rd_reqs : int64 option; (* Number of block device read rqs. *)
rd_block_wr_reqs : int64 option; (* Number of block device write rqs. *)
rd_prev_block_stats = prev_block_stats;
rd_prev_interface_stats = prev_interface_stats;
rd_cpu_time = 0.; rd_percent_cpu = 0.;
+ rd_mem_bytes = 0L; rd_mem_percent = 0L;
rd_block_rd_reqs = None; rd_block_wr_reqs = None;
rd_block_rd_bytes = None; rd_block_wr_bytes = None;
rd_block_rd_info = None; rd_block_wr_info = None;
let cpu_time =
Int64.to_float (rd.rd_info.D.cpu_time -^ prev_info.D.cpu_time) in
let percent_cpu = 100. *. cpu_time /. total_cpu in
+ let mem_usage = rd.rd_info.D.memory in
+ let mem_percent =
+ 100L *^ rd.rd_info.D.memory /^ node_info.C.memory in
let rd = { rd with
rd_cpu_time = cpu_time;
- rd_percent_cpu = percent_cpu } in
+ rd_percent_cpu = percent_cpu;
+ rd_mem_bytes = mem_usage;
+ rd_mem_percent = mem_percent} in
name, Active rd
(* For all other domains we can't calculate it, so leave as 0 *)
| rd -> rd
let rx_bytes = Show.int64_option rd.rd_net_rx_bytes in
let tx_bytes = Show.int64_option rd.rd_net_tx_bytes in
let percent_cpu = Show.percent rd.rd_percent_cpu in
- let percent_mem =
- 100L *^ rd.rd_info.D.memory /^ node_info.C.memory in
- let percent_mem = Int64.to_float percent_mem in
+ let percent_mem = Int64.to_float rd.rd_mem_percent in
let percent_mem = Show.percent percent_mem in
let time = Show.time rd.rd_info.D.cpu_time in
(* These fields are repeated for each domain: *)
[ "Domain ID"; "Domain name"; ] @
(if !csv_cpu then [ "CPU (ns)"; "%CPU"; ] else []) @
+ (if !csv_mem then [ "Mem (bytes)"; "%Mem";] else []) @
(if !csv_block && not !block_in_bytes
then [ "Block RDRQ"; "Block WRRQ"; ] else []) @
(if !csv_block && !block_in_bytes
(if !csv_cpu then [
string_of_float rd.rd_cpu_time; string_of_float rd.rd_percent_cpu
] else []) @
+ (if !csv_mem then [
+ Int64.to_string rd.rd_mem_bytes; Int64.to_string rd.rd_mem_percent
+ ] else []) @
(if !csv_block then [
string_of_int64_option rd.rd_block_rd_info;
string_of_int64_option rd.rd_block_wr_info;
let tx_bytes = if rd.rd_net_tx_bytes = None then " 0"
else Show.int64_option rd.rd_net_tx_bytes in
let percent_cpu = Show.percent rd.rd_percent_cpu in
- let percent_mem =
- 100L *^ rd.rd_info.D.memory /^ node_info.C.memory in
- let percent_mem = Int64.to_float percent_mem in
+ let percent_mem = Int64.to_float rd.rd_mem_percent in
let percent_mem = Show.percent percent_mem in
let time = Show.time rd.rd_info.D.cpu_time in
printf "%5d %c %s %s %s %s %s %s %s %s\n"