文章内容

2023/6/20 19:30:27,作 者: 黄兵

Redis 占用内存过多导致硬盘大量读操作

最近 Linux 服务程序经常与 Redis 断开连接,导致服务停止。

登录 Redis 服务器之后,发现内存利用率已经达到 90% +,应该是 Redis 占用了过多内存。

别问过怎么知道,这台虚拟机上只安装了 Redis 一个程序。

内存利用率最高达到 89.5%,截图如下:

中间没有数据部分,是由于监控程序卡死,导致监控数据无法上传导致的。

通过腾讯云控制台监控程序,我们可以看到磁盘 IO 繁忙比已经接近 100%,截图如下:


硬盘读达到 265 MB/s,截图如下:

通过上面的监控数据我们可以看出 Redis 内存用完之后,会导致大量读硬盘,同时却没有导致很大的写硬盘数据。

产生以上原因:

当 Redis 占用过高并导致大量读取硬盘的情况发生时,可能有几个原因导致这种情况。下面是一些可能的原因和相应的解决方法:

  1. 内存不足:Redis 是一个内存数据库,它将数据存储在内存中以提供快速读取和写入操作。如果服务器的内存不足,Redis 将不得不频繁地将数据从硬盘中读取到内存中,这将导致大量的硬盘读取操作。解决方法是增加服务器的内存容量,确保 Redis 能够将所有数据都存储在内存中,从而减少对硬盘的读取需求。

  2. 数据集过大:如果 Redis 中存储的数据集非常大,超过了服务器可用内存的容量,那么 Redis 也会频繁地从硬盘中读取数据。在这种情况下,可以考虑使用 Redis 的分片(sharding)功能,将数据分布在多个 Redis 实例上,从而将数据集的大小限制在每个实例的可用内存范围内。

  3. 持久化选项配置不当:Redis 提供了不同的持久化选项,如 RDB 快照和 AOF 日志。如果配置不当,比如过于频繁地进行持久化操作,或者没有开启合适的持久化选项,那么 Redis 将会频繁地将数据写入硬盘,从而导致大量的硬盘读取。确保持久化选项的配置合理,并根据实际需求选择适当的持久化方式。

  4. 键过期设置不当:如果 Redis 中存在大量的过期键,并且配置不当,那么 Redis 在清理过期键时可能会导致大量的硬盘读取。通过检查 Redis 的键过期设置,并进行适当的调整,可以减少对硬盘读取的需求。

  5. 高并发操作:如果 Redis 频繁地接收大量的读取请求,而服务器的处理能力不足以满足这些请求,那么 Redis 将会不得不从硬盘中读取数据来响应这些请求。在这种情况下,可以考虑优化 Redis 的性能,例如通过增加服务器的计算能力或者使用 Redis 集群来分担负载。

以上是一些可能导致 Redis 占用过高并引起大量硬盘读取的常见原因和解决方法。根据具体情况,您可能需要结合实际情况进行分析和调整。如果问题仍然存在,建议查看 Redis 的日志和监控工具,以获取更详细的信息和指导。


如果在 Redis 中读取硬盘的操作较多,而写入硬盘的操作较少,可能有以下几个原因:

  1. 内存不足:如果 Redis 的数据集超过了服务器的可用内存容量,而且服务器没有足够的内存来容纳所有的数据,Redis 将不得不频繁地将数据从硬盘读取到内存中进行读取操作。这是因为 Redis 将热门或经常访问的数据保留在内存中,而不经常访问的数据被交换到硬盘上。因此,如果服务器的内存不足以容纳所有的数据,就会导致大量的硬盘读取操作。

  2. 缓存命中率低:Redis 通常用作缓存数据库,用于加速读取操作。如果缓存命中率较低,即大部分的读取操作都无法从 Redis 的内存中命中缓存,而是需要从硬盘读取数据,就会导致大量的硬盘读取操作。

  3. 持久化操作:如果 Redis 配置了持久化选项,如 RDB 快照或 AOF 日志,那么在执行持久化操作时,Redis 将会将数据写入硬盘。通常情况下,持久化操作比较耗时,而写入硬盘的频率相对较低,因此写入硬盘的操作较少。

  4. 数据库访问模式:如果 Redis 的访问模式偏向于读取操作,比如大量的 GET 请求而较少的 SET 或其他写入操作,就会导致读取硬盘的操作较多。

需要注意的是,硬盘读取操作的多少与写入操作的多少也可能受到其他因素的影响,例如硬盘性能、操作系统的文件缓存等。因此,在分析和优化读写操作时,需要综合考虑这些因素,并结合具体的环境和使用情况进行调整和优化。

由于 Redis 中缓存的数据不是很重要,直接通过 flushdb 或者 flushall 命令清空 Redis 缓存。


总结:

由于这是一个很久以前的程序,对于 Redis 不是很熟悉,没有设置键到期时间,同时也没有通过服务去清理不需要的缓存的数据,导致数据一直被积压到 Redis 当中,最后内存一直占用过高。

在我们使用 Redis 的时候,一定要记得设置过期,同时有些没法设置过期的数据,需要通过服务定期定理 Redis,才不会长年累月导致 Redis 占用内存过高。

如果还有什么问题,欢迎下面留言。


其它相关推荐:

1、redis.exceptions.ConnectionError: Error 111 connecting to redis-server:6379. Connection refused.

2、Redis 过期监控示例

3、redis.Redis 和 redis.StrictRedis 的区别

4、Redis 迁移过程

5、Ubuntu 20.04 安装 Redis


黄兵个人博客原创。

转载请注明出处:黄兵个人博客 - Redis 占用内存过多导致硬盘大量写操作

分享到:

发表评论

评论列表