首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Redis RDB远小于内存使用量(716MB) (203KB)

Redis RDB远小于内存使用量(716MB) (203KB)
EN

Stack Overflow用户
提问于 2016-04-24 16:31:05
回答 2查看 900关注 0票数 1

我有一个Redis实例,它充当Logstash的队列和Sensu的数据库,所以理想情况下队列总是几乎为空的,因为Logstash能够以提交给Redis的速度处理日志,而Sensu只存储最新的测量结果。但是,当我在Redis上执行检查内存使用情况时,它会说:

root@b7588aa11859:/data# redis-cli info | grep memory used_memory:751751344 used_memory_human:716.93M used_memory_rss:774729728 used_memory_peak:754163560 used_memory_peak_human:719.23M used_memory_lua:154624

但是当我检查dump.rdb文件的大小时,它显示:

root@b7588aa11859:/data# ls -lah total 212K drwxr-xr-x 2 redis redis 4.0K Apr 24 08:22 . drwxr-xr-x 49 root root 4.0K Apr 21 06:07 .. -rw-r--r-- 1 redis redis 203K Apr 24 08:22 dump.rdb

Logstash似乎工作得很好;日志流入Kibana,指标流入Grafana。

当我运行rdb -c memory dump.rdb时,我得到了许多使用很少内存的键,只有topbeat键(我使用TopBE拍来收集指标)使用了大量的内存:

database,type,key,size_in_bytes,encoding,num_elements,len_largest_element 0,list,"topbeat",797811,linkedlist,1686,986

但是,797811字节仍然只有779KB。

那么为什么Redis还在占用所有的内存呢?在过去的2200分钟内,它的内存使用量一直以大约300kb/分钟的速度稳步增长。

下面是一些日志:

1:M 24 Apr 08:22:07.312 * 10000 changes in 60 seconds. Saving... 1:M 24 Apr 08:22:07.333 * Background saving started by pid 5648 5648:C 24 Apr 08:22:07.346 * DB saved on disk 5648:C 24 Apr 08:22:07.362 * RDB: 1 MB of memory used by copy-on-write 1:M 24 Apr 08:22:07.449 * Background saving terminated with success 1:M 24 Apr 08:25:07.403 * 10000 changes in 60 seconds. Saving... 1:M 24 Apr 08:25:07.427 * Background saving started by pid 5657 5657:C 24 Apr 08:25:07.462 * DB saved on disk 5657:C 24 Apr 08:25:07.473 * RDB: 1 MB of memory used by copy-on-write 1:M 24 Apr 08:25:07.527 * Background saving terminated with success 1:M 24 Apr 08:29:07.375 * 10000 changes in 60 seconds. Saving... 1:M 24 Apr 08:29:07.391 * Background saving started by pid 5660 5660:C 24 Apr 08:29:07.419 * DB saved on disk 5660:C 24 Apr 08:29:07.433 * RDB: 1 MB of memory used by copy-on-write 1:M 24 Apr 08:29:07.492 * Background saving terminated with success 1:M 24 Apr 08:33:07.372 * 10000 changes in 60 seconds. Saving... 1:M 24 Apr 08:33:07.396 * Background saving started by pid 5661 5661:C 24 Apr 08:33:07.423 * DB saved on disk 5661:C 24 Apr 08:33:07.435 * RDB: 2 MB of memory used by copy-on-write 1:M 24 Apr 08:33:07.496 * Background saving terminated with success

EN

回答 2

Stack Overflow用户

发布于 2016-04-24 16:44:17

RDB文件的大小是同一数据加载到内存时的不同表示形式。

当您需要使用内存时,Redis的重点是尽可能优化数据访问时间,可能会发生这样的情况:数据可能以访问时间为优先级的方式进行组织。

与内存优化相反,当Redis执行快照到磁盘(RDB文件)时,优先考虑的不是速度,而是限制磁盘消耗,因为如您所知,Redis不处理文件,其数据是使用后台进程持久化的。也就是说,任何写操作都首先在内存中持久化,如果出现问题,不能完全保证整个数据都会命中磁盘。

票数 0
EN

Stack Overflow用户

发布于 2016-04-24 16:46:38

Redis与许多键值存储一样,在删除键时不会释放内存。所以redis的实际内存使用量基本上是峰值内存使用量。

有关更多信息,请查看redis documentation的内存分配部分。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36820908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档