如题,最近线上的 Python 多线程的程序碰到了内存激增的问题,见上一篇帖子 https://www.v2ex.com/t/496498
现在拿到了内存各项参数,请大佬们帮忙分析分析这个内存都用到哪去了?
下面是 Python 进程的内存使用情况(anon)
1
sbw 2018-10-12 09:00:54 +08:00
$man proc
|
2
UIXX 2018-10-12 09:23:18 +08:00 1
哥们,你可能搞错了重点。你需要的是如何"调试 Python 多线程程序",而不是"看 Linux 的内存参数猜内存暴涨的源头"。
1、把线上程序拿到测试环境作稳定性测试与压力测试 2、使用内存监控工具调试疑似出错的部分 没看到具体代码之前,瞎猜浪费脑子 |
3
luozic 2018-10-12 09:49:19 +08:00 via iPhone
python 各种 pypi lib 好多探测内存泄漏的
|
4
lirau 2018-10-12 11:54:07 +08:00
单纯说 /proc/meminfo 里的各项数据,可以参考这篇文章 http://linuxperf.com/?p=142
|
5
Buffer2Disk OP @lirau 看过这个人写的文章,写的挺好的,但是对我最关心的几个参数,好像没有详细的描述
Active: 1308168 kB Inactive: 1758160 kB Active(anon): 1010416 kB Inactive(anon): 1370480 kB Active(file): 297752 kB Inactive(file): 387680 kB |
6
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 在发生换页时,是对交换区进行读 /写操作。 |