位置: 编程技术 - 正文

MySQL OOM 系统二 OOM Killer(mysql osc)

编辑:rootadmin

推荐整理分享MySQL OOM 系统二 OOM Killer(mysql osc),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:mysql osc,mysql 6.0,2059 mysql,mysql9.0,mysql 6.0,mysql9.0,mysql9.0,mysql2,内容如对您有帮助,希望把文章链接给更多的朋友!

这里就涉及到一个问题,到底Kill掉谁呢?一般稍微了解一些Linux内核的同学第一反应是谁用的最多,就Kill掉谁。这当然是Linux内核首先考虑的一种重要因素,但是也不完全是这样的,我们查一些Linux的内核方面的资料,可以知道其实Kill谁是由/proc/<pid>/oom_score来决定的,这个值每个进程一个,是由Linux内核的oom_badness()函数负责计算的。那下面我们来仔细读一读badness()函数。

在badness()函数的注释部分,写明了badness()函数的处理思路:

1) we lose the minimum amount of work done 2) we recover a large amount of memory 3) we don't kill anything innocent of eating tons of memory 4) we want to kill the minimum amount of processes (one) 5) we try to kill the process the user expects us to kill, this algorithm has been meticulously tuned to meet the principle of least surprise ... (be careful when you change it)

总的来说就是Kill掉最小数量的进程来获取最大数量的内存,这与我们Kill掉占用内存最大的进程是吻合的。

/* * The memory size of the process is the basis for the badness. */

points = p->mm->total_vm;

分数的起始是进程实际使用的RAM内存,注意这里不包括SWAP,即OOM Killer只会与进程实际的物理内存有关,与Swap是没有关系的,并且我们可以看到,进程实际使用的物理内存越多,分数就越高,分数越高就越容易被牺牲掉。

/* * Processes which fork a lot of child processes are likely * a good choice. We add the vmsize of the childs if they * have an own mm. This prevents forking servers to flood the * machine with an endless amount of childs */ ... if (chld->mm != p->mm && chld->mm) points += chld->mm->total_vm;

这段表示子进程占用的内存都会计算到父进程上。

s = int_sqrt(cpu_time); if (s) points /= s; s = int_sqrt(int_sqrt(run_time)); if (s) points /= s;

这表明进程占用的CPU时间越长或者进程运行的时间越长,分数越低,越不容易被Kill掉。

/* * Niced processes are most likely less important, so double * their badness points. */ if (task_nice(p) > 0) points *= 2;

如果进程优先级低(nice值,正值低优先级,负值高优先级),则Point翻倍。

/* * Superuser processes are usually more important, so we make it * less likely that we kill those. */ if (cap_t(p->cap_effective) & CAP_TO_MASK(CAP_SYS_ADMIN) || p->uid == 0 || p->euid == 0) points /= 4;

super用户的进程优先级较低。

/* * We don't want to kill a process with direct hardware access. * Not only could that mess up the hardware, but usually users * tend to only have this flag set on applications they think * of as important. */ if (cap_t(p->cap_effective) & CAP_TO_MASK(CAP_SYS_RAWIO)) points /= 4;

直接可以访问原始设备的进程优先级较高。

/* * Adjust the score by oomkilladj. */ if (p->oomkilladj) { if (p->oomkilladj > 0) points <<= p->oomkilladj; else points >>= -(p->oomkilladj);

MySQL OOM 系统二 OOM Killer(mysql osc)

}

每个进程有个oomkilladj 可以设置该进程被kill的优先级,这个参数看上去对Point影响还是比较大的,oomkilladj 最大+,最小是-,越大越容易被干掉,这个值由于是移位运算,所以影响还是比较大的。

下面我写个小程序实验一下:

上面的程序先申请一个1G的内存空间,然后M为单位,填充这些内存空间。在一个2G内存,M Swap空间的机器上跑3个上面的进程。我们看一下运行结果:

test1、test2、test3分别申请了1G的虚拟内存空间(VIRT),然后每隔s,实际占用的RAM空间就增长M(RES)。

当物理内存空间不足时,OS开始进行Swap,可用的Swap空间开始减少。

当内存是在没有可分配的空间时,test1进程被操作系统Kill掉了。dmesg 我们可以看到,test1进程被OS Kill掉,同时oom_score为。

这3个进程的oom_adj全部都是默认值0。下面我们来实验一下设置了oom_adj的效果。重新启动3个进程,然后我们看到test2的PID是

我们运行一下下面的语句

echo > /proc//oom_adj

一段时间后,我们看到Swap空间急剧减少,基本上OS OOM_Killer要开动了。

果然,不出意料,进程被kill掉了。

所以为了避免自己需要的进程被kill掉,可以通过设置进程的oom_adj来实现。当然,有的人会说,这一切都是超售引起的,既然Linux提供了overcommit_memory可以禁用overcommit特性,那为什么不禁用呢。这有利也有弊,一旦禁用overcommit,就意味着MySQL根本无法申请超过实际内存的空间,而在MySQL中,存在很多动态申请内存空间的地方,如果申请不到,MySQL就会Crash,这大大增加了MySQL宕机的风险,这也是Linux为什么要overcommit的原因。

