这就是 Redis 绑定 CPU 带来的性能问题 。
10.使用Swap
如果你发现 Redis 突然变得非常慢,每次的操作耗时都达到了几百毫秒甚至秒级,那此时你就需要检查 Redis 是否使用到了 Swap,在这种情况下 Redis 基本上已经无法提供高性能的服务了 。
什么是 Swap?为什么使用 Swap 会导致 Redis 的性能下降?
如果你对操作系统有些了解,就会知道操作系统为了缓解内存不足对应用程序的影响,允许把一部分内存中的数据换到磁盘上 , 以达到应用程序对内存使用的缓冲,这些内存数据被换到磁盘上的区域,就是 Swap 。
问题就在于,当内存中的数据被换到磁盘上后,Redis 再访问这些数据时,就需要从磁盘上读?。?访问磁盘的速度要比访问内存慢几百倍!
尤其是针对 Redis 这种对性能要求极高、性能极其敏感的数据库来说,这个操作延时是无法接受的 。
此时,你需要检查 Redis 机器的内存使用情况,确认是否存在使用了 Swap 。
你可以通过以下方式来查看 Redis 进程是否使用到了 Swap:
# 先找到 Redis 的进程 ID$ ps -aux | grep redis-server# 查看 Redis Swap 使用情况$ cat /proc/$pid/smaps | egrep '^(Swap|Size)'输出结果如下:
Size:1256 kBSwap:0 kBSize:4 kBSwap:0 kBSize:132 kBSwap:0 kBSize:63488 kBSwap:0 kBSize:132 kBSwap:0 kBSize:65404 kBSwap:0 kBSize:1921024 kBSwap:0 kB
每一行 Size 表示 Redis 所用的一块内存大?。?Size 下面的 Swap 就表示这块 Size 大小的内存,有多少数据已经被换到磁盘上了,如果这两个值相等,说明这块内存的数据都已经完全被换到磁盘上了 。
如果只是少量数据被换到磁盘上,例如每一块 Swap 占对应 Size 的比例很小 , 那影响并不是很大 。如果是几百兆甚至上 GB 的内存被换到了磁盘上,那么你就需要警惕了,这种情况 Redis 的性能肯定会急剧下降 。
11.碎片整理
Redis 的数据都存储在内存中,当我们的应用程序频繁修改 Redis 中的数据时,就有可能会导致 Redis 产生内存碎片 。
内存碎片会降低 Redis 的内存使用率 , 我们可以通过执行 INFO 命令,得到这个实例的内存碎片率:
# Memoryused_memory:5709194824used_memory_human:5.32Gused_memory_rss:8264855552used_memory_rss_human:7.70G...mem_fragmentation_ratio:1.45
这个内存碎片率是怎么计算的?
很简单,mem_fragmentation_ratio = used_memory_rss / used_memory 。
其中 used_memory 表示 Redis 存储数据的内存大?。?而 used_memory_rss 表示操作系统实际分配给 Redis 进程的大小 。
如果 mem_fragmentation_ratio > 1.5 , 说明内存碎片率已经超过了 50%,这时我们就需要采取一些措施来降低内存碎片了 。
解决的方案一般如下:
1)如果你使用的是 Redis 4.0 以下版本,只能通过重启实例来解决
2)如果你使用的是 Redis 4.0 版本,它正好提供了自动碎片整理的功能,可以通过配置开启碎片自动整理 。
但是,开启内存碎片整理,它也有可能会导致 Redis 性能下降 。
原因在于 , Redis 的碎片整理工作是也在主线程中执行的,当其进行碎片整理时,必然会消耗 CPU 资源,产生更多的耗时 , 从而影响到客户端的请求 。
所以,当你需要开启这个功能时,最好提前测试评估它对 Redis 的影响 。
Redis 碎片整理的参数配置如下:
# 开启自动内存碎片整理(总开关)activedefrag yes# 内存使用 100MB 以下 , 不进行碎片整理active-defrag-ignore-bytes 100mb# 内存碎片率超过 10%,开始碎片整理active-defrag-threshold-lower 10# 内存碎片率超过 100%,尽最大努力碎片整理active-defrag-threshold-upper 100# 内存碎片整理占用 CPU 资源最小百分比active-defrag-cycle-min 1# 内存碎片整理占用 CPU 资源最大百分比active-defrag-cycle-max 25# 碎片整理期间,对于 List/Set/Hash/ZSet 类型元素一次 Scan 的数量active-defrag-max-scan-fields 1000
Redis如何优化1.慢查询优化
1)尽量不使用 O(N) 以上复杂度过高的命令,对于数据的聚合操作,放在客户端做 。
2)执行 O(N) 命令,保证 N 尽量的?。ㄍ萍?N <= 300),每次获取尽量少的数据,让 Redis 可以及时处理返回 。
2.集中过期优化
一般有两种方案来规避这个问题:
1.集中过期 key 增加一个随机过期时间,把集中过期的时间打散,降低 Redis 清理过期 key 的压力
2.如果你使用的 Redis 是 4.0 以上版本,可以开启 lazy-free 机制 , 当删除过期 key 时,把释放内存的操作放到后台线程中执行,避免阻塞主线程 。
推荐阅读
- 如何构建六层大数据堆栈架构
- Python之Redis操作
- java中如何实现本地缓存?
- 没有门厅如何设计玄关,入户没有玄关可以摆放大绿植
- 教你如何给冰箱除冰 冰箱除冰小技巧
- 如何养育男孩儿
- 相机照片删除了怎么恢复 相机照片删除了如何恢复
- 发黄的衣服如何洗掉 发黄的衣服如何洗
- 如何清除衣服上的口香糖 如何清除衣服上的口香糖污渍
- 三门青蟹如何保存不会死 三门青蟹怎样才能放长时间
