我创建了一个守护进程,用作 Cassandra 数据库的代理。我称之为它snapdbproxy
是因为它代理了来自其他服务器和工具的 CQL 命令。
每当我访问该工具时,它都会创建一个新线程,管理各种 CQL 命令,然后一旦连接丢失,我就会干净地退出线程。
看看内存占用,它增长得非常快(最活跃的系统很快达到 Gb 的虚拟内存,这利用了一些不断增长的交换内存。)在启动时,它大约是 300Mb。
该软件是用 C++ 编写的,带有析构函数、RAII、智能指针等......但我仍然验证了:
使用
-fsanitizer=address
(我在 Linux 下使用 g++)并且我没有泄漏(好吧,很少... 300 字节以下,因为我找不到如何摆脱 OpenSSL 创建的一些 Cryto 缓冲区)使用 valgrind massif,它说我在初始化时使用 4.7mB,然后在 4mB 下进行(我运行相同的代码超过 1 小时,结果相同!)
有一些输出ms_print
(我删除了堆栈,因为它全为零)。
-------------------------------------------------------------------
n time(i) total(B) useful-heap(B) extra-heap(B)
-------------------------------------------------------------------
0 0 0 0 0
1 78,110,172 4,663,704 4,275,532 388,172
2 172,552,798 3,600,840 3,369,538 231,302
3 269,590,806 3,611,600 3,379,648 231,952
4 350,518,548 3,655,208 3,420,483 234,725
5 425,873,410 3,653,856 3,419,390 234,466
...
67 4,257,283,952 3,693,160 3,459,545 233,615
68 4,302,665,173 3,694,624 3,460,827 233,797
69 4,348,046,440 3,693,728 3,457,524 236,204
70 4,393,427,319 3,685,064 3,449,697 235,367
71 4,438,812,133 3,698,352 3,461,918 236,434
正如我们所看到的,经过一小时和来自各种其他守护进程的多次访问(至少 100 次访问)后,valgrind 告诉我我只使用了大约 4mB 的内存。我尝试了两次,认为第一次尝试可能失败了。结果相同。
所以......我或多或少没有想法。为什么我的进程在虚拟内存方面会继续增长,即使在每个线程退出时都正确释放了一切——如地块输出所示——以及整个过程——如-fsanitizer=address
(好吧,我没有显示这里是消毒剂的输出,但相信我,它不到 300 字节。不是 Gb 的泄漏。)
watch
当我查看内存(虚拟内存)状态时,会在一段时间后输出命令:
Every 1.0s: grep ^Vm /proc/1773/status Tue Oct 2 21:36:42 2018
VmPeak: 1124060 kB <-- starts at under 300 Mb...
VmSize: 1124060 kB
VmLck: 0 kB
VmPin: 0 kB
VmHWM: 108776 kB
VmRSS: 108776 kB
VmData: 963920 kB <-- this tags along
VmStk: 132 kB
VmExe: 1936 kB
VmLib: 65396 kB
VmPTE: 888 kB <-- this increases too (necessary to handle the large Vm)
VmPMD: 20 kB
VmSwap: 0 kB
每次其他守护程序运行时VmPeak
,VmSize
、 和VmData
all 都会增加(大约每 5 分钟一次)。
但是,内存(malloc/free)没有改变。我现在正在登录sbrk(0)
(根据 1201ProgramAlarm 评论的一个想法——我对他评论第一部分的解释),该地址保持不变:
sbrk() = 0x4228000
正如博士所建议的那样,我查看/proc/<pid>/maps
了一段时间内的内容。这是一两个增量。不幸的是,我没有被告知是什么创建了这些缓冲区。我唯一能想到的是我的线程......(即堆栈和线程状态的一点空间)
--- a1 2018-10-02 21:50:21.887583577 -0700
+++ a2 2018-10-02 21:52:04.823169545 -0700
@@ -522,6 +522,10 @@
59dd0000-5a5d0000 rw-p 00000000 00:00 0
5a5d0000-5a5d1000 ---p 00000000 00:00 0
5a5d1000-5add1000 rw-p 00000000 00:00 0
+5add1000-5add2000 ---p 00000000 00:00 0
+5add2000-5b5d2000 rw-p 00000000 00:00 0
+5b5d2000-5b5d3000 ---p 00000000 00:00 0
+5b5d3000-5bdd3000 rw-p 00000000 00:00 0
802001000-802b8c000 rwxp 00000000 00:00 0
802b8c000-802b8e000 ---p 00000000 00:00 0
802b8e000-802c8e000 rwxp 00000000 00:00 0
哦……是的!我从分离线程到加入的最新变化......实际上根本没有加入线程。现在使用正确的连接进行测试......它工作正常!我的!坏一个!