From 148a1163f9a73db5a2a459ef7693df462f24c50d Mon Sep 17 00:00:00 2001 From: Bjango Date: Tue, 8 Nov 2016 09:18:32 +1100 Subject: [PATCH] FreeBSD changes Fixed memory monitoring on FreeBSD 11 .kvm monitoring improvements. --- configure.ac | 2 +- src/Stats.cpp | 16 +++++++++ src/stats/StatBase.h | 4 +++ src/stats/StatsMemory.cpp | 70 +++++++++++++++++++++++++----------- src/stats/StatsProcesses.cpp | 8 ----- src/stats/StatsProcesses.h | 2 +- 6 files changed, 71 insertions(+), 31 deletions(-) diff --git a/configure.ac b/configure.ac index a61c4dd..1e3900d 100644 --- a/configure.ac +++ b/configure.ac @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ([2.59]) -AC_INIT([istatserver], [3.0], [http://github.com/bjango/istatserverlinux/issues]) +AC_INIT([istatserver], [3.01], [http://github.com/bjango/istatserverlinux/issues]) AM_INIT_AUTOMAKE([foreign subdir-objects]) AM_MAINTAINER_MODE AC_CANONICAL_HOST diff --git a/src/Stats.cpp b/src/Stats.cpp index 895b70b..3419798 100644 --- a/src/Stats.cpp +++ b/src/Stats.cpp @@ -101,6 +101,22 @@ void Stats::startStats() } #endif + #ifdef HAVE_LIBKVM + kvm_t *kd; + if ((kd = kvm_open(NULL, NULL, NULL, O_RDONLY, NULL)) != NULL) + { + cpuStats.kd = kd; + loadStats.kd = kd; + memoryStats.kd = kd; + activityStats.kd = kd; + sensorStats.kd = kd; + networkStats.kd = kd; + diskStats.kd = kd; + batteryStats.kd = kd; + processStats.kd = kd; + } + #endif + #ifdef USE_SQLITE if(historyEnabled == true) { diff --git a/src/stats/StatBase.h b/src/stats/StatBase.h index bf9e258..b757553 100644 --- a/src/stats/StatBase.h +++ b/src/stats/StatBase.h @@ -286,6 +286,10 @@ class StatsBase bool historyEnabled; bool debugLogging; + #ifdef HAVE_LIBKVM + kvm_t *kd; + #endif + #ifdef USE_SQLITE std::vector databaseQueue; Database _database; diff --git a/src/stats/StatsMemory.cpp b/src/stats/StatsMemory.cpp index 7d116c8..c2a9f72 100644 --- a/src/stats/StatsMemory.cpp +++ b/src/stats/StatsMemory.cpp @@ -105,7 +105,7 @@ void StatsMemory::update(long long sampleID) addSample(_mem, sampleID); } -#elif defined(USE_MEM_SYSCTLBYNAME) && defined(HAVE_SYSCTLBYNAME) +#elif defined(HAVE_SYSCTLBYNAME) && (defined(USE_MEM_SYSCTLBYNAME) || (defined(__FreeBSD__) && __FreeBSD__ >= 11)) void StatsMemory::init() { @@ -120,6 +120,9 @@ void StatsMemory::init() databaseKeys.push_back("swaptotal"); databaseKeys.push_back("swapused"); + databaseKeys.push_back("swapin"); + databaseKeys.push_back("swapout"); + databaseMap.push_back(memory_value_total); databaseMap.push_back(memory_value_free); databaseMap.push_back(memory_value_active); @@ -131,6 +134,9 @@ void StatsMemory::init() databaseMap.push_back(memory_value_swaptotal); databaseMap.push_back(memory_value_swapused); + databaseMap.push_back(memory_value_swapin); + databaseMap.push_back(memory_value_swapout); + _init(); } @@ -139,7 +145,7 @@ void StatsMemory::update(long long sampleID) mem_data _mem; prepareSample(&_mem); - u_int _total, _inactive, _free, _active, _cached, _wired, _swaptotal, _swapused; + u_int _total, _inactive, _free, _active, _cached, _wired, _swaptotal, _swapused, _swapin, _swapout; long _buf; int pagesize = getpagesize(); @@ -170,10 +176,30 @@ void StatsMemory::update(long long sampleID) if (sysctlbyname("vm.swap_anon_use", &_swapused, &len, NULL, 0) < 0) _swapused = 0; + if (sysctlbyname("vm.stats.vm.v_swappgsin", &_swapin, &len, NULL, 0) < 0) + _swapin = 0; + + if (sysctlbyname("vm.stats.vm.v_swappgsout", &_swapout, &len, NULL, 0) < 0) + _swapout = 0; + + + len = sizeof(_buf); if (sysctlbyname("vfs.bufspace", &_buf, &len, NULL, 0) < 0) _buf = 0; + if(_buf == 0) + { + size_t bufsizelen; + long bufsize; + bufsizelen = sizeof(bufsize); + + if (sysctlbyname("kern.nbuf", &bufsize, &bufsizelen, NULL, 0) >= 0) + { + _buf = ((bufsize * 16) * 1024); + } + } + _mem.values[memory_value_total] = (double)(_total * pagesize); _mem.values[memory_value_free] = (double)(_free * pagesize); _mem.values[memory_value_active] = (double)(_active * pagesize); @@ -184,6 +210,20 @@ void StatsMemory::update(long long sampleID) _mem.values[memory_value_buffer] = (double)(_buf); _mem.values[memory_value_swapused] = (double)(_swapused * pagesize); _mem.values[memory_value_swaptotal] = (double)(_swaptotal * pagesize); + _mem.values[memory_value_swapin] = (double)(_swapin * pagesize); + _mem.values[memory_value_swapout] = (double)(_swapout * pagesize); + + #if defined(HAVE_LIBKVM) && defined(__FreeBSD__) + struct kvm_swap swap[1]; + { + if (kvm_getswapinfo(kd, swap, 1, 0) != -1) + { + _mem.values[memory_value_swaptotal] = (double)((double)swap[0].ksw_total * pagesize); + _mem.values[memory_value_swapused] = (double)((double)swap[0].ksw_used * pagesize); + } + } + #endif + addSample(_mem, sampleID); } @@ -354,7 +394,6 @@ void StatsMemory::update(long long sampleID) mem_data _mem; prepareSample(&_mem); - kvm_t *kd; size_t len; double kbpp; struct vmmeter sum; @@ -365,17 +404,10 @@ void StatsMemory::update(long long sampleID) { NULL } }; - if ((kd = kvm_open(NULL, NULL, NULL, O_RDONLY, NULL)) == NULL) - { - fprintf(stderr, "kvm_open(): %s\n", strerror(errno)); - return; - } - /* get virtual memory data */ if (kvm_nlist(kd, nl) == -1) { - fprintf(stderr, "kvm_nlist(): %s\n", strerror(errno)); - kvm_close(kd); + cout << "kvm_nlist(): " << strerror(errno) << endl; return; } @@ -383,8 +415,7 @@ void StatsMemory::update(long long sampleID) if (kvm_read(kd, nl[0].n_value, &sum, len) == -1) { - fprintf(stderr, "kvm_read(): %s\n", strerror(errno)); - kvm_close(kd); + cout << "kvm_read(): " << strerror(errno) << endl; return; } @@ -399,8 +430,8 @@ void StatsMemory::update(long long sampleID) _mem.values[memory_value_wired] = (double)(sum.v_wire_count * kbpp); _mem.values[memory_value_used] = (double)(_mem.values[memory_value_active] + _mem.values[memory_value_wired]); - _mem.values[memory_value_swapin] = (double)(sum.v_swappgsin); - _mem.values[memory_value_swapout] = (double)(sum.v_swappgsout); + _mem.values[memory_value_swapin] = (double)(sum.v_swappgsin * kbpp); + _mem.values[memory_value_swapout] = (double)(sum.v_swappgsout * kbpp); #ifdef HAVE_SYSCTLBYNAME size_t bufsizelen; @@ -415,15 +446,12 @@ void StatsMemory::update(long long sampleID) if (kvm_getswapinfo(kd, swap, 1, 0) == -1) { - fprintf(stderr, "kvm_getswapinfo(): %s\n", strerror(errno)); - kvm_close(kd); + cout << "kvm_getswapinfo(): " << strerror(errno) << endl; return; } - _mem.values[memory_value_swaptotal] = (double)(swap[0].ksw_total * kbpp); - _mem.values[memory_value_swapused] = (double)(swap[0].ksw_used * kbpp); - - kvm_close(kd); + _mem.values[memory_value_swaptotal] = (double)((double)swap[0].ksw_total * kbpp); + _mem.values[memory_value_swapused] = (double)((double)swap[0].ksw_used * kbpp); addSample(_mem, sampleID); diff --git a/src/stats/StatsProcesses.cpp b/src/stats/StatsProcesses.cpp index 0aff83f..2a04d0d 100644 --- a/src/stats/StatsProcesses.cpp +++ b/src/stats/StatsProcesses.cpp @@ -210,12 +210,6 @@ void StatsProcesses::update(long long sampleID, double totalTicks) #endif int n_processes; int i; - kvm_t *kd; - - if ((kd = kvm_open(NULL, NULL, NULL, O_RDONLY, NULL)) == NULL) - { - return; - } #if defined(PROCESSES_KVM_NETBSD) p = kvm_getproc2(kd, KERN_PROC_ALL, 0, sizeof(kinfo_proc2), &n_processes); @@ -277,8 +271,6 @@ void StatsProcesses::update(long long sampleID, double totalTicks) } } } - - kvm_close(kd); } #elif defined(USE_PROCESSES_PROCFS) diff --git a/src/stats/StatsProcesses.h b/src/stats/StatsProcesses.h index ab95be3..4b951c8 100644 --- a/src/stats/StatsProcesses.h +++ b/src/stats/StatsProcesses.h @@ -56,7 +56,7 @@ class process_info long long sampleID; char name[128]; }; -class StatsProcesses +class StatsProcesses : public StatsBase { public: void update(long long sampleID, double ticks);