Ad Widget

Collapse

FreeBSD мониторинг RAM usage

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • costas
    Senior Member
    • Aug 2009
    • 201

    #1

    FreeBSD мониторинг RAM usage

    Не нашёл на форуме или плохо искал, вопрос наверно больше касается разработчиков....
    Поставил на мониторинг 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
    Могу выложить патчик для агента FreeBSD, если разработчики откликнутся могу оформить в виде багрепорта с приложенным патчиком, возможно уже кто то репортил сие дело, дайте знать.
    CentOS-5.5 i386, Zabbix 1.8.4 (stable), MySQL 5.0.92, PHP 5.2.17 (cli)

    ...эта проверка бесполезная, вредная, и она зло.
  • costas
    Senior Member
    • Aug 2009
    • 201

    #2
    З.Ы. Сам патчик:

    добавляет поддержку vm.memory.size[available]
    vm.memory.size[available] = v_inactive_count + v_free_count

    изменения
    vm.memory.size[total] = через sysctl HW_PHYSMEM
    vm.memory.size[used] = vm.memory.size[total] - vm.memory.size[available]
    vm.memory.size[pused] - пересчёт соответственно

    Code:
    --- zabbix-1.8.4/src/libs/zbxsysinfo/freebsd/memory.c-orign     Wed Mar  9 13:21:59 2011
    +++ zabbix-1.8.4/src/libs/zbxsysinfo/freebsd/memory.c   Wed Mar  9 14:19:43 2011
    @@ -24,20 +24,16 @@
     {
     #if defined(HAVE_FUNCTION_SYSCTLBYNAME)
            /* FreeBSD 6.2 i386; FreeBSD 7.0 i386 */
    -       u_int           totalpages, pagesize;
    +       u_int           totalmem;
            size_t          len;
    -
    -       len = sizeof(totalpages);
    -
    -       if (0 != sysctlbyname("vm.stats.vm.v_page_count", &totalpages, &len, NULL, 0))
    +       int             mib[]={CTL_HW, HW_PHYSMEM};
    +
    +       len = sizeof(totalmem);
    +       if (sysctl(mib, 2, &totalmem, &len, NULL, 0) < 0) {
                    return SYSINFO_RET_FAIL;
    +       }
    
    -       len = sizeof(pagesize);
    -
    -       if (0 != sysctlbyname("vm.stats.vm.v_page_size", &pagesize, &len, NULL, 0))
    -               return SYSINFO_RET_FAIL;
    -
    -       SET_UI64_RESULT(result, (zbx_uint64_t)totalpages * pagesize);
    +       SET_UI64_RESULT(result, (zbx_uint64_t)totalmem);
    
            return SYSINFO_RET_OK;
     #else
    @@ -74,12 +70,18 @@
     {
     #if defined(HAVE_FUNCTION_SYSCTLBYNAME)
            /* FreeBSD 6.2 i386; FreeBSD 7.0 i386 */
    -       u_int           totalpages, freepages, pagesize;
    +       u_int           totalmem, inactivepages, freepages, pagesize;
            size_t          len;
    +       int             mib[] = {CTL_HW, HW_PHYSMEM};
    
    -       len = sizeof(totalpages);
    +       len = sizeof(totalmem);
    +       if (sysctl(mib, 2, &totalmem, &len, NULL, 0) < 0) {
    +               return SYSINFO_RET_FAIL;
    +       }
    +
    +       len = sizeof(inactivepages);
    
    -       if (0 != sysctlbyname("vm.stats.vm.v_page_count", &totalpages, &len, NULL, 0))
    +       if (0 != sysctlbyname("vm.stats.vm.v_inactive_count", &inactivepages, &len, NULL, 0))
                    return SYSINFO_RET_FAIL;
    
            len = sizeof(freepages);
    @@ -92,7 +94,7 @@
            if (0 != sysctlbyname("vm.stats.vm.v_page_size", &pagesize, &len, NULL, 0))
                    return SYSINFO_RET_FAIL;
    
    -       SET_UI64_RESULT(result, (zbx_uint64_t)(totalpages - freepages) * pagesize);
    +       SET_UI64_RESULT(result, (zbx_uint64_t)(totalmem - (inactivepages + freepages) * pagesize ) );
    
            return SYSINFO_RET_OK;
     #else
    @@ -129,12 +131,18 @@
     {
     #if defined(HAVE_FUNCTION_SYSCTLBYNAME)
            /* FreeBSD 6.2 i386; FreeBSD 7.0 i386 */
    -       u_int           totalpages, freepages;
    +       u_int           totalmem, inactivepages, freepages, pagesize;
            size_t          len;
    +       int             mib[] = {CTL_HW, HW_PHYSMEM};
    +
    +       len = sizeof(totalmem);
    +       if (sysctl(mib, 2, &totalmem, &len, NULL, 0) < 0) {
    +               return SYSINFO_RET_FAIL;
    +       }
    +
    +       len = sizeof(inactivepages);
    
    -       len = sizeof(totalpages);
    -
    -       if (0 != sysctlbyname("vm.stats.vm.v_page_count", &totalpages, &len, NULL, 0))
    +       if (0 != sysctlbyname("vm.stats.vm.v_inactive_count", &inactivepages, &len, NULL, 0))
                    return SYSINFO_RET_FAIL;
    
            len = sizeof(freepages);
    @@ -142,7 +150,12 @@
            if (0 != sysctlbyname("vm.stats.vm.v_free_count", &freepages, &len, NULL, 0))
                    return SYSINFO_RET_FAIL;
    
    -       SET_DBL_RESULT(result, (double)(100.0 * (totalpages - freepages)) / totalpages);
    +       len = sizeof(pagesize);
    +
    +       if (0 != sysctlbyname("vm.stats.vm.v_page_size", &pagesize, &len, NULL, 0))
    +               return SYSINFO_RET_FAIL;
    +
    +       SET_DBL_RESULT(result, (double)(100.0 * (totalmem - (inactivepages + freepages) * pagesize )) /totalmem );
    
            return SYSINFO_RET_OK;
     #else
    @@ -196,6 +209,36 @@
     #endif
     }
    
    +static int     VM_MEMORY_AVAILABLE(AGENT_RESULT *result)
    +{
    +#if defined(HAVE_FUNCTION_SYSCTLBYNAME)
    +       /* FreeBSD 6.2 i386; FreeBSD 7.0 i386 */
    +       u_int           inactivepages, freepages, pagesize;
    +       size_t          len;
    +
    +       len = sizeof(inactivepages);
    +
    +       if (0 != sysctlbyname("vm.stats.vm.v_inactive_count", &inactivepages, &len, NULL, 0))
    +               return SYSINFO_RET_FAIL;
    +
    +       len = sizeof(freepages);
    +
    +       if (0 != sysctlbyname("vm.stats.vm.v_free_count", &freepages, &len, NULL, 0))
    +               return SYSINFO_RET_FAIL;
    +
    +       len = sizeof(pagesize);
    +
    +       if (0 != sysctlbyname("vm.stats.vm.v_page_size", &pagesize, &len, NULL, 0))
    +               return SYSINFO_RET_FAIL;
    +
    +       SET_UI64_RESULT(result, (zbx_uint64_t)(inactivepages + freepages) * pagesize);
    +
    +       return SYSINFO_RET_OK;
    +#else
    +       return SYSINFO_RET_FAIL;
    +#endif /* HAVE_FUNCTION_SYSCTLBYNAME */
    +}
    +
     int     VM_MEMORY_SIZE(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result)
     {
            MODE_FUNCTION fl[] =
    @@ -207,6 +250,7 @@
                    {"pused",       VM_MEMORY_PUSED},
                    {"shared",      VM_MEMORY_SHARED},
                    {"cached",      VM_MEMORY_CACHED},
    +               {"available",   VM_MEMORY_AVAILABLE},
                    {0,             0}
            };
    CentOS-5.5 i386, Zabbix 1.8.4 (stable), MySQL 5.0.92, PHP 5.2.17 (cli)

    ...эта проверка бесполезная, вредная, и она зло.

    Comment

    • gdgsoft
      Senior Member
      • Apr 2009
      • 202

      #3
      Может будет интересно, на одной из презентаций, взятой с ютуба, по поводу мониторинга фри, содрал такую формулу, для подсчета используемой памяти:
      hw.realmem - hw.pagesize*(vm.stats.v_inactive_count*vm.stats.vm .v_cache_count*vm.stats.vm.v_free_count)

      На абсолютность не претендую, т.к. как списывал именно с видео-презентации.
      Zabbix 2.4.2
      PHP 5.4.5
      Oracle Linux 6.5
      VmWare ESXi 4

      MariaDB 10.0.15
      Oracle Linux 6.5
      Supermicro SYS-6027TRF(64Gb+RAID-10 600Gb SAS15k)

      Comment

      • costas
        Senior Member
        • Aug 2009
        • 201

        #4
        Originally posted by gdgsoft
        Может будет интересно, на одной из презентаций, взятой с ютуба, по поводу мониторинга фри, содрал такую формулу, для подсчета используемой памяти:
        hw.realmem - hw.pagesize*(vm.stats.v_inactive_count*vm.stats.vm .v_cache_count*vm.stats.vm.v_free_count)

        На абсолютность не претендую, т.к. как списывал именно с видео-презентации.
        Абсолютно верная формула, но она в дефолтной поставке не используется, я переписал по аналогии с freecolor за основу взяты формулы из libstatgrab http://www.i-scream.org/libstatgrab/
        отличается отсутствием vm.stats.vm.v_cache_count при вычислении доступной и использованной памяти, что бы не было расхождений с системными тулзами.

        Приведённая Вами формула используется в freebsd-memory.pl (ссылка в первом посте), но там hw.realmem не тривиально считается (есть разница между Total real memory managed и Total real memory installed)
        CentOS-5.5 i386, Zabbix 1.8.4 (stable), MySQL 5.0.92, PHP 5.2.17 (cli)

        ...эта проверка бесполезная, вредная, и она зло.

        Comment

        • zalex_ua
          Senior Member
          Zabbix Certified Trainer
          Zabbix Certified SpecialistZabbix Certified Professional
          • Oct 2009
          • 1286

          #5
          Originally posted by costas
          возможно уже кто то репортил сие дело, дайте знать.
          Кажется на трекере что то пробегало на эту тему, кажется речь шла о поддержке новых ключей для типов памяти во фре. Если найду, то сообщу, а вообще обязательно нужно создать запрос на трекере и приложить этот патч.

          Comment

          Working...