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

时间:2016-01-12 21:26:52

标签: python linux memory

我想测量Linux上进程的内存使用情况,尤其是Ubuntu 15.04,但我不确定如何正确执行此操作。我希望测量值与free命令相关联,以便发现正在使用的内存总量对应于free报告的内容(无缓冲区/缓存)。

到目前为止,我已写过this Python script,但它与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))

如何调整此程序以报告与free程序报告的内容一致的内存使用情况?

对于上下文,问题是我的服务器上的内存使用量会随着时间的推移而增加,直到大量的交换内存正在使用中,因此它会大大减慢速度。我想知道原因。

1 个答案:

答案 0 :(得分:1)

Linux上的

free读取/proc/meminfo文件(请参阅proc(5))。您可以通过调用strace free来确保它,输出的时间不是很长。

P.S。由于您的评论而更新。

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

首先,您正在使用VmHWM /proc/<pid>/status字段的proc(5)字段。来自VmRSS

  

VmHWM:峰值常驻集合大小(&#34;高水位标记&#34;)。

即,给定进程在其生命周期中使用的最大物理内存量。它不是该进程的当前内存使用情况。如果要获取当前的物理内存使用情况,请查看/proc/<pid>/status

  

VmRSS:居民设定大小。

第二件事。文件/proc/<pid>/statm旨在提供人类可读性。对于程序员来说,更容易解析VmRSS并获取第二列中的值,这与/proc/<pid>/status中的proc(5)相同。

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

总而言之,top是一本非常好的读物。

P.P.S。关于:

  

对于上下文,问题是我的服务器上的内存使用量会随着时间的推移而增加,直到大量的交换内存正在使用中,因此它会大大减慢速度。我想知道原因。

如果要诊断哪些进程占用了所有内存,可以调用{{ post.custom_field_name }}并按共享使用的物理内存对进程进行排序(类型&#34; M&#34;)。