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

@@ -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)
{

View File

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

View File

@@ -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);

View File

@@ -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)

View File

@@ -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);