]> git.proxmox.com Git - pve-common.git/blobdiff - src/PVE/ProcFSTools.pm
PBS client: backup tree: avoid over generic param has
[pve-common.git] / src / PVE / ProcFSTools.pm
index 14c1d6ed8a37700e07cea3e26f9fa5338e24e3db..7687c13c4e30b9d483ebb624c8d522ca8a74ca3d 100644 (file)
@@ -5,6 +5,7 @@ use warnings;
 use POSIX;
 use Time::HiRes qw (gettimeofday);
 use IO::File;
+use List::Util qw(sum);
 use PVE::Tools;
 use Cwd qw();
 
@@ -35,6 +36,7 @@ sub read_cpuinfo {
     my $fh = IO::File->new ($fn, "r");
     return $res if !$fh;
 
+    my $cpuid = 0;
     my $idhash = {};
     my $count = 0;
     while (defined(my $line = <$fh>)) {
@@ -47,7 +49,10 @@ sub read_cpuinfo {
        } elsif ($line =~ m/^flags\s*:\s*(.*)$/) {
            $res->{flags} = $1 if !length $res->{flags};
        } elsif ($line =~ m/^physical id\s*:\s*(\d+)\s*$/i) {
-           $idhash->{$1} = 1;
+           $cpuid = $1;
+           $idhash->{$1} = 1 if not defined($idhash->{$1});
+       } elsif ($line =~ m/^cpu cores\s*:\s*(\d+)\s*$/i) {
+           $idhash->{$cpuid} = $1 if defined($idhash->{$cpuid});
        }
     }
 
@@ -56,6 +61,8 @@ sub read_cpuinfo {
 
     $res->{sockets} = scalar(keys %$idhash) || 1;
 
+    $res->{cores} = sum(values %$idhash) || 1;
+
     $res->{cpus} = $count;
 
     $fh->close;
@@ -80,6 +87,40 @@ sub read_proc_uptime {
     return (0, 0);
 }
 
+sub kernel_version {
+    my $line = PVE::Tools::file_read_firstline("/proc/version");
+
+    if ($line && $line =~ m|^Linux\sversion\s((\d+(?:\.\d+)+)-?(\S+)?)|) {
+        my ($fullversion, $version_numbers, $extra) = ($1, $2, $3);
+
+       # variable names are the one from the Linux kernel Makefile
+       my ($version, $patchlevel, $sublevel) = split(/\./, $version_numbers);
+
+       return wantarray
+           ? (int($version), int($patchlevel), int($sublevel), $extra, $fullversion)
+           : $fullversion;
+    }
+
+    return (0, 0, 0, '', '');
+}
+
+# Check if the kernel is at least $major.$minor. Return either just a boolean,
+# or a boolean and the kernel version's major.minor string from /proc/version
+sub check_kernel_release {
+    my ($major, $minor) = @_;
+
+    my ($k_major, $k_minor) = kernel_version();
+
+    my $ok;
+    if (defined($minor)) {
+       $ok = $k_major > $major || ($k_major == $major && $k_minor >= $minor);
+    } else {
+       $ok = $k_major >= $major;
+    }
+
+    return wantarray ? ($ok, "$k_major.$k_minor") : $ok;
+}
+
 sub read_loadavg {
 
     my $line = PVE::Tools::file_read_firstline('/proc/loadavg');
@@ -91,6 +132,24 @@ sub read_loadavg {
     return wantarray ? (0, 0, 0) : 0;
 }
 
+sub read_pressure {
+
+    my $res = {};
+    foreach my $type (qw(cpu memory io)) {
+       if (my $fh = IO::File->new ("/proc/pressure/$type", "r")) {
+           while (defined (my $line = <$fh>)) {
+               if ($line =~ /^(some|full)\s+avg10\=(\d+\.\d+)\s+avg60\=(\d+\.\d+)\s+avg300\=(\d+\.\d+)\s+total\=(\d+)/) {
+                   $res->{$type}->{$1}->{avg10} = $2;
+                   $res->{$type}->{$1}->{avg60} = $3;
+                   $res->{$type}->{$1}->{avg300} = $4;
+               }
+           }
+           $fh->close;
+       }
+    }
+    return $res;
+}
+
 my $last_proc_stat;
 
 sub read_proc_stat {
@@ -130,9 +189,11 @@ sub read_proc_stat {
        my $useddiff =  $res->{used} - $last_proc_stat->{used};
        $useddiff = $diff if $useddiff > $diff;
        $res->{cpu} = $useddiff/$diff;
+
        my $waitdiff =  $res->{iowait} - $last_proc_stat->{iowait};
        $waitdiff = $diff if $waitdiff > $diff;
        $res->{wait} = $waitdiff/$diff;
+
        $last_proc_stat = $res;
     } else {
        $res->{cpu} = $last_proc_stat->{cpu};
@@ -213,7 +274,7 @@ sub read_meminfo {
     $res->{swapfree} = $d->{swapfree};
     $res->{swapused} = $res->{swaptotal} - $res->{swapfree};
 
-    my $spages = PVE::Tools::file_read_firstline("/sys/kernel/mm/ksm/pages_sharing");
+    my $spages = PVE::Tools::file_read_firstline("/sys/kernel/mm/ksm/pages_sharing") // 0 ;
     $res->{memshared} = int($spages) * 4096;
 
     return $res;