FreeBSD changes

Fixed memory monitoring on FreeBSD 11
.kvm monitoring improvements.
This commit is contained in:
Bjango
2016-11-08 09:18:32 +11:00
parent 64907cea9a
commit 148a1163f9
6 changed files with 71 additions and 31 deletions

View File

@@ -2,7 +2,7 @@
# Process this file with autoconf to produce a configure script. # Process this file with autoconf to produce a configure script.
AC_PREREQ([2.59]) 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_INIT_AUTOMAKE([foreign subdir-objects])
AM_MAINTAINER_MODE AM_MAINTAINER_MODE
AC_CANONICAL_HOST AC_CANONICAL_HOST

View File

@@ -101,6 +101,22 @@ void Stats::startStats()
} }
#endif #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 #ifdef USE_SQLITE
if(historyEnabled == true) if(historyEnabled == true)
{ {

View File

@@ -286,6 +286,10 @@ class StatsBase
bool historyEnabled; bool historyEnabled;
bool debugLogging; bool debugLogging;
#ifdef HAVE_LIBKVM
kvm_t *kd;
#endif
#ifdef USE_SQLITE #ifdef USE_SQLITE
std::vector<DatabaseItem> databaseQueue; std::vector<DatabaseItem> databaseQueue;
Database _database; Database _database;

View File

@@ -105,7 +105,7 @@ void StatsMemory::update(long long sampleID)
addSample(_mem, 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() void StatsMemory::init()
{ {
@@ -120,6 +120,9 @@ void StatsMemory::init()
databaseKeys.push_back("swaptotal"); databaseKeys.push_back("swaptotal");
databaseKeys.push_back("swapused"); databaseKeys.push_back("swapused");
databaseKeys.push_back("swapin");
databaseKeys.push_back("swapout");
databaseMap.push_back(memory_value_total); databaseMap.push_back(memory_value_total);
databaseMap.push_back(memory_value_free); databaseMap.push_back(memory_value_free);
databaseMap.push_back(memory_value_active); databaseMap.push_back(memory_value_active);
@@ -131,6 +134,9 @@ void StatsMemory::init()
databaseMap.push_back(memory_value_swaptotal); databaseMap.push_back(memory_value_swaptotal);
databaseMap.push_back(memory_value_swapused); databaseMap.push_back(memory_value_swapused);
databaseMap.push_back(memory_value_swapin);
databaseMap.push_back(memory_value_swapout);
_init(); _init();
} }
@@ -139,7 +145,7 @@ void StatsMemory::update(long long sampleID)
mem_data _mem; mem_data _mem;
prepareSample(&_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; long _buf;
int pagesize = getpagesize(); int pagesize = getpagesize();
@@ -170,10 +176,30 @@ void StatsMemory::update(long long sampleID)
if (sysctlbyname("vm.swap_anon_use", &_swapused, &len, NULL, 0) < 0) if (sysctlbyname("vm.swap_anon_use", &_swapused, &len, NULL, 0) < 0)
_swapused = 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); len = sizeof(_buf);
if (sysctlbyname("vfs.bufspace", &_buf, &len, NULL, 0) < 0) if (sysctlbyname("vfs.bufspace", &_buf, &len, NULL, 0) < 0)
_buf = 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_total] = (double)(_total * pagesize);
_mem.values[memory_value_free] = (double)(_free * pagesize); _mem.values[memory_value_free] = (double)(_free * pagesize);
_mem.values[memory_value_active] = (double)(_active * 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_buffer] = (double)(_buf);
_mem.values[memory_value_swapused] = (double)(_swapused * pagesize); _mem.values[memory_value_swapused] = (double)(_swapused * pagesize);
_mem.values[memory_value_swaptotal] = (double)(_swaptotal * 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); addSample(_mem, sampleID);
} }
@@ -354,7 +394,6 @@ void StatsMemory::update(long long sampleID)
mem_data _mem; mem_data _mem;
prepareSample(&_mem); prepareSample(&_mem);
kvm_t *kd;
size_t len; size_t len;
double kbpp; double kbpp;
struct vmmeter sum; struct vmmeter sum;
@@ -365,17 +404,10 @@ void StatsMemory::update(long long sampleID)
{ NULL } { 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 */ /* get virtual memory data */
if (kvm_nlist(kd, nl) == -1) if (kvm_nlist(kd, nl) == -1)
{ {
fprintf(stderr, "kvm_nlist(): %s\n", strerror(errno)); cout << "kvm_nlist(): " << strerror(errno) << endl;
kvm_close(kd);
return; return;
} }
@@ -383,8 +415,7 @@ void StatsMemory::update(long long sampleID)
if (kvm_read(kd, nl[0].n_value, &sum, len) == -1) if (kvm_read(kd, nl[0].n_value, &sum, len) == -1)
{ {
fprintf(stderr, "kvm_read(): %s\n", strerror(errno)); cout << "kvm_read(): " << strerror(errno) << endl;
kvm_close(kd);
return; 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_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_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_swapin] = (double)(sum.v_swappgsin * kbpp);
_mem.values[memory_value_swapout] = (double)(sum.v_swappgsout); _mem.values[memory_value_swapout] = (double)(sum.v_swappgsout * kbpp);
#ifdef HAVE_SYSCTLBYNAME #ifdef HAVE_SYSCTLBYNAME
size_t bufsizelen; size_t bufsizelen;
@@ -415,15 +446,12 @@ void StatsMemory::update(long long sampleID)
if (kvm_getswapinfo(kd, swap, 1, 0) == -1) if (kvm_getswapinfo(kd, swap, 1, 0) == -1)
{ {
fprintf(stderr, "kvm_getswapinfo(): %s\n", strerror(errno)); cout << "kvm_getswapinfo(): " << strerror(errno) << endl;
kvm_close(kd);
return; return;
} }
_mem.values[memory_value_swaptotal] = (double)(swap[0].ksw_total * kbpp); _mem.values[memory_value_swaptotal] = (double)((double)swap[0].ksw_total * kbpp);
_mem.values[memory_value_swapused] = (double)(swap[0].ksw_used * kbpp); _mem.values[memory_value_swapused] = (double)((double)swap[0].ksw_used * kbpp);
kvm_close(kd);
addSample(_mem, sampleID); addSample(_mem, sampleID);

View File

@@ -210,12 +210,6 @@ void StatsProcesses::update(long long sampleID, double totalTicks)
#endif #endif
int n_processes; int n_processes;
int i; int i;
kvm_t *kd;
if ((kd = kvm_open(NULL, NULL, NULL, O_RDONLY, NULL)) == NULL)
{
return;
}
#if defined(PROCESSES_KVM_NETBSD) #if defined(PROCESSES_KVM_NETBSD)
p = kvm_getproc2(kd, KERN_PROC_ALL, 0, sizeof(kinfo_proc2), &n_processes); 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) #elif defined(USE_PROCESSES_PROCFS)

View File

@@ -56,7 +56,7 @@ class process_info
long long sampleID; long long sampleID;
char name[128]; char name[128];
}; };
class StatsProcesses class StatsProcesses : public StatsBase
{ {
public: public:
void update(long long sampleID, double ticks); void update(long long sampleID, double ticks);