Re: snmp oid for memory usage, vmstat -i and others
- In reply to: Victor Gamov : "Re: snmp oid for memory usage, vmstat -i and others"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 25 Jan 2022 21:56:01 UTC
Victor Gamov wrote:
> Hi Yuri
>
> Thanks for your reply!
>
> So, I can find total memory via HOST-RESOURCES-MIB::hrMemorySize.0
>
> But how to calculate used memory? I guess I need to find all
> HOST-RESOURCES-MIB::hrStorageType = HOST-RESOURCES-TYPES::hrStorageRam
> and then multiply corresponding hrStorageAllocationUnits * hrStorageSize
> and sum all of them.
>
> Is it correct?
If no one has any better ideas, here's a quick "fix" for bsnmpd to
report physical memory instead (same as net-snmp does):
https://github.com/yuripv/freebsd-src/commit/1aff8b31cfe7648667328dc3444d17eff58486e6
> On 25.01.2022 08:32, Yuri wrote:
>> Yuri wrote:
>>> Victor Gamov wrote:
>>>> Hi All
>>>>
>>>> Some questions about bsnmpd.
>>>>
>>>> Is it possible to get memory usage via bsnmpd? When I tried to get
>>>> something like "snmpget hrStorageDescr.1 hrStorageAllocationUnits.1
>>>> hrStorageSize.1 hrStorageUsed.1" then I've got this values:
>>>>
>>>> =====
>>>> HOST-RESOURCES-MIB::hrStorageDescr.1 = STRING: Real Memory Metrics
>>>> HOST-RESOURCES-MIB::hrStorageAllocationUnits.1 = INTEGER: 4096 Bytes
>>>> HOST-RESOURCES-MIB::hrStorageSize.1 = INTEGER: 391488
>>>> HOST-RESOURCES-MIB::hrStorageUsed.1 = INTEGER: 391252
>>>> =====
>>>>
>>>> How I must process it to calculate actual memory usage for machine with
>>>> 4GB RAM and without swap?
>>>>
>>>> =====
>>>> $ sysctl hw | egrep 'hw.(phys|user|real)'
>>>> hw.physmem: 4243894272
>>>> hw.usermem: 3580182528
>>>> hw.realmem: 4294967296
>>>> =====
>>>
>>> Values returned by bsnmpd look weird to me as well, so I looked into it
>>> a bit. Excerpt from the snmp_hostres (as a standalone test case):
>>> ----
>>> #include <sys/types.h>
>>> #include <sys/sysctl.h>
>>> #include <sys/vmmeter.h>
>>>
>>> #include <vm/vm_param.h>
>>>
>>> #include <err.h>
>>> #include <stdio.h>
>>>
>>> static struct vmtotal mem_stats;
>>>
>>> int
>>> main(void)
>>> {
>>> int mib[2] = { CTL_VM, VM_TOTAL };
>>> size_t len = sizeof(mem_stats);
>>>
>>> if (sysctl(mib, 2, &mem_stats, &len, NULL, 0) != 0)
>>> err(1, "sysctl");
>>>
>>> printf("real=%lu\n", mem_stats.t_rm);
>>>
>>> return (0);
>>> }
>>> ----
>>> output:
>>> real=31632
>>> ----
>>>
>>> Now the sysctl output:
>>> ----
>>> $ sysctl vm.vmtotal
>>> vm.vmtotal:
>>> System wide totals computed every five seconds: (values in kilobytes)
>>> ===============================================
>>> Processes: (RUNQ: 1 Disk Wait: 0 Page Wait: 0 Sleep: 28)
>>> Virtual Memory: (Total: 547240K Active: 542480K)
>>> Real Memory: (Total: 126572K Active: 125600K)
>>> Shared Virtual Memory: (Total: 4612K Active: 0K)
>>> Shared Real Memory: (Total: 924K Active: 0K)
>>> Free Memory: 3608396K
>>> ---
>>> I can't map the output to anything on the system (16G RAM, 16G swap)
>>> except for the "Free Memory", it matches.
>>>
>>> 31632 ("real") * 4096 ("pagesize") matches the "Real Memory" in sysctl
>>> output. Though to get anything resembling 16G, "real" needs to be
>>> multiplied by 512 (K?).
>>>
>>> As a wild guess, it seems that the units used are wrong here, or I
>>> simply don't understand the meaning of these values.
>>
>> Looking at sys/vmmeter.h, my assumptions above are wrong:
>>
>> uint64_t t_rm; /* total real memory in use */
>>
>> But that does not include the "wired" (and other) pages, so I'm not sure
>> about this metric usefulness.
>>
>> In any case, you have the following:
>>
>> HOST-RESOURCES-MIB::hrMemorySize.0 = INTEGER: 16734232 KBytes
>>
>