排行
数据库百科
核心案例
行业报告
月度解读
大事记
产业图谱
中国数据库
向量数据库
时序数据库
实时数据库
搜索引擎
空间数据库
图数据库
数据仓库
大调查
2021年报告
2022年报告
年度数据库
2020年openGauss
2021年TiDB
2022年PolarDB
2023年OceanBase
首页
资讯
活动
大会
学习
课程中心
推荐优质内容、热门课程
学习路径
预设学习计划、达成学习目标
知识图谱
综合了解技术体系知识点
课程库
快速筛选、搜索相关课程
视频学习
专业视频分享技术知识
电子文档
快速搜索阅览技术文档
文档
问答
服务
智能助手小墨
关于数据库相关的问题,您都可以问我
数据库巡检平台
脚本采集百余项,在线智能分析总结
SQLRUN
在线数据库即时SQL运行平台
数据库实训平台
实操环境、开箱即用、一键连接
数据库管理服务
汇聚顶级数据库专家,具备多数据库运维能力
数据库百科
核心案例
行业报告
月度解读
大事记
产业图谱
我的订单
登录后可立即获得以下权益
免费培训课程
收藏优质文章
疑难问题解答
下载专业文档
签到免费抽奖
提升成长等级
立即登录
登录
注册
登录
注册
首页
资讯
活动
大会
课程
文档
排行
问答
我的订单
首页
专家团队
智能助手
在线工具
SQLRUN
在线数据库即时SQL运行平台
数据库在线实训平台
实操环境、开箱即用、一键连接
AWR分析
上传AWR报告,查看分析结果
SQL格式化
快速格式化绝大多数SQL语句
SQL审核
审核编写规范,提升执行效率
PLSQL解密
解密超4000字符的PL/SQL语句
OraC函数
查询Oracle C 函数的详细描述
智能助手小墨
关于数据库相关的问题,您都可以问我
精选案例
新闻资讯
云市场
登录后可立即获得以下权益
免费培训课程
收藏优质文章
疑难问题解答
下载专业文档
签到免费抽奖
提升成长等级
立即登录
登录
注册
登录
注册
首页
专家团队
智能助手
精选案例
新闻资讯
云市场
微信扫码
复制链接
新浪微博
分享数说
采集到收藏夹
分享到数说
首页
/
SWAPPINESS到底是个啥?
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
领墨值
有奖问卷
意见反馈
客服小墨