`

Memcached 相关问题

阅读更多
1. memcached 将内存分成若干大小按比例增加的slab,LRU 是在slab内进行的。

2. 系统启动时,给各个slab预分配一定的内存。剩下的内存(A)不属于任何slab。当某个slab内存不足时,从(A)中分配,分配之后就永远属于该slab了,如果(A)中没有内存,则该slab上发生LRU。这也是给各个slab预分配内存的原因,防止slab需要内存从(A)中分配时,(A)中无内存可用,预留的内存保证了该slab上有至少有预留内存可用。

3. memcached 运行一段时间,(A)中内存必然耗尽,如果在此之前,某个slab从来没有存储过数据,那么该slab上可用的内存就是预留内存,这导致如果该slab突然需要存储数据,该slab发生LRU的概率就很大,因为预留内存很小。举例说明:memcached中存储的都是很小的数据,小数据slab很快耗尽了(A)中的内存,如果要存储大数据,大数据所在的slab只有预留内存可用,而预留内存通常很小,导致大数据频繁的LRU,这通常严重影响性能。

4. 客户端通过hash使用memcached池,存在某个key导致某个memcached实例负载/IO高的可能。例如,某个key存放的是大数据,该key的访问量很大,那么这个key所在memcached网络IO会比其它机器高。

5. 一个用户反映它的mecached的内存使用率不足50%,但是某个key经常刚set进去就get不出来。这个memcached池有4台memcached组成,我随机挑了两台stats,的确没有LRU发生。我换了另一个key,重现该问题。这是怎么回事?我想了很久,最后老老实实的在每台机器上stats,发现有一台机器的内存使用率很高,这台机器有LRU,我和用户的key都落在了这台机器上。因为其它3台机器最近重启过,这导致整体的内存使用率看起来很低。

6. 我觉得redis也免不了这些问题。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics