我需要控制当前python进程的内存使用情况。这个进程是一个多线程的python RPC服务器。
这些线程执行内存密集型工作(线程使用ctype调用内存密集型c库。所以这些python线程是真正并行的。)。
我计划通过延迟调用内存密集型函数来控制这个进程的内存使用量,如果线程发现当前内存使用量超过阈值的话。
此应用程序在freeBSD 9.2上运行。
我需要帮助
1)如何获取当前进程的内存大小?由于我将更频繁地执行此操作,因此我希望此调用是轻量级的。
2)这种控制内存使用的想法合理吗?
发布于 2015-07-09 23:01:46
如果您可以安装外部库,则可以使用psutil来监视系统性能。它非常轻量级,可以精确地测量内存,因此您应该能够调用它,而不会导致任何严重的性能问题。如果您想了解更深入的内存信息,有一个名为memory_profiler的相关库。它可以在这里找到,https://pypi.python.org/pypi/memory_profiler和psutil可以在这里找到:https://github.com/giampaolo/psutil
是的,您应该能够在Python中操作内存。在Python中,内存管理可以通过内存接口中的方法来完成。您可以根据需要释放和重新分配内存块。如果你想更深入地了解Python是如何在内部处理内存的,以及如何操作它,我推荐你访问Releasing memory in Python。
发布于 2015-08-21 07:20:50
考虑到大多数程序都使用共享库,那么问题是内存大小是多少?让我们暂时假设您正在谈论resident set size
至少有两种方法可以找出答案;
ps -u procstat -r <PID>这两种情况的示例:
> ps -u
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
rsmith 820 0.0 0.0 10088 520 v0 I Fri11PM 0:00.01 -tcsh (tcsh)
rsmith 823 0.0 0.0 9732 32 v0 I+ Fri11PM 0:00.00 /bin/sh /usr/local/bin/startx
rsmith 836 0.0 0.0 26152 1480 v0 I+ Fri11PM 0:00.00 xinit /home/rsmith/.xinitrc -- /usr/local/bi
rsmith 840 0.0 0.1 135996 4904 v0 S Fri11PM 0:23.16 i3
rsmith 878 0.0 0.0 10088 1980 0 Ss Fri11PM 0:00.74 -tcsh (tcsh)
rsmith 5091 0.0 0.0 9388 1168 0 R+ 1:04AM 0:00.00 ps -u
rsmith 74939 0.0 0.1 10088 2268 1 Is+ Mon02PM 0:00.44 -tcsh (tcsh)和
> procstat -r 820
PID COMM RESOURCE VALUE
820 tcsh user time 00:00:00.000000
820 tcsh system time 00:00:00.011079
820 tcsh maximum RSS 1840 KB
820 tcsh integral shared memory 2728 KB
820 tcsh integral unshared data 800 KB
820 tcsh integral unshared stack 256 KB
820 tcsh page reclaims 402
820 tcsh page faults 25
820 tcsh swaps 0
820 tcsh block reads 58
820 tcsh block writes 0
820 tcsh messages sent 0
820 tcsh messages received 0
820 tcsh signals received 1
820 tcsh voluntary context switches 105
820 tcsh involuntary context switches 0在这种情况下,procstat为您提供的信息最多。
procstat程序使用libprocstat来获取进程信息。所以你基本上有两个选择;
subprocess.check_output调用procstat,并解析其输出。libprocstat.使用ctypes获取信息
第一个选项可能是最简单的,第二个可能更轻量级。
关于控制内存,有两个方面;
Python
中的使用率
您可以尝试通过主动del不再需要的-ing对象来最小化Python内存使用。在ctypes中,您可能必须为函数分配缓冲区(例如,使用ctypes.create_string_buffer)或数组来存储其数据。这些都是Python对象,可以这样处理。您可以调用gc.collect()来强制垃圾回收。
但有时库会返回指向它们所分配的数据结构的指针。这些通常必须通过C库中的free()或C库提供的特殊函数来释放。
https://stackoverflow.com/questions/31320974
复制相似问题