- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章MySQL OOM 系列一 Linux内存分配由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
RDS(网易云关系数据库服务)上线已经有一段时间,陆续不断有产品迁入到了RDS中,在线上运维的过程中,也遇到了一些曾经没有考虑到,或者考虑的不全的东西。后续有时间可以分享给大家.
今天想提到的是线上一个4G的RDS实例,发生了OOM(out of memory)的问题,MySQL进程被直接Kill掉了。在解释这个问题的时候,我们首先需要从Linux系统内存分配策略讲起。 一般写C语言程序,我们习惯使用malloc动态的申请内存空间(Java由JVM负责内存管理),malloc函数会向操作系统申请一段连续的内存单元,然后返回这段空间的起始地址。如果malloc函数返回为null则表示系统没有可分配的内存空间。这是我们的一般思维,当然这在某些操作系统中确实也是正确的(Solaris)。 但是Linux不是这样的,Linux的内存分配采取的是一种更加积极的分配策略,它假设应用申请了内存空间后并不会立即去使用它,所以允许一定量的超售,当应用真的需要使用它的时候,操作系统可能已经通过回收了其他应用的内存空间而变得有能力去满足这个应用的需求,简单的说,就是允许应用申请比实际可分配空间(包括物理内存和Swap)更多的内存,这个特性称为OverCommit。 这个特性在Linux操作系统里面也是可配的,可以通过设置/proc/sys/overcommit_memory为不同的值来调整OverCommit策略。 overcommit_memory可以取3个值: 0:默认值,由Linux内核通过一些启发式算法来决定是否超售和超售的大小,一般允许轻微的超售,拒绝一些明显不可能提供的请求,同时做一些规则限制,比如不同用户overcommit的大小也不一样。 1:允许,不做限制的超售,当然这个也不是无限大,还受到寻址空间的限制,32位系统最大可能只有4G,64位系统大概16T左右。 2:禁止,禁止超售,系统能够分配的内存不会超过swap+实际物理内存*overcommit_ratio,该值可以通过/proc/sys/vm/overcommit_ratio设置,默认50%.
为了验证Linux的内存分配,我们用个小程序来测试一下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
#include <stdio.h>
#include <stdlib.h>
#define MEGABYTE 1024*1024
int
main(
int
argc,
char
*argv[])
{
void
*myblock = NULL;
int
count = 0;
while
(1)
{
myblock = (
void
*)
malloc
(MEGABYTE);
if
(!myblock)
break
;
printf
(
"Currently allocating %d MB\n"
, ++count);
}
exit
(0);
}
#include <stdio.h>
#include <stdlib.h>
#define MEGABYTE 1024*1024
int
main(
int
argc,
char
*argv[])
{
void
*myblock = NULL;
int
count = 0;
while
(1)
{
myblock = (
void
*)
malloc
(MEGABYTE);
if
(!myblock)
break
;
memset
(myblock,1, MEGABYTE);
printf
(
"Currently allocating %d MB\n"
,++count);
}
exit
(0);
}
|
前者再通过malloc()申请了内存空间以后,并没有立即去使用它,而后者相反,每次申请完都立即用1去填充。我们来看看两个程序运行的结果.
这是在1G的RAM,400M Swap的虚拟机上运行的结果,前者申请了远远超过实际内存的空间,后者并没有超过实际内存可用空间。这就验证了前面叙述的Linux的内存分配策略。 本身这是一个系统的优化,无可厚非。但是我们知道,但凡“超售”都是基于不会有大量程序同时使用资源的假设,这显然也是有风险的。所以Linux又使用了一种OOM Killer(Out Of Memory killer)的机制,在系统可用内存(包括Swap)即将使用完之前,选择性的Kill掉一些进程以求释放一些内存。下一章我们重点讨论一下Linux OOM Killer的机制.
最后此篇关于MySQL OOM 系列一 Linux内存分配的文章就讲到这里了,如果你想了解更多关于MySQL OOM 系列一 Linux内存分配的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
这里就涉及到一个问题,到底Kill掉谁呢?一般稍微了解一些Linux内核的同学第一反应是谁用的最多,就Kill掉谁。这当然是Linux内核首先考虑的一种重要因素,但是也不完全是这样的,我们查一些Li
这个问题在这里已经有了答案: Set a JVM to dump heap when OutOfMemoryError is thrown (2 个答案) 关闭 5 年前。 我是JAVA新手。我在用
我们正在使用 Fitnesse 对复杂的基于 Web 的应用程序进行验收测试。全套流程需要几个小时才能通过,因此我们使用多个流程。设置如下: maven fork Fitnesse 服务器进程 mav
我正在Tensorflow的LSTM-RNN上训练一些音乐数据,并且遇到了我不明白的一些GPU内存分配问题:当实际上似乎还有足够的VRAM可用时,我遇到了OOM。 一些背景: 我正在使用6GB的GTX
我正在使用 tf 运行 seq2seq 模型,当使用 tf.train.Saver 从检查点文件加载参数时,推理程序运行良好。但是在使用 freeze_graph.py(使用 tf.framework
我有一个问题需要用 JS 中的某种继承来解决。 我设置了一个小的 jsfiddle 来解释,看: V1 http://jsfiddle.net/FFTj4/5/ function Vehicule(n
这里是 JS 的新手,所以如果我遗漏了一些明显的东西,我深表歉意。尝试构建一个随机数生成器(它以嵌套方式工作,所以有点像随机数元组列表),但我收到此代码的 OOM 错误。 (比如,如果我尝试做类似 g
我有一个需要显示全屏图像的应用程序,我从可绘制文件夹中获取图像,它们大约为 150-250 kb,但它仍然崩溃并出现 OutOfMemory 错误。当然不是第一张图片,但每次用户启动应用程序时我都会加
我正在使用 spark 从 postgres 表中读取并将其作为 json 转储到 Google 云存储。该表很大,有数百个 GB。该代码相对简单(请参见下文)但因 OOM 而失败。似乎 spark
即使系统中有足够的内存并且正确提供了所有必需的内存设置,Tomcat 仍无法启动并出现 OOM。这种情况并没有持续发生,证明 tomact 配置没有问题。 15-Jan-2019 20:17:31.0
我在高负载多线程Java项目中遇到OOM异常问题。 我很感激你能给我任何帮助。 德莱尔斯: 项目是建立在Java+Mysql作为存储。 没有证据表明在应用程序崩溃时会使用额外的RAM(任何监控工具都不
我使用 Android P-OS。内核版本为msm-4.14 自启动以来,oom 被调用并终止进程。不过内存还是很丰富的。我的内存大小是8GByte,Swap是1GByte。我什至没有使用交换。 [
所有的一切, 我正在使用 openjdk 1.8.0_212-b04、Tomcat 8.0.21 和 Red Hat 6.4。 并且我已经调整了测试web应用程序,确保重新部署后不会有没有这样的消息:
所以我在 Crashlytics 中看到我们有很多崩溃是由位图的 OOM 引起的。似乎其中 60% 来自 6.0.1 上的 Galaxy S7 Edge 设备。我们拥有的是一个包含 2 个图像的着陆屏
最近我们在 Docker 容器中遇到了 Ruby 的问题。尽管负载非常低,但应用程序往往会消耗大量内存,并且在提到的一段时间后会出现 OOM。 经过一番调查,我们将问题缩小到单线 docker run
Snakemake 工作流可以在任何类型的失败后重新尝试每次重启,包括如果错误是内存不足(OOM),例如 def get_mem_mb(wildcards, attempt): return
我有一个有趣的问题。我想我发现了一个无限请求循环,它导致我的 istio-proxy 在特定情况下因 OOM 错误而崩溃。 当我直接从应用程序容器内部将请求本地提交到应用程序时,它似乎工作正常,并且在
我使用的是 ActiveMQ 5.2,我的应用程序需要大量主题,大约 500,000 个。当我运行我的应用程序时,仅创建大约 1000 个主题后,ActiveMQ 会抛出 OutOfMemoryExc
我在 k8s 运算符上部署了一个结构化流作业,它只是从 kafka 读取数据,反序列化,添加 2 列并将结果存储在数据湖中(尝试了 delta 和 parquet),几天后执行程序增加了内存,最终我得
我的Mac上的Minikube中有一个本地Kubernetes集群。我将Minio独立服务器部署为具有指定资源限制的单个容器。当我上载大于容器内存限制的文件时,容器因OOMKilled原因终止。在Ub
我是一名优秀的程序员,十分优秀!