- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章MySQL OOM 系列三 摆脱MySQL被Kill的厄运由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
前面两章,我们分析了Linux内存分配的策略以及Linux通过使用 OOM_Killer的机制解决了“超售”引起的风险,MySQL同其他的应用程序一样,在操作系统允许的范围内也是可以超售的,一般人理解,Innodb_buffer_pool必须小于实际物理内存,否则MySQL会启动失败。其实这是一个误区,这个不是MySQL层控制的,这个是操作系统(OS)层控制的,就是前面提到的/proc/sys/overcommit_memory控制OS是否允许“超售”。如果允许“超售”,则Innodb_buffer_pool可以远远超过实际的内存空间大小,但是这部分空间是没有使用的。我们可以做个小实验,见下图:
MySQL的Innodb_buffer_pool开了5G,但实际内存只有3G。 讲了这么多,现在言归正传,回到我们最早提到的RDS实例被OS Kill掉的问题上来,前面我们也提到了,一旦实例可用内存不足,MySQL一般都会成为OOM_Killer的首选目标。这里就涉及到两个问题:
1.为什么会内存不足? 2.如何让MySQL摆脱被Kill的厄运? 首先我们来看一下第一个问题。内存不足这个问题产生原因很多,但是主要就两个方面,第一个是MySQL自身内存的规划有问题。第二个就是一般部署MySQL的服务器,都会部署很多的监控或者定时任务脚本,而这些脚本往往缺少必要的内存限制,导致在高峰期的时候占用大量的内存,导致触发Linux OOM_Killer机制,MySQL就无辜牺牲了。 那如何才能让MySQL摆脱被Kill的厄运呢? MySQL被Kill的根源在于Linux超售的内存分配机制,前面也提到了,只要存在这种超售的机制,就不可能完全避免某一个应用程序被Kill的风险。那要使得MySQL一定不会被Kill掉,只能禁止操作系统超出实际内存空间的分配内存。但是前面我们也提过,对于部署了MySQL的服务器,我们不建议这么做,因为MySQL的很多内存都是刚开始申请了,并不是立即使用的,OS一旦禁止超售,这不仅对MySQL自身内存规划提出更苛刻的要求,同时也存在内存无法充分利用的问题。同时,MySQL的每个连接的私有内存是动态分配的,如果分配不到,就会直接导致服务器Crash,这样也会增加MySQL Crash的风险。 既然受限于操作系统,无法完全做到避免被Kill,那只能尽量降低MySQL被Kill的几率。我觉得至少可以做下面3个事情:
1)合理的规划MySQL的内存使用。 2)调整OOM_adj参数,将MySQL被OOM_Killer锁定的优先级降低。 3)加强内存的监控和报警,一旦报警,DBA应该迅速介入,Kill掉一些占用较多内存的连接.
最后此篇关于MySQL OOM 系列三 摆脱MySQL被Kill的厄运的文章就讲到这里了,如果你想了解更多关于MySQL OOM 系列三 摆脱MySQL被Kill的厄运的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
一个观察:当我在 android 上开发我的应用程序时,我注意到 LogCat 中有以下两行。这些发生是因为我自己的应用程序的内存需求太多。我读过 Android 可以决定何时摆脱不需要或由于内存需求
SIGINT有什么区别信号和 SIGTERM信号?我知道SIGINT相当于在键盘上按Ctrl+C,但什么是SIGTERM为了?如果我想优雅地停止一些后台进程,我应该使用哪些? 最佳答案 响应的唯一区别
假设我有一个父进程和一个子进程(以例如 fork() 或 clone() 启动)在 Linux 上运行。进一步假设存在一些父子都可以修改的共享内存。 在父进程的上下文中,我想停止子进程并知道它实际上已
所以我最近了解到 kill is not a synchronous命令,所以我在 bash 中使用这个 while 循环,这很棒: while kill PID_OF_THE_PROCESS 2>/
我遇到了一个问题。我们有一个干净的脚本用来清理旧文件,有时我们需要停止它,稍后再启动它。像下面的过程。我们在check.sh中使用kill -STOP $pid和kill -CONT $pid来控制c
内核中谁负责终止进程。 如果“kill”来了,进程处于阻塞状态怎么办。 kill是否等到进程进入running状态才清理自己。 如果有人可以在内核方面回答更多问题,例如当 kill 命令生成 SIGI
在下面的链接中 http://www.faqs.org/docs/Linux-HOWTO/NFS-HOWTO.html 它说一个进程除非被“sure kill”才能杀死,但是什么是sure kill?
我正在尝试编写一个快速的 bash 脚本,以在脚本检测到的特定条件下向程序发出信号,并且出于习惯,我正在使用某些 bin 实用程序的完整路径,即 /bin/rm 和 /bin/kill 代替 rm 和
我的服务器在端口 80 上运行 nohup。我试试 ps aux | grep nohup 得到 root 9234 0.0 0.1 11740 932 pts/1 S+ 15:19 0:00 gre
我写了下面的脚本,如果 grep 在文件中找不到相关的字符串,它会启用 20 秒的超时。 脚本运行良好,但是脚本的输出是这样的: ./test: line 11: 30039: Killed 如何从
基本上我想要一个 bash 脚本进程,在收到 SIGINT 后,在退出之前杀死它的所有子进程。我读了here使用以下内容: trap "kill -TERM -$$ ; exit 1" INT QUI
我有一个名为 Launcher.sh 的 shell 脚本,它由 java 进程执行。 java进程内部使用ProcessBuilder来执行bash脚本。 在 Launcher.sh 中,我有以下代
上下文 我创建了一个调用 celery 任务的 Django 应用程序,该任务又会生成其他任务并等待它们完成。 工作流程如下: 1) 主要的python/django代码在后台启动一个celery任务
我要输出这条消息/usr/local/ex1.sh: line xxx: Killed ex2.sh >> $LOG_FILE 2>&1到日志文件。 不过 “ex1.sh”输出 /usr/local
我最近上传了很多问题,我认为人们对我感到厌倦,但我不擅长编程,并且正在尝试为 A-level 类(class)编写游戏代码,所以我需要所有可以得到的帮助来学习语言。不管怎样,我将在下面展示一些相关的代
hadoop job -kill job_id 和 yarn application -kill application_id 有什么区别? job_id 和 application_id 是否代表/
在我的 post-command-hook回调,当我这样做时 kill-word , this-command var 是 kill-region - 而不是 kill-word正如预期的那样。 我想
我有一个要在 Oracle Linux OS 上运行的 C++ 应用程序。 考虑一下,我用 new 创建了几个对象。运算符(operator)。虽然我已经使用 delete 操作符来解除分配它,但是
不确定是否相关,但在周末我将我的操作系统升级到 Big Sur 11.1 版,然后当我开始工作时,一件又一件地出错,现在我根本无法使用 node 或 npm。我在 zsh 中收到以下消息: % nod
我使用 python 并行启动两个子进程。一个是 HTTP 服务器,而另一个是另一个程序的执行(CustomSimpleHTTPServer.py,它是由 selenium IDE 插件生成的 pyt
我是一名优秀的程序员,十分优秀!