如何正确测量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
和排序进程。