提升multi_index_container和内存碎片

时间:2015-11-02 19:02:11

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

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

erase

它使用push_frontreplace插入新条目(或覆盖旧条目),然后根据需要从尾部弹出元素。问题是,是否值得尝试使用relocatepush_front代替 <body> <h1 id="samsmith">Sam Smith</h1> <div id="buttonbox"> <a href="https://www.smitty1ky.tumblr.com"> <h1 class="button1"> <div class="button1con"> Tumblr </div> </h1> </a> <a href="https://open.spotify.com/user/smitty1ky"> <h1 class="button2"> <div class="button2con"> spotify </div> </h1> </a> <a href="http://westwoodlitmag.com"> <h1 class="button3"> <div class="button3con"> WestWood </div> </h1> </a> </div> <p id="welcome"> Welcome.</p> <p id="student">Student at <a href="http://woodford.kyschools.us/">WCHS.</a></p> <p id="inprogress">Coming Soon</p> <h6 class="footer">&copy; Samuel T Smith 2015</h6> <script type="text/javascript"> </script> </body>

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

1 个答案:

答案 0 :(得分:0)

我们经历过同样的事情。 我写了一个小测试程序,它使用300个线程的缓存。它保持inserterase大约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的块,在缓存已满后,内存使用量保持不变。