关于 /proc/meminfo 里面各项内存参数的意义,有大佬能说清楚嘛?

2018-10-11 21:50:59 +08:00
 Buffer2Disk

如题,最近线上的 Python 多线程的程序碰到了内存激增的问题,见上一篇帖子 https://www.v2ex.com/t/496498

现在拿到了内存各项参数,请大佬们帮忙分析分析这个内存都用到哪去了?

下面是 Python 进程的内存使用情况(anon)

3470 次点击
所在节点    程序员
6 条回复
sbw
2018-10-12 09:00:54 +08:00
$man proc
UIXX
2018-10-12 09:23:18 +08:00
哥们,你可能搞错了重点。你需要的是如何"调试 Python 多线程程序",而不是"看 Linux 的内存参数猜内存暴涨的源头"。

1、把线上程序拿到测试环境作稳定性测试与压力测试

2、使用内存监控工具调试疑似出错的部分

没看到具体代码之前,瞎猜浪费脑子
luozic
2018-10-12 09:49:19 +08:00
python 各种 pypi lib 好多探测内存泄漏的
lirau
2018-10-12 11:54:07 +08:00
单纯说 /proc/meminfo 里的各项数据,可以参考这篇文章 http://linuxperf.com/?p=142
Buffer2Disk
2018-10-12 21:24:48 +08:00
@lirau 看过这个人写的文章,写的挺好的,但是对我最关心的几个参数,好像没有详细的描述
Active: 1308168 kB
Inactive: 1758160 kB
Active(anon): 1010416 kB
Inactive(anon): 1370480 kB
Active(file): 297752 kB
Inactive(file): 387680 kB
lirau
2018-10-17 15:50:02 +08:00
间接的以及引用的链接(这个 http://linuxperf.com/?p=97 )里还是说了一些的。

比如你贴的这个数据:
Active: 1308168 kB = Active(anon): 1010416 kB + Active(file): 297752 kB

然后 Active(anon) 表示 anonymous pages,Active(file)表示 file-backed pages

inactive 同理


详细参考原文,这里做一下零碎的摘抄:

它们的含义在 manpage 中只给了简单的说明,并未详细解释:

inact: the amount of inactive memory. (-a option)
active: the amount of active memory. (-a option)


fs/proc/meminfo.c:
==================
0023 static int meminfo_proc_show(struct seq_file *m, void *v)
0024 {
...

0032 unsigned long pages[NR_LRU_LISTS];
...

0051 for (lru = LRU_BASE; lru < NR_LRU_LISTS; lru++)
0052 pages[lru] = global_page_state(NR_LRU_BASE + lru);
...

0095 "Active: %8lu kB\n"
0096 "Inactive: %8lu kB\n"
0097 "Active(anon): %8lu kB\n"
0098 "Inactive(anon): %8lu kB\n"
0099 "Active(file): %8lu kB\n"
0100 "Inactive(file): %8lu kB\n"
...

0148 K(pages[LRU_ACTIVE_ANON] + pages[LRU_ACTIVE_FILE]),
0149 K(pages[LRU_INACTIVE_ANON] + pages[LRU_INACTIVE_FILE]),
0150 K(pages[LRU_ACTIVE_ANON]),
0151 K(pages[LRU_INACTIVE_ANON]),
0152 K(pages[LRU_ACTIVE_FILE]),
0153 K(pages[LRU_INACTIVE_FILE]),
...

这段代码的意思是统计所有的 LRU list,其中 Active Memory 等于 ACTIVE_ANON 与 ACTIVE_FILE 之和,Inactive Memory 等于 INACTIVE_ANON 与 INACTIVE_FILE 之和

Active/inactive memory 是针对用户进程所占用的内存而言的,内核占用的内存(包括 slab )不在其中。

ACTIVE_ANON 和 ACTIVE_FILE,分别表示 anonymous pages 和 file-backed pages。用户进程的内存页分为两种:与文件关联的内存(比如程序文件、数据文件所对应的内存页)和与文件无关的内存(比如进程的堆栈,用 malloc 申请的内存),前者称为 file-backed pages,后者称为 anonymous pages。File-backed pages 在发生换页(page-in 或 page-out)时,是从它对应的文件读入或写出; anonymous pages 在发生换页时,是对交换区进行读 /写操作。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/496855

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX