暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SWAPPINESS到底是个啥?

白鳝的洞穴 2020-08-24
1529
SWAPPINESS这个参数对于DBA来说并不陌生,老白在《DBA优化日记》中也记录了一个2006年时候的一个通过设置这个参数解决一个RAC节点经常宕机的故障的案例。现在很多有些经验的DBA都会有这个共识,就是在运行数据库的时候,尽可能把SWAPPINESS设置的低一些,甚至设置为0。网上也有很多关于SWAPPINESS设置的最佳实践。比如Oracle数据库设置为10(当年老白解决DBA日记里的那个重启故障时选择的值也是10),MYSQL数据库、REDIS设置为1等。
大家照着这些最佳实践去做了,发现只有好处,没啥坏处。不过SWAPPINESS到底是个什么样的参数,它是如何发挥作用的?今天老白就和大家一起来探讨一下。
大家都知道SWAP是UNIX虚拟内存管理的基础架构之一,在WINDOWS上实际也有一个类似的虚拟内存管理机制,就是PAGEFILE.SYS,这个机制是WINDOWS NT时代从OPEN VMS上学来的,今天就不做过多的讨论了。为了确保优先的物理内存能够更好的使用,设计了SWAP这个机制,就是当物理内存不够用的时候,可以把一些不常用的物理内存交换到磁盘中,然后把这部分物理内存腾出来供新的内存分配需求使用。这种机制让物理内存得到了极大的扩充,在内存十分昂贵的时代,是确保UNIX系统可以支撑大量用户使用的关键技术。
LINUX继承了UNIX的核心思想,平时的时候,内存尽可能的被程序使用,当内存使用超过某个设定的高水位的时候,才开始回收内存。内存回收有两个机制,一个是KSWAPD,负责定期的在后台回收内存,一个是当需要分配内存的进程无法获得所需的内存时,系统会自动产生内存回收线程去做回收。具体的一些细节我们以后找时间讨论,今天重点讨论SWAPPINESS。
无论采取哪种形式回收内存,被回收的内存主要是两个方面的内存,一种是用于文件缓冲(FILE CACHE)的内存,另一种是程序使用的内存(匿名块),如果要释放文件缓冲,只需要把脏页回写到文件中,非脏页直接释放就可以了,这种回收的成本较低;如果要回收匿名内存,则需要首先把这些内存写到SWAP里,才能释放这部分内存。需要回收内存的时候,首先回收哪种内存呢?而SWAPPINESS就是为了调整这两类内存的回收策略的。

通过LINUX源代码中的这段,大家可以十分清晰的看出SWAPPINESS的作用,这个参数是用来调整这个策略的,在代码中SWAPPINESS直接作为匿名内存的回收优先级,而文件缓冲的回收优先级是200-SWAPPINESS。也就是说如果SWAPPINESS设置为100的话,匿名内存与文件缓冲回收的优先级相同。而缺省的60则让LINUX系统优先回收文件缓冲。如果把这个参数调整为10,则文件缓冲回收的优先级会变得特别高。而网上有些朋友说的设置为0会关闭SWAP,这个说法是不准确的,设置为0,如果OS在释放文件缓冲后还无法满足内存的需求,则SWAP还是会发生的。
从上面的结论看,是不是数据库服务器配置足够的内存,然后直接设置SWAPPINESS为0就万事大吉了呢?也是不一定的,实际上SWAP是保护操作系统在任何时候都健康运行的关键组件,服务器长期运行时候什么事情都可能发生,再大的内存也无法保障任何时候内存都够用。这也是大家总结出来的MYSQL数据库不能设置为0,要设置为1的一个主要原因。为什么需要这么设计呢?
为了防止物理内存与SWAP都完全耗尽的情况发生,LINUX还引入了OOM KILLER机制来确保最坏的情况下,确保系统还能最低限度的运行。因为MYSQL是一种单进程多线程的数据库,因此MYSQL服务进程使用的内存会相当大,它的OOM_SCORE(OOM KILLER总是找SCORE比较高的进程下手)总是很高,因此很容易被误杀。如果SWAPINESS设置为0,那么当物理内存使用出现瓶颈的时候,很容易出现SWAP使用率过高的情况,导致服务进程被杀,而设置为1后,这种现象有所缓解。实际上,设置为1并不能根绝这种情况,因为SWAPPINESS只是一个调整FILE CACHE和匿名内存回收优先级的参数,并不能确定SWAP是否进行。解决这个问题的关键并不是设置SWAPPINESS,而是需要调整MYSQL服务进程的OOM_SCORE。不仅仅针对MYSQL是如此的,对于所有的单进程多线程架构的数据库也是如此,比如REDIS。
实际上,调整SWAPPINESS是和你的服务器上运行的PAAS组件紧密相关的,如果只存在数据库服务,那么策略相对还比较容易确定,设低一点绝对是没问题的。如果还有一些其他的服务,那么就需要根据你的具体应用去权衡了,本身这个参数就是一个权衡用的优先级控制参数。前面的讨论还仅仅是内存完全足够的情况下的策略选择,现在很多服务都云化了,在云上,一切都超配的环境下,那么调整这个参数就要更加小心了,调整不好就更容易出问题了。今天时间关系,我们先讨论到这里,关于云化环境下的内存与SWAP策略,我们以后找时间再聊。
文章转载自白鳝的洞穴,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论