c++ - boost multi_index_container 和内存碎片

标签 c++ boost boost-multi-index memory-fragmentation

我在服务器中使用 MIC 作为我的 LRU 缓存,它已经取代了列表/映射 LRU,因为我怀疑这是导致一些无法解释的内存占用的原因。内存泄漏是不可能的,至少没有工具发现任何泄漏以及代码检查。自从我开始使用 MIC 以来,画面有所改善(这是内存碎片的唯一证据)但还不够。我们谈论的是几 Gb 的缓存,每天都有数百万条记录从中弹出。两到三周后,问题变得清晰可见 - 如果我清空缓存,进程仍然持有无法解释的 2-3Gb 内存。
我的容器很简单:

typedef std::pair<Key, T> Element;
    typedef mic::multi_index_container<
        Element,
        mic::indexed_by<mic::sequenced<mic::tag<struct Seq>>,
                        mic::hashed_unique<mic::tag<struct Hash>, mic::member<Element, const Key, &Element::first>>>>
        item_list;

它使用 erasepush_front 插入新条目(或覆盖旧条目),然后如果需要从尾部弹出元素。问题是是否值得尝试使用 replacerelocate 而不是 push_front

UPDATE001:好的,新版本已经启动并运行,我看到重新分配显着改善了这种情况,3 周后的内存占用比没有更改的机器上的占用少了 ~1/1.5 Gb。现在它部署在全局所有机器上。作为第二阶段,缓存失效机制有许多变化。更少的弹出和重新插入也应该改善这种情况(如果它真的是内存碎片)

最佳答案

我们都经历过同样的事情。 我写了一个小测试程序,它使用 300 个线程的缓存。它使 inserting 和 eraseing 保持在大约 200k(插入 + 删除)/秒,我在周末运行了它。 我通过 pmap -x total RSS 检查了内存使用情况

pmap -x [pid] | tail -n1 | awk '{print $4}'

在一分钟的分辨率下,可以看到在加载缓存之前,内存消耗从 0 到 4.7GB 呈线性增长,之后它以对数速度增长。如图所示。 (用了 14 分钟才使缓存变满)。 enter image description here

一件更有趣的事情是 pmap -x 报告了很多正在加载的 65536k 虚拟内存块(因此这种过度内存使用可能存在理论上的最大值),但是如果我从一个线程做同样的事情测试程序分配了一个 4.7GB 的 block ,缓存满后,内存使用量保持不变。

关于c++ - boost multi_index_container 和内存碎片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33484953/

相关文章:

c++ - boost 如何知道要链接哪个 LIB 以及如何更改它?

c++ - Boost ASIO - 获取排序的端点(首先是 IPv4,然后是 IPv6)

c++ - 无法通过引用捕获 lambda 中的成员变量

c++ - 在动态库之间共享来自静态库的数据

c++ - 使用构造函数初始化您的类,该构造函数将 std::map 作为带有大括号括起来的初始化程序的参数

c++ - boost multi_index_container composite_key 中一个键的 equal_range,另一个键的下限/上限

c++ - 错误 : ‘template’ (as a disambiguator) is only allowed within templates

c++ - 在运行时管理共享库之间的 Boost::any

C++ 日志库设置

c++ - 带 map 的 Boost::multi_index