Memcached:在插入特定数量的项目后键将被删除

我正在debugging一个php脚本,它将数据保存在memcache作为对应用程序进行加热的一种方式。
此脚本仅进行set调用以将数据保存到memcache ,并且在设置了特定数量的条目之后,插入的第一项开始消失(行为可重现)。

我一直在阅读memcache文档,并了解了驱逐过程,所以开始检查日志,并阅读统计信息,看看是否是这个原因。

在插入开始擦除第一个元素的项目之前停止php脚本,我运行stats slabs

 stats slabs STAT 1:chunk_size 96 STAT 1:chunks_per_page 10922 STAT 1:total_pages 1 STAT 1:total_chunks 10922 STAT 1:used_chunks 1 STAT 1:free_chunks 10921 STAT 1:free_chunks_end 0 STAT 1:mem_requested 93 STAT 1:get_hits 0 STAT 1:cmd_set 1 STAT 1:delete_hits 0 STAT 1:incr_hits 0 STAT 1:decr_hits 0 STAT 1:cas_hits 0 STAT 1:cas_badval 0 STAT 1:touch_hits 0 STAT 3:chunk_size 152 STAT 3:chunks_per_page 6898 STAT 3:total_pages 4 STAT 3:total_chunks 27592 STAT 3:used_chunks 22787 STAT 3:free_chunks 4805 STAT 3:free_chunks_end 0 STAT 3:mem_requested 3232040 STAT 3:get_hits 0 STAT 3:cmd_set 22814 STAT 3:delete_hits 0 STAT 3:incr_hits 0 STAT 3:decr_hits 0 STAT 3:cas_hits 0 STAT 3:cas_badval 0 STAT 3:touch_hits 0 STAT 4:chunk_size 192 STAT 4:chunks_per_page 5461 STAT 4:total_pages 1 STAT 4:total_chunks 5461 STAT 4:used_chunks 1300 STAT 4:free_chunks 4161 STAT 4:free_chunks_end 0 STAT 4:mem_requested 202877 STAT 4:get_hits 0 STAT 4:cmd_set 1301 STAT 4:delete_hits 0 STAT 4:incr_hits 0 STAT 4:decr_hits 0 STAT 4:cas_hits 0 STAT 4:cas_badval 0 STAT 4:touch_hits 0 STAT active_slabs 3 STAT total_malloced 6291008 

正如你所看到的,所有的板坯仍然有剩余空间。

在让脚本插入下一个项目时,memcache服务器logging下这个:

 30: going from conn_closing to conn_closed 29: going from conn_read to conn_parse_cmd <29 set [tc:e-401:id-2485:profile-5:property-11][1] 0 0 3 29: going from conn_parse_cmd to conn_nread > NOT FOUND [tc:e-401:id-2485:profile-5:property-11][1] >29 STORED 

再次调用stats slabs我看到一个新的板已被使用:

 stats slabs STAT 1:chunk_size 96 STAT 1:chunks_per_page 10922 STAT 1:total_pages 1 STAT 1:total_chunks 10922 STAT 1:used_chunks 1 STAT 1:free_chunks 10921 STAT 1:free_chunks_end 0 STAT 1:mem_requested 93 STAT 1:get_hits 0 STAT 1:cmd_set 1 STAT 1:delete_hits 0 STAT 1:incr_hits 0 STAT 1:decr_hits 0 STAT 1:cas_hits 0 STAT 1:cas_badval 0 STAT 1:touch_hits 0 STAT 2:chunk_size 120 STAT 2:chunks_per_page 8738 STAT 2:total_pages 1 STAT 2:total_chunks 8738 STAT 2:used_chunks 1 STAT 2:free_chunks 8737 STAT 2:free_chunks_end 0 STAT 2:mem_requested 120 STAT 2:get_hits 0 STAT 2:cmd_set 1 STAT 2:delete_hits 0 STAT 2:incr_hits 0 STAT 2:decr_hits 0 STAT 2:cas_hits 0 STAT 2:cas_badval 0 STAT 2:touch_hits 0 STAT 3:chunk_size 152 STAT 3:chunks_per_page 6898 STAT 3:total_pages 4 STAT 3:total_chunks 27592 STAT 3:used_chunks 22790 STAT 3:free_chunks 4802 STAT 3:free_chunks_end 0 STAT 3:mem_requested 3232437 STAT 3:get_hits 0 STAT 3:cmd_set 22817 STAT 3:delete_hits 0 STAT 3:incr_hits 0 STAT 3:decr_hits 0 STAT 3:cas_hits 0 STAT 3:cas_badval 0 STAT 3:touch_hits 0 STAT 4:chunk_size 192 STAT 4:chunks_per_page 5461 STAT 4:total_pages 1 STAT 4:total_chunks 5461 STAT 4:used_chunks 1300 STAT 4:free_chunks 4161 STAT 4:free_chunks_end 0 STAT 4:mem_requested 202877 STAT 4:get_hits 0 STAT 4:cmd_set 1301 STAT 4:delete_hits 0 STAT 4:incr_hits 0 STAT 4:decr_hits 0 STAT 4:cas_hits 0 STAT 4:cas_badval 0 STAT 4:touch_hits 0 STAT active_slabs 4 STAT total_malloced 7339568 END 

第一项(用“ tc:e-501 ”开头的键不再存在)(使用memdump --servers=localhost | grep tc:e-501 ,调用get来获取第一个键也给了我不存在的)

调用stats items我看到驱逐计数器是0 …

 stats items STAT items:1:number 1 STAT items:1:age 1391 STAT items:1:evicted 0 STAT items:1:evicted_nonzero 0 STAT items:1:evicted_time 0 STAT items:1:outofmemory 0 STAT items:1:tailrepairs 0 STAT items:1:reclaimed 0 STAT items:1:expired_unfetched 0 STAT items:1:evicted_unfetched 0 STAT items:1:crawler_reclaimed 0 STAT items:2:number 1 STAT items:2:age 982 STAT items:2:evicted 0 STAT items:2:evicted_nonzero 0 STAT items:2:evicted_time 0 STAT items:2:outofmemory 0 STAT items:2:tailrepairs 0 STAT items:2:reclaimed 0 STAT items:2:expired_unfetched 0 STAT items:2:evicted_unfetched 0 STAT items:2:crawler_reclaimed 0 STAT items:3:number 22790 STAT items:3:age 1391 STAT items:3:evicted 0 STAT items:3:evicted_nonzero 0 STAT items:3:evicted_time 0 STAT items:3:outofmemory 0 STAT items:3:tailrepairs 0 STAT items:3:reclaimed 0 STAT items:3:expired_unfetched 0 STAT items:3:evicted_unfetched 0 STAT items:3:crawler_reclaimed 0 STAT items:4:number 1300 STAT items:4:age 1381 STAT items:4:evicted 0 STAT items:4:evicted_nonzero 0 STAT items:4:evicted_time 0 STAT items:4:outofmemory 0 STAT items:4:tailrepairs 0 STAT items:4:reclaimed 0 STAT items:4:expired_unfetched 0 STAT items:4:evicted_unfetched 0 STAT items:4:crawler_reclaimed 0 END 

从脚本中调用set ,继续删除顺序插入的第一项,所以我丢弃了一个关键的冲突。

什么可能导致这种行为? 我目前完全无能为力。

编辑:使用memcached 1.4.20 编辑:使用选项-M似乎没有帮助,项目仍然被删除,没有set调用返回任何false值。