我在服务器中使用MIC作为我的LRU缓存,它已经取代了列表/地图LRU,因为我怀疑这是导致一些无法解释的内存占用的原因。内存泄漏无法实现,至少没有工具发现任何泄漏以及代码检查。自从我开始使用MIC以来,图片得到了改进(这是内存碎片的唯一证据)但还不够。我们正在讨论几个Gb的缓存,每天有数百万条记录从中弹出。在两到三周之后,问题变得清晰可见 - 如果我清空缓存,则进程仍然保留无法解释的2-3Gb内存。
我的容器非常简单:
erase
它使用push_front
和replace
插入新条目(或覆盖旧条目),然后根据需要从尾部弹出元素。问题是,是否值得尝试使用relocate
和push_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">© Samuel T Smith 2015</h6>
<script type="text/javascript">
</script>
</body>
?
UPDATE001:好的,新版本已经启动并运行,我看到realocate显着改善了这种情况,3周后的内存占用量比没有更改的机器上的占用空间小~1 / 1.5 Gb。现在它部署在全球所有机器上。作为第二阶段,缓存失效机制有许多变化。较少的抛射和重新插入也应该改善这种情况(如果真的是内存碎片)
答案 0 :(得分:0)
我们经历过同样的事情。
我写了一个小测试程序,它使用300个线程的缓存。它保持insert
和erase
大约200k(插入+擦除)/秒,我在周末运行它。
我通过pmap -x total RSS检查了内存使用情况
pmap -x [pid] | tail -n1 | awk '{print $4}'
在一分钟的分辨率中,人们可以看到,在加载缓存之前,内存消耗是从0到4.7GB的线性,之后它以对数速度增加。如图所示。 (花了14分钟才使缓存满了)。
另一个有趣的事情是,pmap -x报告了很多65536k的虚拟内存块被加载(因此这个过多的内存使用可能存在理论上的最大值),但是如果我从一个线程做了同样的事情测试程序分配了一个4.7GB的块,在缓存已满后,内存使用量保持不变。