背景:我正在研究一个搜索引擎,并开发一个新功能,它将创建一个新的线程池(32 个线程)。符合某些规则的查询将由新的线程池执行。同时,旧的线程池(也有 32 个线程)可能仍然有效,并且会执行其他查询。
问题:我们使用 Jemalloc 进行内存分配。当我们启用新功能并且新线程池开始工作时,Jemalloc 消耗的内存在 4~5 小时内从 80GB 增加到 95GB,然后在 2 小时内下降。我查看了 Jemalloc 的统计数字,增加的内存全部来自“stats.mapped”(由 Jemalloc 分配)。“stats.active”和“stats.allocated”(由我们的服务消耗)保持不变,这意味着增加的内存可能来自内存碎片。
以下是“stats.mapped”、“stats.allocated”和“stats.active”的定义:
- JeMalloc 映射字节:分配器 (Jemalloc) 映射的活动块中的总字节数(默认为每个块 4MB)。这是块大小的倍数,并且大于 JeMalloc Active Bytes。这不包括不活动的块,即使是那些包含未使用的脏页的块,这意味着 this 和 stats.resident 之间没有严格的顺序。
- JeMalloc Active Bytes:应用程序(我们的服务)分配的活动页面中的总字节数(默认为每页 4 KB)。这是页面大小的倍数,并且大于或等于 stats.allocated。这不包括 stats.arenas..pdirty,也不包括完全用于分配器元数据的页面。
- JeMalloc Allocated Bytes:应用程序(我们的服务)分配的字节总数。
由于内存增加太大(从 80GB 到 95GB),我们希望在启用我们的功能时减轻内存影响,您对上述问题(Jemalloc 的内存碎片)有什么建议吗?谢谢!
我曾尝试禁用 tcache,但启用新功能时内存仍会增加。