Redis 优化之swap分区

    技术2022-07-10  101

     

    swappiness 参数说明


    swap对于操作系统来比较重要, 当物理内存不足时, 可以将一部分内存页进行swap操作, 已解燃眉之急。 但世界上没有免费午餐, swap空间由硬盘提供, 对于需要高并发、 高吞吐的应用来说, 磁盘IO通常会成为系统瓶颈。 在Linux中, 并不是要等到所有物理内存都使用完才会使用到swap, 系统参数swppiness会决定操作系统使用swap的倾向程度。 swappiness的取值范围是0~100, swappiness的值越大, 说明操作系统可能使用swap的概率越高, swappiness值越低, 表示操作系统更加倾向于使用物理内存。 swap的默认值是60, 了解这个值的含义后, 有利于Redis的性能优化。 如图swappiness的重要值进行了说明。

    运维提示 OOM(Out Of Memory) killer机制是指Linux操作系统发现可用内存不足时, 强制杀死一些用户进程(非内核进程) , 来保证系统有足够的可用内存进行分配。

    从表中可以看出, swappiness参数在Linux3.5版本前后的表现并不完全相同, Redis运维人员在设置这个值需要关注当前操作系统的内核版本。

    需要根据服务器运行的程序类型,来设置不同的参数值。例如,对于Oracle一般设置为10;对于MySQL一般设置为1,尽可能不用swap分区。  

     

    设置方法


    swappiness设置方法如下:

    echo bestvalue > /proc/sys/vm/swappiness

    但是上述方法在系统重启后就会失效, 为了让配置在重启Linux操作系统后立即生效, 只需要在/etc/sysctl.conf追加vm.swappiness={bestvalue}即可。

    echo vm.swappiness=bestvalue >> /etc/sysctl.conf [root@localhost ~]# cat /proc/sys/vm/swappiness 30 修改vm.swappiness=1 [root@localhost ~]# echo vm.swappiness=1 >> /etc/sysctl.conf [root@localhost ~]# cat /proc/sys/vm/swappiness 30 然后加载参数 [root@localhost ~]# sysctl -p vm.swappiness = 1 [root@localhost ~]# cat /proc/sys/vm/swappiness 1 需要注意/proc/sys/vm/swappiness是设置操作, /etc/sysctl.conf是追加操作。

     

    如何监控swap


    (1) 查看swap的总体情况 Linux提供了free命令来查询操作系统的内存使用情况, 其中也包含了swap的相关使用情况。 下面是某台Linux服务器执行free–m(以兆为单位)的结果, 其中需要重点关注的是最后一行的swap统计, 从执行结果看,swap一共有4095MB, 使用了0MB, 空闲4095MB。

    total used free shared buffers cached Mem: 64385 31573 32812 0 505 10026 -/+ buffers/cache: 21040 43344 Swap: 4095 0 4095

    在另一台Linux服务器同样执行free-m, 这台服务器开启了8189M swap,其中使用了5241MB。

    total used free shared buffers cached Mem: 24096 8237 15859 0 136 2483 -/+ buffers/cache: 5617 18479 Swap: 8189 5241 2947

    (2) 实时查看swap的使用 Linux提供了vmstat命令查询系统的相关性能指标, 其中包含负载、CPU、 内存、 swap、 IO的相关属性。 但其中和swap有关的指标是si和so, 它们分别代表操作系统的swap in和swap out。 下面是执行vmstat1(每隔一秒输出) 的效果, 可以看到si和so都为0, 代表当前没有使用swap。

    # vmstat 1 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 1 0 0 33593468 517656 10271928 0 0 0 1 0 0 8 0 91 0 0 4 0 0 33594516 517656 10271928 0 0 0 0 10606 9647 10 1 90 0 0 1 0 0 33594392 517656 10271928 0 0 0 0 11490 10244 11 1 89 0 0 6 0 0 33594292 517656 10271928 0 0 0 36 12406 10681 13 1 87 0 0

    (3) 查看指定进程的swap使用情况 Linux操作系统中, /proc/{pid}目录是存储指定进程的相关信息, 其中/proc/{pid}/smaps记录了当前进程所对应的内存映像信息, 这个信息对于查询指定进程的swap使用情况很有帮助。 下面以一个Redis实例进行说明。通过info server获取Redis的进程号process_id:

    redis-cli -h ip -p port info server | grep process_id process_id:986

    通过cat/proc/986/smaps查询Redis的smaps信息, 由于有多个内存块信息, 这里只输出一个内存块镜像信息进行观察:

    2aab0a400000-2aab35c00000 rw-p 2aab0a400000 00:00 0 Size: 712704 kB Rss: 617872 kB Shared_Clean: 0 kB Shared_Dirty: 0 kB Private_Clean: 15476 kB Private_Dirty: 602396 kB Swap: 58056 kB Pss: 617872 kB

    其中Swap字段代表该内存块存在swap分区的数据大小。 通过执行如下命令, 就可以找到每个内存块镜像信息中, 这个进程使用到的swap量, 通过求和就可以算出总的swap用量:

    cat /proc/986/smaps | grep Swap Swap: 0 kB Swap: 0 kB… Swap: 0 kB Swap: 478320 kB… Swap: 624 kB Swap: 0 kB

    如果Linux>3.5, vm.swapniess=1, 否则vm.swapniess=0, 从而实现如下两个目标: ·物理内存充足时候, 使Redis足够快。 ·物理内存不足时候, 避免Redis死掉(如果当前Redis为高可用, 死掉比阻塞更好) 。  

    Processed: 0.012, SQL: 9