Не нашёл на форуме или плохо искал, вопрос наверно больше касается разработчиков....
Поставил на мониторинг FreeBSD 6.2 и обнаружил что элементы данных касающиеся памяти (vm.memory.size) показывают немного не то что должно быть.
Для получение данных используется вызов sysctl
vm.memory.size[used] = (vm.stats.vm.v_page_count - vm.stats.vm.v_free_count) * vm.stats.vm.v_page_size)
во внимание не принят факт что память inactive (vm.stats.vm.v_inactive_count) тоже считается свободной
Для FreeBSD элемент данных vm.memory.size[free] отражает только часть свободной памяти (vm.stats.vm.v_free_count), более логичнее добавить vm.memory.size[available] или vm.memory.size[free] использовать как параметр доступной памяти в системе.
То же самое для элемента vm.memory.size[used], всё наглядно можно увидеть в скрипте:
http://www.cyberciti.biz/files/scrip...-memory.pl.txt
Собственно вот часть кода для правильного вычисления значений (взято с http://www.i-scream.org):
Могу выложить патчик для агента FreeBSD, если разработчики откликнутся могу оформить в виде багрепорта с приложенным патчиком, возможно уже кто то репортил сие дело, дайте знать.
Поставил на мониторинг FreeBSD 6.2 и обнаружил что элементы данных касающиеся памяти (vm.memory.size) показывают немного не то что должно быть.
Для получение данных используется вызов sysctl
vm.memory.size[used] = (vm.stats.vm.v_page_count - vm.stats.vm.v_free_count) * vm.stats.vm.v_page_size)
во внимание не принят факт что память inactive (vm.stats.vm.v_inactive_count) тоже считается свободной
Для FreeBSD элемент данных vm.memory.size[free] отражает только часть свободной памяти (vm.stats.vm.v_free_count), более логичнее добавить vm.memory.size[available] или vm.memory.size[free] использовать как параметр доступной памяти в системе.
То же самое для элемента vm.memory.size[used], всё наглядно можно увидеть в скрипте:
http://www.cyberciti.biz/files/scrip...-memory.pl.txt
Собственно вот часть кода для правильного вычисления значений (взято с http://www.i-scream.org):
Code:
#if defined(FREEBSD) || defined(DFBSD)
/* Returns bytes */
mib[0] = CTL_HW;
mib[1] = HW_PHYSMEM;
size = sizeof physmem;
if (sysctl(mib, 2, &physmem, &size, NULL, 0) < 0) {
return NULL;
}
mem_stat.total = physmem;
/*returns pages*/
size = sizeof free_count;
if (sysctlbyname("vm.stats.vm.v_free_count", &free_count, &size, NULL, 0) < 0){
return NULL;
}
size = sizeof inactive_count;
if (sysctlbyname("vm.stats.vm.v_inactive_count", &inactive_count , &size, NULL, 0) < 0){
return NULL;
}
size = sizeof cache_count;
if (sysctlbyname("vm.stats.vm.v_cache_count", &cache_count, &size, NULL, 0) < 0){
return NULL;
}
/* Because all the vm.stats returns pages, I need to get the page size.
* After that I then need to multiple the anything that used vm.stats to
* get the system statistics by pagesize
*/
if ((pagesize=getpagesize()) == -1){
return NULL;
}
mem_stat.cache=cache_count*pagesize;
/* Of couse nothing is ever that simple :) And I have inactive pages to
* deal with too. So I'm going to add them to free memory :)
*/
mem_stat.free=(free_count*pagesize)+(inactive_count*pagesize);
mem_stat.used=physmem-mem_stat.free;
#endif
Comment