我们看到Redis 4.0.2实例存在一些奇怪的内存问题。主实例的比率为0.12,而从属具有合理的比率,悬停在1以上。当我们重新启动主实例时,内存碎片比率回到1,直到我们达到峰值加载时间并且比率回到小于0.2。 OS(Ubuntu)告诉我们redis实例使用13GB的虚拟内存和1.6GB的RAM。一旦发生这种情况,大部分数据都会被交换到磁盘,性能几乎停滞不前。
我们的钥匙在被清除之前往往会持续一两天。大多数值都是哈希和zset,大约有100个条目,每个条目大于1kb左右。
我们不确定是什么导致这种情况。我们尝试调整操作系统overcommit_memory
。我们还尝试了新的MEMORY PURGE
命令,但这似乎都没有帮助。我们正在寻找其他可供探索的事情和建议。任何建议将不胜感激。
可能的原因是什么?我们如何才能使比率接近1?
这是我们的记忆信息转储:
127.0.0.1:8000> info memory
# Memory
used_memory:12955019496
used_memory_human:12.07G
used_memory_rss:1676115968
used_memory_rss_human:1.56G
used_memory_peak:12955019496
used_memory_peak_human:12.07G
used_memory_peak_perc:100.00%
used_memory_overhead:19789422
used_memory_startup:765600
used_memory_dataset:12935230074
used_memory_dataset_perc:99.85%
total_system_memory:33611145216
total_system_memory_human:31.30G
used_memory_lua:945152
used_memory_lua_human:923.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:0.13
mem_allocator:jemalloc-4.0.3
active_defrag_running:0
lazyfree_pending_objects:0
我们的记忆统计数据:
127.0.0.1:8000> memory stats
1) "peak.allocated"
2) (integer) 12954706848
3) "total.allocated"
4) (integer) 12954623968
5) "startup.allocated"
6) (integer) 765600
7) "replication.backlog"
8) (integer) 1048576
9) "clients.slaves"
10) (integer) 33716
11) "clients.normal"
12) (integer) 184494
13) "aof.buffer"
14) (integer) 0
15) "db.0"
16) 1) "overhead.hashtable.main"
2) (integer) 17691184
3) "overhead.hashtable.expires"
4) (integer) 32440
17) "overhead.total"
18) (integer) 19756010
19) "keys.count"
20) (integer) 337422
21) "keys.bytes-per-key"
22) (integer) 38390
23) "dataset.bytes"
24) (integer) 12934867958
25) "dataset.percentage"
26) "99.853401184082031"
27) "peak.percentage"
28) "99.999359130859375"
29) "fragmentation"
30) "0.12932859361171722"