有了上面的分析,我们不难看出,如果在不设置oom_adj的前提下,MySQL一般都会成为OOM_Killer的首选对象,因为MySQL一般都是内存的最大占用者。那作为MySQL,我们如何尽量的去规避被Kill的风险呢,下一章我们将重点从MySQL的角度分析如何规避OOM。

MySQL OOM 系列三 摆脱MySQL被Kill的厄运 前面两章,我们分析了Linux内存分配的策略以及Linux通过使用OOM_Killer的机制解决了超售引起的风险,MySQL同其他的应用程序一样,在操作系统允许的范围

MySQL Slave 触发 oom-killer解决方法 最近经常有收到MySQL实例类似内存不足的报警信息,登陆到服务器上一看发现MySQL吃掉了%的内存,God!有时候没有及时处理,内核就会自己帮我们重启

Slave memory leak and trigger oom-killer BugDescriptionWehavethisproblem:wehavesetinnodb_buffer_pool=GBonbothmasterandslave,masterofferusuallyworkload,butslavewithnothingworkloadexcepttheseslavethreads,Butwiththememoryconsumptionisincreasi

标签: mysql osc

本文链接地址:https://www.jiuchutong.com/biancheng/347921.html 转载请保留说明!

上一篇:MySQL OOM 系列一 Linux内存分配(mysql m1)

下一篇:MySQL OOM 系列三 摆脱MySQL被Kill的厄运(mysqlw3school)

  • 所得税汇算清缴后发现有误怎么办
  • 净营业周期和营业周期
  • 小规模纳税人怎么变成一般纳税人
  • 微信支付宝收入计入科目
  • 城市维护建设税免税
  • 两免三减半的范围
  • 小规模纳税人销售收入会计分录
  • 商业发票和形式发票英文
  • 小规模纳税人普通发票可以抵税吗
  • 进口货物需要交哪些税
  • 个体户国税异常怎么办
  • 个人代开普通发票需要出税费吗?
  • 重庆个人住房房产税申报
  • 显示发票离线,应当如何处理
  • 增值税发票收款人和复核人可以一个人吗
  • 烟酒发票可以抵扣所得税吗
  • 计提所得税是在哪个科目
  • 纳税申报方式怎么修改
  • 对公账户每个月
  • 收到政府补助用于购买环保设备
  • 盘库存在的问题汇总
  • iphone怎么格式化掉所有内容和设置
  • 个人开发是什么意思
  • PHP:ignore_user_abort()的用法_misc函数
  • 员工的生活费会不会扣个税
  • 圣何塞在哪
  • 会计中持有至到期投资是什么意思
  • 员工出差机票计入什么科目
  • 为什么要进行税费改革
  • php fgetcsv
  • 增长gdp是什么意思
  • 不想预缴所得税能不能提前暂估费用,会计分录
  • mysql集群三种方式
  • 为什么我会选择那个对我一般的男人结婚
  • 用命令ls-al显示出文件ff
  • 提供餐饮服务购入农产品的进项税额抵扣问题
  • 甲公司向其控股60%的子公司捐赠货币资金3000万元
  • 其他资本公积核算科目
  • 计提增值税依据
  • 应收账款项目的金额公式
  • 进项与销项区别
  • 自产和外购用于赠送
  • Windows Server 2003下修改MySQL 5.5数据库data目录
  • 工程施工人工费,材料费,机械费占多少比例
  • 个人承担的个税是公司的成本费用吗
  • 开多少平方超市赚钱
  • 免税设备是什么意思
  • 咨询费如何缴税
  • 其他应收款项
  • 银行手续费没拿可以退吗
  • 行政事业单位福利费提取比例
  • 租赁费计提部分算入印花税吗
  • 期间费用明细表在哪里找
  • 企业短期借款可以是个人吗
  • 私营企业固定资产法律制度
  • sqlserver如何保留两位小数
  • 卸载win+r
  • fedora workstation怎么安装
  • Linux系统中文件的文件名存储在文件所在的目录
  • qbupdate.exe - qbupdate是什么进程 有什么作用
  • Windows7 64位系统如何添加打印机图文教程
  • win7自带软件在哪里
  • windows8如何使用
  • vue中父子组件如何通信的
  • js的运算符
  • jQuery webuploader分片上传大文件
  • jquery自定义表单
  • app开发指南
  • unity3d图形学
  • javascript快速入门
  • js实现ping一个ip地址
  • 税务总局副局长饶
  • 什么是居民企业和非居民企业
  • 企业税收筹划中的涉税风险及其防范
  • 南京市税务局举报中心电话
  • 工信厅有什么实权
  • 异地预缴增值税销售额是含税
  • 税务局监控个人账户流程
  • 个体户刻公章需要备案吗
  • 西安市人力资源和社会保障局关于2020年
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设