#!/usr/bin/perl
my
$addr
=
@ARGV
?
shift
@ARGV
:
""
;
my
$hv
= Sys::Virt->new(
address
=>
$addr
,
readonly
=> 1);
my
$interval
=
@ARGV
?
shift
@ARGV
: 1;
my
$iterations
=
@ARGV
?
shift
@ARGV
: 1;
my
$nodeinfo
=
$hv
->get_node_info();
my
$ncpus
=
$nodeinfo
->{cpus};
my
@cpuTime
;
my
$then
;
for
(
my
$c
= 0 ;
$c
<
$ncpus
;
$c
++) {
printf
"CPU %3d "
,
$c
;
}
print
"\n"
;
for
(
my
$i
= 0 ;
$i
<
$iterations
;
$i
++) {
sleep
$interval
if
$i
;
my
$now
=
time
;
for
(
my
$c
= 0 ;
$c
<
$ncpus
;
$c
++) {
my
$info
=
$hv
->get_node_cpu_stats(
$c
);
my
$used
=
$info
->{kernel} +
$info
->{user};
if
(
exists
$cpuTime
[
$c
]) {
my
$cpudelta
=
$used
-
$cpuTime
[
$c
];
my
$timedelta
= (
$now
-
$then
) * 1000*1000*1000;
my
$util
=
$cpudelta
* 100 /
$timedelta
;
printf
"%03.02f%% "
,
$util
;
}
$cpuTime
[
$c
] =
$used
;
}
print
"\n"
;
$then
=
$now
;
}
my
(
$totcpus
,
$onlinemask
,
$nonline
) =
$hv
->get_node_cpu_map();
printf
"CPUs total %d, online %d\n"
,
$totcpus
,
$nonline
;
my
@bits
=
split
(//,
unpack
(
"b*"
,
$onlinemask
));
for
(
my
$i
= 0 ;
$i
<
$totcpus
;
$i
++) {
printf
" %d: %d\n"
,
$i
,
$bits
[
$i
];
}