linux 模拟oom

简介: linux 模拟oom

1,测试脚本

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#define MEM_SIZE 1024 * 1024 * 1024

int main() {
    while (1) {
    char* addr[4];
    int i = 1;
    int b;
    printf("请输入要分配的内存大小(以字节为GB,输入0退出):");
    scanf("%d", &b);
        if (b == 0) {
            break;
        }
        
    for(i = 0; i < b; ++i) {
        addr[i] = (char*) malloc(MEM_SIZE);
        if(!addr[i]) {
            printf("执行 malloc 失败, 错误:%s\n",strerror(errno));
            return -1;
        }
        printf("主线程调用malloc后,申请1gb大小得内存,此内存起始地址:0X%x\n", addr[i]);
    }

    for(i = 0; i < b; ++i) {
        printf("开始访问第 %d 块虚拟内存(每一块虚拟内存为 1 GB)\n", i + 1);
        memset(addr[i], 0, MEM_SIZE);
    }
    }    
    return 0;
}

2,编译

 gcc -o memory_allocation m.c

3,测试

查看系统内存: 系统没有配置swap


[root@k8s01 shm]# free -h
              total        used        free      shared  buff/cache   available
Mem:           7.6G        597M        3.4G        3.4G        3.7G        3.4G
Swap:            0B          0B          0B


执行编译后文件:

[root@k8s01 ~]# ./memory_allocation 
请输入要分配的内存大小(以字节为GB,输入0退出):5
主线程调用malloc后,申请1gb大小得内存,此内存起始地址:0X59239010
主线程调用malloc后,申请1gb大小得内存,此内存起始地址:0X19238010
主线程调用malloc后,申请1gb大小得内存,此内存起始地址:0Xd9237010
主线程调用malloc后,申请1gb大小得内存,此内存起始地址:0X99236010
主线程调用malloc后,申请1gb大小得内存,此内存起始地址:0X59235010
开始访问第 1 块虚拟内存(每一块虚拟内存为 1 GB)
开始访问第 2 块虚拟内存(每一块虚拟内存为 1 GB)
开始访问第 3 块虚拟内存(每一块虚拟内存为 1 GB)
开始访问第 4 块虚拟内存(每一块虚拟内存为 1 GB)
Killed  <<< OOM 进行被kill

检查系统日志:

Feb 21 09:54:36 k8s01 kernel: memory_allocati invoked oom-killer: gfp_mask=0x280da, order=0, oom_score_adj=0
Feb 21 09:54:36 k8s01 kernel: memory_allocati cpuset=/ mems_allowed=0
Feb 21 09:54:36 k8s01 kernel: CPU: 0 PID: 126526 Comm: memory_allocati Tainted: G               ------------ T 3.10.0-693.el7.x86_64 #1
Feb 21 09:54:36 k8s01 kernel: Hardware name: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 11/12/2020
Feb 21 09:54:36 k8s01 kernel: ffff880212a65ee0 000000005eacd9b4 ffff880212aa7a70 ffffffff816a3d91
Feb 21 09:54:36 k8s01 kernel: ffff880212aa7b00 ffffffff8169f186 ffffffff810e939c ffff880225ba8fa0

常用内存检查命令:

free

vmstat

sar -r/sar -W/sar -B

cat /proc/zoneinfo  

cat /proc/buddyinfo  

cat /proc/pagetypeinfo  






































相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
6月前
|
缓存 监控 Java
在Linux中,OOM是什么引起的?排查思路是什么?
在Linux中,OOM是什么引起的?排查思路是什么?
|
9月前
|
存储 缓存 监控
深入解析linux内存指标:快速定位系统内存问题的有效技巧与实用方法(free、top、ps、vmstat、cachestat、cachetop、sar、swap、动态内存、cgroops、oom)
深入解析linux内存指标:快速定位系统内存问题的有效技巧与实用方法(free、top、ps、vmstat、cachestat、cachetop、sar、swap、动态内存、cgroops、oom)
1531 0
|
存储 缓存 监控
Linux系统之 OOM 解析
在实际的业务场景中,有没有发现这样一种场景:基于 VM 环境上面所部署的 Spring Boot 应用服务,往往在运行过程中将内存利用的足够“猥琐”,常常达到 90% 甚至以上,此时,很大一部分伙伴就开始“叫”了。曰:领导,内存不够了,赶紧扩容!!!(此刻,有大佬肯定在想:扩什么,整天搞这些没用的~)
403 0
|
Oracle 关系型数据库 Linux
Linux: Out-of-Memory (OOM) Killer (Doc ID 452000.1)
Linux: Out-of-Memory (OOM) Killer (Doc ID 452000.1)
261 0
|
Linux
Linux有趣的内核机制:OOM
神秘而又有趣的Linux机制:OOM
3369 0
|
Web App开发 关系型数据库 MySQL