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

我想通过Linux上的进程来测量内存使用情况,特别是Ubuntu 15.04,但我不确定如何正确执行此操作。 我希望测量结果与free命令相关联,以便发现使用的内存总量与free报告(sans buffers / cache)相对应。

到目前为止,我已经编写了这个Python脚本,但它与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程序报告内容相符的内存使用情况?

对于上下文来说,问题在于我的服务器上的内存使用量随着时间的推移而增加,直到大量交换内存被使用并因此导致很大的交易速度减慢。 我想知道这个原因。


在Linux上free读取/proc/meminfo文件(请参阅proc(5) )。 你可以通过调用strace free来保证它没有很长的输出。

PS由于您的评论而更新。

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

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

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

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

VmRSS:居民组大小。

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

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

总而言之, proc(5)是一个很好的阅读。

PPS关于:

对于上下文来说,问题在于我的服务器上的内存使用量随着时间的推移而增加,直到大量交换内存被使用并因此导致很大的交易速度减慢。 我想知道这个原因。

如果您想诊断哪些进程会占用所有内存,则可以通过共享使用的物理内存(类型“M”)来调用top和排序进程。

链接地址: http://www.djcxy.com/p/80171.html

上一篇: How to properly measure process memory usage on Linux?

下一篇: Current memory usage of process at runtime on Solaris