diff options
author | Giampaolo Rodola <g.rodola@gmail.com> | 2023-04-14 01:07:42 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-14 01:07:42 +0200 |
commit | 6e2dc7728f612b91d692fac5ab92cdd4521811c9 (patch) | |
tree | 4034d0ebf2e1ce4c970e848865513294ccb69eed | |
parent | eb8e318628eeddc3b237449c08226785e9e2d589 (diff) | |
download | psutil-6e2dc7728f612b91d692fac5ab92cdd4521811c9.tar.gz |
[NetBSD] available mem can be higher than total (#2233)
On NetBSD "available" memory can be higher than "total". From now now calculate it exactly the same as Zabbix:
https://github.com/zabbix/zabbix/blob/af5e0f80253e585ca7082ca6bc9cc07400afe2a7/src/libs/zbxsysinfo/netbsd/memory.c
Fixes https://github.com/giampaolo/psutil/issues/2231 which produced this failure:
```
======================================================================
FAIL: psutil.tests.test_system.TestMemoryAPIs.test_virtual_memory
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/vagrant/psutil/psutil/tests/test_system.py", line 275, in test_virtual_memory
assert 0 <= mem.percent <= 100, mem
^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: svmem(total=1019899904, available=1046573056, percent=-2.6, used=603414528, free=545050624, active=234807296, inactive=133210112, buffers=260288512, cached=368312320, shared=0, wired=294912)
```
-rw-r--r-- | HISTORY.rst | 1 | ||||
-rw-r--r-- | psutil/_psbsd.py | 29 | ||||
-rw-r--r-- | psutil/arch/netbsd/mem.c | 10 |
3 files changed, 26 insertions, 14 deletions
diff --git a/HISTORY.rst b/HISTORY.rst index dcb6a0d2..63b43c69 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -34,6 +34,7 @@ 1 minute). - 2229_, [OpenBSD]: unable to properly recognize zombie processes. `NoSuchProcess`_ may be raised instead of `ZombieProcess`_. +- 2231_, [NetBSD]: *available* `virtual_memory()`_ is higher than *total*. 5.9.4 ===== diff --git a/psutil/_psbsd.py b/psutil/_psbsd.py index 1180a94e..c1cc1c03 100644 --- a/psutil/_psbsd.py +++ b/psutil/_psbsd.py @@ -176,11 +176,11 @@ else: # ===================================================================== -def virtual_memory(): - """System virtual memory as a namedtuple.""" - mem = cext.virtual_mem() - total, free, active, inactive, wired, cached, buffers, shared = mem - if NETBSD: +if NETBSD: + def virtual_memory(): + """System virtual memory as a namedtuple.""" + mem = cext.virtual_mem() + total, free, active, inactive, wired, cached, avail = mem # On NetBSD buffers and shared mem is determined via /proc. # The C ext set them to 0. with open('/proc/meminfo', 'rb') as f: @@ -191,11 +191,20 @@ def virtual_memory(): shared = int(line.split()[1]) * 1024 elif line.startswith(b'Cached:'): cached = int(line.split()[1]) * 1024 - avail = inactive + cached + free - used = active + wired + cached - percent = usage_percent((total - avail), total, round_=1) - return svmem(total, avail, percent, used, free, - active, inactive, buffers, cached, shared, wired) + used = active + wired + cached + percent = usage_percent((total - avail), total, round_=1) + return svmem(total, avail, percent, used, free, + active, inactive, buffers, cached, shared, wired) +else: + def virtual_memory(): + """System virtual memory as a namedtuple.""" + mem = cext.virtual_mem() + total, free, active, inactive, wired, cached, buffers, shared = mem + avail = inactive + cached + free + used = active + wired + cached + percent = usage_percent((total - avail), total, round_=1) + return svmem(total, avail, percent, used, free, + active, inactive, buffers, cached, shared, wired) def swap_memory(): diff --git a/psutil/arch/netbsd/mem.c b/psutil/arch/netbsd/mem.c index b7f5ba23..26ab8e69 100644 --- a/psutil/arch/netbsd/mem.c +++ b/psutil/arch/netbsd/mem.c @@ -32,6 +32,7 @@ psutil_virtual_mem(PyObject *self, PyObject *args) { struct uvmexp_sysctl uv; int mib[] = {CTL_VM, VM_UVMEXP2}; long pagesize = psutil_getpagesize(); + unsigned long long available; size = sizeof(uv); if (sysctl(mib, 2, &uv, &size, NULL, 0) < 0) { @@ -39,16 +40,17 @@ psutil_virtual_mem(PyObject *self, PyObject *args) { return NULL; } - return Py_BuildValue("KKKKKKKK", + // follow zabbix + available = uv.inactive + uv.execpages + uv.filepages + uv.free; + return Py_BuildValue( + "KKKKKKK", (unsigned long long) uv.npages << uv.pageshift, // total (unsigned long long) uv.free << uv.pageshift, // free (unsigned long long) uv.active << uv.pageshift, // active (unsigned long long) uv.inactive << uv.pageshift, // inactive (unsigned long long) uv.wired << uv.pageshift, // wired (unsigned long long) (uv.filepages + uv.execpages) * pagesize, // cached - // These are determined from /proc/meminfo in Python. - (unsigned long long) 0, // buffers - (unsigned long long) 0 // shared + available << uv.pageshift // available ); } |