diff --git a/src/libs/zbxsysinfo/common/zbxkstat.c b/src/libs/zbxsysinfo/common/zbxkstat.c index 14cf8652fac..e19819129b7 100644 --- a/src/libs/zbxsysinfo/common/zbxkstat.c +++ b/src/libs/zbxsysinfo/common/zbxkstat.c @@ -62,6 +62,7 @@ static int zbx_kstat_refresh(char **error) ret = FAIL; goto out; } + ret = SUCCEED; out: zabbix_log(LOG_LEVEL_DEBUG, "End of %s()", __func__); @@ -168,7 +169,7 @@ void zbx_kstat_collect(zbx_kstat_t *kstat) kstat->vminfo_index ^= 1; kstat->vminfo[kstat->vminfo_index].freemem = vminfo.freemem; - kstat->vminfo[kstat->vminfo_index].updates = time(NULL); + kstat->vminfo[kstat->vminfo_index].updates = vminfo.updates; zbx_mutex_unlock(kstat_lock); @@ -183,8 +184,9 @@ out: * * * Purpose: gets free memory size * * * - * Parameters: value - [OUT] free memory size in bytes * - * error - [OUT] error message * + * Parameters: value - [OUT] free memory size in bytes * + * pagesize - [OUT] * + * error - [OUT] error message * * * * Return value: SUCCEED - free memory size was stored in value * * FAIL - Either an error occurred (error parameter is set) or * @@ -192,8 +194,9 @@ out: * unchanged). * * * ******************************************************************************/ -int zbx_kstat_get_freemem(zbx_uint64_t *value, char **error) +int zbx_kstat_get_freemem(zbx_uint64_t *value, zbx_uint64_t *pagesize, char **error) { + static int last_pagesize = FAIL; int sysconf_pagesize, last, prev, ret = FAIL; zbx_kstat_vminfo_t *vminfo; @@ -219,6 +222,21 @@ int zbx_kstat_get_freemem(zbx_uint64_t *value, char **error) *value = (vminfo[last].freemem - vminfo[prev].freemem) / (vminfo[last].updates - vminfo[prev].updates) * sysconf_pagesize; ret = SUCCEED; + + if (NULL != pagesize) + *pagesize = sysconf_pagesize; + + if (sysconf_pagesize != last_pagesize) + { + if (FAIL != last_pagesize) + { + zabbix_log(LOG_LEVEL_WARNING, + "sysconf(_SC_PAGESIZE) value has changed from [%d] to [%d]", + last_pagesize, sysconf_pagesize); + } + + last_pagesize = sysconf_pagesize; + } } else zabbix_log(LOG_LEVEL_DEBUG, "no new vminfo update is available"); diff --git a/src/libs/zbxsysinfo/common/zbxkstat.h b/src/libs/zbxsysinfo/common/zbxkstat.h index 27293011111..8abe9d0b8d7 100644 --- a/src/libs/zbxsysinfo/common/zbxkstat.h +++ b/src/libs/zbxsysinfo/common/zbxkstat.h @@ -36,7 +36,7 @@ zbx_kstat_t; int zbx_kstat_init(zbx_kstat_t *kstat, char **error); void zbx_kstat_destroy(void); void zbx_kstat_collect(zbx_kstat_t *kstat); -int zbx_kstat_get_freemem(zbx_uint64_t *value, char **error); +int zbx_kstat_get_freemem(zbx_uint64_t *value, zbx_uint64_t *pagesize, char **error); #endif diff --git a/src/libs/zbxsysinfo/solaris/memory.c b/src/libs/zbxsysinfo/solaris/memory.c index b298d49223c..c62a94b74c5 100644 --- a/src/libs/zbxsysinfo/solaris/memory.c +++ b/src/libs/zbxsysinfo/solaris/memory.c @@ -148,19 +148,35 @@ out: static int vm_memory_used(AGENT_RESULT *result) { int ret; - zbx_uint64_t freemem; + zbx_uint64_t freemem, pagesize; char *error = NULL; zabbix_log(LOG_LEVEL_DEBUG, "In %s (with HAVE_VMINFO_T_UPDATES)", __func__); - if (SUCCEED == zbx_kstat_get_freemem(&freemem, &error)) + if (SUCCEED == zbx_kstat_get_freemem(&freemem, &pagesize, &error)) { - long res_SC_PHYS_PAGES, res_SC_PAGESIZE; + long res_SC_PHYS_PAGES; + zbx_uint64_t total; CHECKED_SYSCONF_SYSCALL(_SC_PHYS_PAGES); - CHECKED_SYSCONF_SYSCALL(_SC_PAGESIZE); - SET_UI64_RESULT(result, res_SC_PHYS_PAGES * res_SC_PAGESIZE - freemem); + if (0 == (total = res_SC_PHYS_PAGES)) + { + SET_MSG_RESULT(result, zbx_strdup(NULL, "Cannot calculate usage because total is zero.")); + ret = SYSINFO_RET_FAIL; + goto out; + } + + total *= pagesize; + + if (total < freemem) + { + zabbix_log(LOG_LEVEL_WARNING, "%s() total < freemem, where total:" ZBX_FS_UI64 " freemem:" + ZBX_FS_UI64 " pagesize:" ZBX_FS_UI64 " delta:" ZBX_FS_I64, __func__, total, freemem, + pagesize, total - freemem); + } + else + SET_UI64_RESULT(result, total - freemem); } else if (NULL != error) { @@ -181,7 +197,7 @@ out: static int vm_memory_pused(AGENT_RESULT *result) { int ret; - zbx_uint64_t freemem, total; + zbx_uint64_t freemem, total, pagesize; char *error = NULL; long res_SC_PHYS_PAGES; @@ -196,14 +212,18 @@ static int vm_memory_pused(AGENT_RESULT *result) goto out; } - if (SUCCEED == zbx_kstat_get_freemem(&freemem, &error)) + if (SUCCEED == zbx_kstat_get_freemem(&freemem, &pagesize, &error)) { - long res_SC_PAGESIZE; - - CHECKED_SYSCONF_SYSCALL(_SC_PAGESIZE); - - total *= res_SC_PAGESIZE; - SET_DBL_RESULT(result, (total - freemem) / (double)total * 100); + total *= pagesize; + + if (total < freemem) + { + zabbix_log(LOG_LEVEL_WARNING, "%s() total < freemem, where total:" ZBX_FS_UI64 " freemem:" + ZBX_FS_UI64 " pagesize:" ZBX_FS_UI64 " delta:" ZBX_FS_I64, __func__, total, freemem, + pagesize, total - freemem); + } + else + SET_DBL_RESULT(result, (total - freemem) / (double)total * 100); } else if (NULL != error) { @@ -229,7 +249,7 @@ static int vm_memory_available(AGENT_RESULT *result) zabbix_log(LOG_LEVEL_DEBUG, "In %s, (with HAVE_VMINFO_T_UPDATES)", __func__); - if (SUCCEED == zbx_kstat_get_freemem(&freemem, &error)) + if (SUCCEED == zbx_kstat_get_freemem(&freemem, NULL, &error)) { SET_UI64_RESULT(result, freemem); } @@ -252,7 +272,7 @@ out: static int vm_memory_pavailable(AGENT_RESULT *result) { int ret; - zbx_uint64_t total, freemem; + zbx_uint64_t total, freemem, pagesize; char *error = NULL; long res_SC_PHYS_PAGES; @@ -267,14 +287,18 @@ static int vm_memory_pavailable(AGENT_RESULT *result) goto out; } - if (SUCCEED == zbx_kstat_get_freemem(&freemem, &error)) + if (SUCCEED == zbx_kstat_get_freemem(&freemem, &pagesize, &error)) { - long res_SC_PAGESIZE; - - CHECKED_SYSCONF_SYSCALL(_SC_PAGESIZE); - - total *= res_SC_PAGESIZE; - SET_DBL_RESULT(result, freemem / (double)total * 100); + total *= pagesize; + + if (total < freemem) + { + zabbix_log(LOG_LEVEL_WARNING, "%s() total < freemem, where total:" ZBX_FS_UI64 " freemem:" + ZBX_FS_UI64 " pagesize:" ZBX_FS_UI64 " delta:" ZBX_FS_I64, __func__, total, freemem, + pagesize, total - freemem); + } + else + SET_DBL_RESULT(result, freemem / (double)total * 100); } else if (NULL != error) {