一、操作系统SWAP
swap空间对于操作系统来说比较重要,当我们使用操作系统的时候,如果系统内存不足,常常会将一部分内存数据页进行swap操作,以解决临时的内存困境。swap空间由磁盘提供,对于高并发场景下,swap空间的使用会严重降低系统性能,因为它引入了磁盘IO操作。
redis作为内存数据库,如果redis对应的内存发生了swap,那么redis的性能会受到极大的影响。
二、Redis为什么会触发swap
触发swap的核心原因是机器内存不足,对于redis来说有两个原因会触发swap:
- redis自身占用了大量内存,导致机器可用内存不足
- redis所在机器其他进程占用内存,导致内存不足。
三、查看Redis swap情况
在Linux中,提供了free命令来查询操作系统的内存使用情况,free 命令的结果中也包含了swap相关的情况,例如下面的结果中:
[root@VM-0-14-centos ~]# free -ht
total used free shared buff/cache available
Mem: 1.8G 1.3G 72M 692K 433M 283M
Swap: 0B 0B 0B
Total: 1.8G 1.3G 72M
我们可以看到swap的值都是0,说明当前的内存是没有配置swap空间的,目前的操作系统的内存是足够的,通常情况下swap一行的used列应该是0B比较好,它证明你的操作系统内存充足,没有发生swap空间的交换操作。
查找redis对应的进程id
src/redis-cli info | grep process_id
进入redis对应的进程目录
cd /proc/5910
查看swap
cat smaps | egrep '^(Swap|Size)'
上图中size代表redis实例占用的一块内存空间,都有一个对应的Swap,swap的大小代表该内存空间区域有多少已经被换到硬盘了,如果size和swap相等,则代表已经全部被换到了内存空间。
如果出现几百MB设置GB级别的swap时,说明redis的内存压力极大,会变慢,这个时候就需要解决这个问题。
四、解决Redis swap
最直接的办法就是增大redis实例所在机器的内存。
集群部署的redis可以通过增加实例个数,减少每个实例所需要的内存。
另外一个办法就是把redis单独部署,不要和其他应用程序一起部署,这也是比较常规的实践,同时也避免了cpu的竞争。