Python 如何正确测量Linux上的进程内存使用情况?

Python 如何正确测量Linux上的进程内存使用情况?,python,linux,memory,Python,Linux,Memory,我想测量Linux上进程的内存使用情况,特别是Ubuntu 15.04,但我不确定如何正确地做到这一点。我希望测量值与free命令相关联,以便发现正在使用的内存总量与free报告(sans缓冲区/缓存)相对应 到目前为止,我已经写过,但它与free不一致,因为它报告了较低的总内存使用率: #!/usr/bin/env python from collections import OrderedDict import os.path import re def parse_mem_file(f

我想测量Linux上进程的内存使用情况,特别是Ubuntu 15.04,但我不确定如何正确地做到这一点。我希望测量值与
free
命令相关联,以便发现正在使用的内存总量与
free
报告(sans缓冲区/缓存)相对应

到目前为止,我已经写过,但它与
free
不一致,因为它报告了较低的总内存使用率:

#!/usr/bin/env python
from collections import OrderedDict
import os.path
import re


def parse_mem_file(filename):
    data = OrderedDict()
    with open(filename, 'rb') as f:
        for line in f:
            splittage = line.split(':')
            data[splittage[0]] = splittage[1].strip()
    return data


def get_process_mem_usage():
    re_pid = re.compile(r'^\d+$')
    re_mem = re.compile(r'^(\d+) .+$')
    pid2usage = {}
    for pid in [d for d in os.listdir('/proc') if re_pid.match(d)]:
        fpath = os.path.join('/proc', pid, 'status')
        try:
            data = parse_mem_file(fpath)
        except IOError:
            continue

        try:
            pid2usage[pid] = int(re_mem.match(data['VmHWM']).group(1)) / 1024.
        except KeyError:
            continue

    return OrderedDict(
        sorted(pid2usage.iteritems(), key=lambda x: x[1], reverse=True))


pid2usage = get_process_mem_usage()
total_usage = sum(pid2usage.values())
print('Total memory usage: {:.2f}'.format(total_usage))
for pid, usage in pid2usage.iteritems():
    print('{}: {:.2f} MB'.format(pid, usage))
如何调整此程序以根据
空闲
程序报告的内容报告内存使用情况


就上下文而言,问题在于,随着时间的推移,我的服务器上的内存使用量不断增加,直到大量交换内存被使用,结果导致速度大大降低。我想知道原因。

Linux上的免费读取
/proc/meminfo
文件(请参阅
proc(5)
)。您可以通过调用
strace-free
来确保它,因为没有很长的输出

由于您的评论,p.S.已更新

free
显示有关物理内存的信息。它将使用的物理内存量计算为
MemTotal-MemFree
。因此,我们对系统中进程使用的物理内存感兴趣

首先,您使用的是
/proc//status
文件的
VmHWM
字段。从
过程(5)

VmHWM:峰值驻留集大小(“高水位线”)

也就是说,给定进程在其生存期内使用的最大物理内存量。这不是进程的当前内存使用情况。如果要获取当前物理内存使用情况,请查看
VmRSS

VmRSS:常驻集大小

第二件事。文件
/proc//status
设计为人类可读。对于程序员来说,更容易解析
/proc//statm
并在第二列中获取值,这与
/proc//status
中的
VmRSS
相同

现在是最重要的部分。当我们考虑物理内存时,我们应该记住它是一个全系统的东西。由于多种原因,无法将物理内存量计算为系统中所有进程的驻留集大小之和。首先,不仅是用户空间进程在系统中使用物理内存,还有内核——所有设备驱动程序、内核线程,谁知道还有什么。其次,进程之间可以共享内存

总之,
proc(5)
是一本非常好的读物

p.p.S.关于:

就上下文而言,问题在于,随着时间的推移,我的服务器上的内存使用量不断增加,直到大量交换内存被使用,结果导致速度大大降低。我想知道这件事的原因


如果您想诊断哪些进程消耗了所有内存,可以调用
top
并按使用的物理内存份额(键入“M”)对进程进行排序。

但是我如何衡量单个进程的内存使用情况,以便使总内存与空闲内存相对应是一个问题。这里有很多有趣的信息,但这并没有真正让我更接近解决我的问题。首先,我想写一个程序,找出什么在窃取内存。其次,正在运行的进程中
VmRSS
的总和只有128 MB,而
free
显示大约955 MB的RAM和1045 MB的swap正在使用中。当我在顶部按内存使用情况排序时,它只在顶部显示docker和node,内存使用率分别为4.9%和2.5%。我还没有找到任何东西来说明为什么会使用1GB的交换。@aknuds1可能值得在superuser.com或serverfault.com上询问。我已经写了Docker在serverfault上的交换用法,因为我通过
top
发现它使用了大约780MB的交换。