X-Git-Url: https://git.proxmox.com/?p=pve-common.git;a=blobdiff_plain;f=src%2FPVE%2FProcFSTools.pm;h=7687c13c4e30b9d483ebb624c8d522ca8a74ca3d;hp=79d4a4c86d8d1a1df1112d8a68391aa6a7ac2b06;hb=HEAD;hpb=c140206bf8ef51dd7d07089e1b03bd98edeb8754 diff --git a/src/PVE/ProcFSTools.pm b/src/PVE/ProcFSTools.pm index 79d4a4c..3826fcc 100644 --- a/src/PVE/ProcFSTools.pm +++ b/src/PVE/ProcFSTools.pm @@ -2,14 +2,15 @@ package PVE::ProcFSTools; use strict; use warnings; -use POSIX; -use Time::HiRes qw (gettimeofday); + +use Cwd qw(); use IO::File; use List::Util qw(sum); -use PVE::Tools; -use Cwd qw(); - +use POSIX; use Socket qw(PF_INET PF_INET6 SOCK_DGRAM IPPROTO_IP); +use Time::HiRes qw (gettimeofday); + +use PVE::Tools; use constant IFF_UP => 1; use constant IFNAMSIZ => 16; @@ -168,18 +169,18 @@ sub read_proc_stat { if (my $fh = IO::File->new ("/proc/stat", "r")) { while (defined (my $line = <$fh>)) { - if ($line =~ m|^cpu\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)|) { - $res->{user} = $1 - $9; - $res->{nice} = $2 - $10; + if ($line =~ m|^cpu\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)(?:\s+(\d+)\s+(\d+))?|) { + $res->{user} = $1 - ($9 // 0); + $res->{nice} = $2 - ($10 // 0); $res->{system} = $3; $res->{idle} = $4; - $res->{used} = $1+$2+$3; + $res->{used} = $1+$2+$3+$6+$7+$8; $res->{iowait} = $5; $res->{irq} = $6; $res->{softirq} = $7; $res->{steal} = $8; - $res->{guest} = $9; - $res->{guest_nice} = $10; + $res->{guest} = $9 // 0; + $res->{guest_nice} = $10 // 0; } elsif ($line =~ m|^cpu\d+\s|) { $cpucount++; } @@ -214,11 +215,15 @@ sub read_proc_stat { if ($diff > 1000) { # don't update too often my $useddiff = $res->{used} - $last_proc_stat->{used}; $useddiff = $diff if $useddiff > $diff; - $res->{cpu} = $useddiff/$diff; + + my $totaldiff = $res->{total} - $last_proc_stat->{total}; + $totaldiff = $diff if $totaldiff > $diff; + + $res->{cpu} = $useddiff/$totaldiff; my $waitdiff = $res->{iowait} - $last_proc_stat->{iowait}; $waitdiff = $diff if $waitdiff > $diff; - $res->{wait} = $waitdiff/$diff; + $res->{wait} = $waitdiff/$totaldiff; $last_proc_stat = $res; } else { @@ -279,6 +284,7 @@ sub read_meminfo { swaptotal => 0, swapfree => 0, swapused => 0, + arcsize => 0, }; my $fh = IO::File->new ("/proc/meminfo", "r"); @@ -303,6 +309,11 @@ sub read_meminfo { my $spages = PVE::Tools::file_read_firstline("/sys/kernel/mm/ksm/pages_sharing") // 0 ; $res->{memshared} = int($spages) * 4096; + my $arc_stats = eval { PVE::Tools::file_get_contents("/proc/spl/kstat/zfs/arcstats") }; + if ($arc_stats && $arc_stats =~ m/^size\s+\d+\s+(\d+)$/m) { + $res->{arcsize} = int($1); + } + return $res; } @@ -348,10 +359,10 @@ sub read_proc_net_dev { sub write_proc_entry { my ($filename, $data) = @_;# - my $fh = IO::File->new($filename, O_WRONLY); + my $fh = IO::File->new($filename, O_WRONLY); die "unable to open file '$filename' - $!\n" if !$fh; - die "unable to write '$filename' - $!\n" unless print $fh $data; - die "closing file '$filename' failed - $!\n" unless close $fh; + print $fh $data or die "unable to write '$filename' - $!\n"; + close $fh or die "closing file '$filename' failed - $!\n"; $fh->close(); }