记录一次解决centos不定时触发oom的经历

news2024/11/28 6:45:27

前言

前一段时间,业务部门的系统不定时的反馈,系统打开不了,提示:
在这里插入图片描述
等技术开发同学反应过来去查看业务状态时,服务又恢复了,由于不是核心的业务,并且出问题差不多1分钟左右,没太在意,但过一会或过一天一定时的又有反馈过来了,开始重视这个问题,总的来説这个问题的表现是,连不上mysql数据库,并且在1分钟左右会自恢复,首先让我们负责运维的同学去看看mysql的日志,这一看,果然发现了问题:

# Query_time: 52.047320  Lock_time: 0.000000 Rows_sent: 0  Rows_examined: 0
SET timestamp=1670245901;
SET character_set_connection=gbk, character_set_results=gbk, character_set_client=binary;
/usr/local/Kaiyuan/mysql/bin/mysqld, Version: 5.7.20-log (MySQL Community Server (GPL)). started with:
Tcp port: 3306  Unix socket: /tmp/mysql.sock
Time                 Id Command    Argument

mysql服务会不定时的自动重启,经过分析,我的运维的同学确定系统
OOM

什么是OOM,OOM时为什么会自动重启mysql服务,后来经过优化mysql配置文件的参数减少mysql进程对内存的占用,OOM情况再也没发生过了
下面我们一起来了解一下OOM的真面目吧!


提示:OOM 英文全拼是 Out-Of-Memory

一、OOM是什么?

OOM:out of memory,字面意思当然是系统内存溢出。
Linux 内核有个机制叫OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了防止内存耗尽而内核会把该进程杀掉。
oom_killer是Linux自我保护的方式,内核检测到系统内存不足、挑选并杀掉某个进程的过程可以参考内核源代码linux/mm/oom_kill.c,当系统内存不足的时候,out_of_memory()被触发,然后调用select_bad_process()选择一个”bad”进程杀掉。如何判断和选择一个”bad进程呢?linux选择”bad”进程是通过调用oom_badness(),挑选的算法和想法都很简单很朴实:最bad的那个进程就是那个最占用内存的进程
很不幸的我们的mysql服务占用的内存最大,内核就把他干掉了。出现了短暂的连不上数据库的情况
在这里插入图片描述

二、Centos如何查看OOM日志

1.方法一

命令行如下:

grep "Out of memory" /var/log/messages

执行结果:
在这里插入图片描述

系统已经悄悄的杀掉很多次mysql服务,确实需要优化了

2.方法二

命令行如下:

dmesg -T | grep -i 'memory'

执行结果如下:

Nov 27 17:00:15 ecs-2c95-0002 kernel: Out of memory: Kill process 64254 (mysqld) score 695 or sacrifice child
Nov 28 14:09:27 ecs-2c95-0002 kernel: Out of memory: Kill process 3215 (mysqld) score 659 or sacrifice child
Nov 29 10:33:08 ecs-2c95-0002 kernel: Out of memory: Kill process 15119 (mysqld) score 669 or sacrifice child
Nov 29 21:48:36 ecs-2c95-0002 kernel: Out of memory: Kill process 19707 (mysqld) score 675 or sacrifice child
Nov 30 18:28:44 ecs-2c95-0002 kernel: Out of memory: Kill process 63421 (mysqld) score 662 or sacrifice child
Dec  1 12:58:29 ecs-2c95-0002 kernel: Out of memory: Kill process 19816 (mysqld) score 669 or sacrifice child
Dec  2 14:42:12 ecs-2c95-0002 kernel: Out of memory: Kill process 2989 (mysqld) score 680 or sacrifice child
Dec  3 03:32:40 ecs-2c95-0002 kernel: Out of memory: Kill process 45074 (mysqld) score 669 or sacrifice child
Dec  3 03:32:40 ecs-2c95-0002 kernel: Out of memory: Kill process 35468 (mysqld) score 669 or sacrifice child
Dec  4 14:53:02 ecs-2c95-0002 kernel: Out of memory: Kill process 35663 (mysqld) score 681 or sacrifice child
Dec  5 10:44:49 ecs-2c95-0002 kernel: Out of memory: Kill process 48800 (mysqld) score 660 or sacrifice child
Dec  5 21:12:42 ecs-2c95-0002 kernel: Out of memory: Kill process 65492 (mysqld) score 670 or sacrifice child
Dec  6 18:23:23 ecs-2c95-0002 kernel: Out of memory: Kill process 43404 (mysqld) score 677 or sacrifice child
Dec  7 11:05:08 ecs-2c95-0002 kernel: Out of memory: Kill process 18159 (mysqld) score 662 or sacrifice child
Dec  8 08:38:02 ecs-2c95-0002 kernel: Out of memory: Kill process 44705 (mysqld) score 741 or sacrifice child
Dec  9 07:58:38 ecs-2c95-0002 kernel: Out of memory: Kill process 24619 (mysqld) score 736 or sacrifice child

三、OOM时,依据什么杀掉进程?

参数:panic_on_oom: 用来控制当内存不足时是否启用OOM
值为0:内存不足时,启动 OOM killer。
值为1:内存不足时,有可能会触发 kernel panic(系统重启),也有可能启动 OOM killer。
值为2:内存不足时,表示强制触发 kernel panic,内核崩溃GG(系统重启)。

参数:oom_kill_allocating_task: 用来决定杀掉哪种进程
值为0:会 kill 掉得分最高的进程。
值为非0:会kill 掉当前申请内存而触发OOM的进程。
当然,一些系统进程(如init)或者被用户设置了oom_score_adj的进程等可不是说杀就杀的。

参数:oom_dump_tasks:用来记录日志
oom_dump_tasks参数可以记录进程标识信息、该进程使用的虚拟内存总量、物理内存、进程的页表信息等。

值为0:关闭打印上述日志。在大型系统中,可能存在上千进程,逐一打印使用内存信息可能会造成性能问题。
值为非0:有三种情况会打印进程内存使用情况。
1、由 OOM 导致 kernel panic 时;
2、没有找到符合条件的进程 kill 时;
3、找到符合条件的进程并 kill 时。

参数:oom_adj、oom_score_adj 和 oom_score:用来控制进程打分(分数越高,就先杀谁)
这三个参数的关联性比较紧密,都和具体的进程相关,位置都是在 /proc/进程PID/ 目录下。

内核会对进程打分(oom_score),主要包括两部分,系统打分和用户打分。系统打分就是根据进程的物理内存消耗量;用户打分就是 oom_score_adj 的值。如果用户指定 oom_score_adj 的值为 -1000,也就是表示禁止 OOM killer 杀死该进程。

用户可以通过调整 oom_score_adj 的值来决定最终 oom_score 的值,oom_score_adj 的取值范围是 -1000~1000,为0时表示用户不调整 oom_score。另外,root进程拥有3%的内存使用特权,因此做最终 oom_score 计算时需要减去这些内存使用量。

oom_adj是一个旧的接口参数,其功能类似oom_score_adj,为了兼容,目前仍然保留这个参数,当操作这个参数的时候,kernel实际上是会换算成oom_score_adj

四、本次的优化方法

本次问题产生的原因是mysql占用内存太大,产生了OOM,优化mysql配置文件 my.cnf的innodb_buffer_pool_size参数可以很好的解决

innodb_buffer_pool_size = 4G

总结

OOM是linux系统很重要的一项机制,是用来保护linux系统本身的,一旦出来OOM情况,我们应该从业务代码和服务的配置参数上着手优化,如果服务器配置太低,也以考虑增加物理内存来解决问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/85602.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Vue 快速入门系列】todoList案例小总结

文章目录一、案例效果二、项目介绍三、版本更新迭代末、项目素材1.css样式2.html一、案例效果 如下图所示,制作一个这样的记事本,可以使用这个记事本进行数据的存储以及管理,样式是天禹老师写好的我们直接使用就好了,主要在这个小…

[UE][UE5]零基础学习-学习记录1-UE5安装与基本使用方法

[UE5]学习1-UE5安装与基本使用方法写在前面01.作者碎碎念2.UE5安装方法01.UE5需要的电脑配置02.UE5安装方法001.Epic下载002.下载安装UE503.基本使用方法001.创建项目打开现有的项目:002.文件目录结构003.用户界面介绍1).3D画面视窗2).菜单栏3).内容浏览器4).属性面…

关于CM3/CM4位带操作的总结

1.位带操作定义 STM32的存储器映射中的内存区域和外设区域有一段地址空间(都是最低1MB)是位带区域,跟这个区域相对应的有一段位带别名区域,位带别名区的大小是位带区的32倍,位带别名区的每一个地址都对应位带区域的一个…

C. Hamiltonian Wall edu139 div2

Problem - C - Codeforces 题意是给你一个2*n的网格,让你一笔把所有的B涂满,并且只能涂一次,问你是否可行 分析: 其实分析的时候我想到了转移。每一次的结果是由上一次转移而来,所以如果前后矛盾的话,即…

人工智能:智能语音技术应用场景介绍

❤️作者主页:IT技术分享社区 ❤️作者简介:大家好,我是IT技术分享社区的博主,从事C#、Java开发九年,对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉: 数据库领域优质创作者🏆&#x…

虹科QA | SWCF2022 12月6日演讲笔记:C波段卫星与5G之间的干扰排查及解决方案

虹科2022年度SWCF卫星通信与仿真测试研讨会正在进行中。昨日精彩演讲:C波段卫星与5G之间的干扰排查及解决方案,感谢大家的观看与支持! 昨晚的直播间收到一些粉丝的技术问题,虹小科汇总了热点问题并请讲师详细解答,在此…

目前UI设计薪资待遇怎么样?工作好找吗?

UI设计的火爆,导致有很多年轻人都愿意投身于这个行业。有很多年轻的朋友都在问,UI设计的薪资待遇怎么样?工作难找吗?本文统一解答一下。 1、UI设计的薪资水平 UI设计的薪资待遇一直很好,学习UI设计之前没有任何相关基础…

PMP每日一练 | 考试不迷路-12.13(包含敏捷+多选)

被延期考试的宝子 一定要坚持刷题 每日5道PMP习题助大家上岸PMP! ​题目1-2: ​1.一位主要相关方要求将每日站立会议的持续时间人15分钟增加到1小时。Scrum主管应该做什么? ( ) A.接受建议并建议团队更改会议时间表 B.安排与产品负责人和团队开…

窗口销毁消息 WM_DESTROY 的正确处理方式

上次,我提到了可能导致正常的消息循环被破坏的怪异之处。 有一位读者 Adrian 指出,WM_GETMINMAXINFO 消息在顶级窗口 WM_NCCREATE 之前到达。这确实很不幸,但(无论是否错误)十多年来一直如此,现在修改它会…

【实时数仓】实现用户行为日志相关功能(源码)

文章目录一 准备用户行为日志-DWD层1 代码实现(1)识别新老访客(2)利用侧输出流实现数据拆分(3)将不同流的数据推送到下游kafka的不同Topic(分流)a 封装方法b 程序中调用kafka工具类获…

数据链路层

文章目录数据链路层的功能ARP协议DNS-------域名解析(浅浅的了解一下)在浏览器中输入URL后,发生的事情(经典面试题)ICMP协议NAT技术代理服务器网络核心知识大总结数据链路层的功能 对比理解网络层。 网络层 &#xff…

飞控学习随记

常见指令 编译Arduplane程序 cd ardupilot/ ./waf plane 进入 Tools/autotest 文件夹中,启动3D flightgear ./fg_quad_view.sh 进入ArduPLane文件夹中,启动仿真 sim_vehicle.py --map --console -L KSFO(-L 选择起飞位置) 解锁…

字节女测试工程师万字总结的软件测试入门技巧

成为一个优秀的测试工程师需要具备哪些知识和经验? 针对这个问题,可以直接拆分以下三个小问题来详细说明: 1、优秀软件测试工程师的标准是什么? 2、一个合格的测试工程师需要具备哪些专业知识? 3、一个合格的测试工程…

前端vue项目部署到生产环境(包括nginx安装及配置)

一.vue3项目打包 vue3项目 使用vue-cli创建的,使用npm run build打包到dist 二.在服务器上安装nginx 1.去nginx的官网下载windows版本的nginx,下载地址:nginx: download 最好安装稳定版,下载完成后解压nginx压缩包&#xff1a…

Android Studio实现数独小游戏,休闲益智

文章目录一、项目概述二、开发环境三、详细设计3.1 界面设计3.2 逻辑设计四、运行演示一、项目概述 数独是一种逻辑解谜游戏,它规则稍复杂,解题过程富有挑战性。本次安卓数独小游戏,主页面有继续游戏、新游戏、关于和退出四个功能&#xff0…

【实训项目】教师工作量管理系统(超级详细)

目录 一、需求与分析 1. 项目概述 1.1 教师信息处理 1.2 教师工作量数据处理: 1.3 教师综合信息输出 2. 需求分析 3. 模块设计 3.1 功能模块 3.2 所有功能模块的流程图 二、设计与实现 1. 程序设计 1.1 教师工作量管理系统 1.2 登录系统 1.3 主函数…

初级算法之字符串

344. 反转字符串 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 思路一: 从中间开始向两边遍历,然后两边交换位置,最终获得字符串的反转 // class Solution {public void reverseString(char[] s) {int len s.length,siz…

二、JavaScript——Hello World

1. 创建文件 提前在本地新建好文件夹用于存储项目代码&#xff0c;再通过VSode打开指定存储代码的指定文件夹&#xff0c;并新建HelloWorld.html文件 HelloWorld.html文件新建成功之后&#xff0c;输入“&#xff01;”点击自动生成标签 自动生成的标签如下&#xff1a; <!…

02Golang执行流程简介

Golang执行流程简介Golang执行流程的分析两种流程的方式区别什么是编译什么是运行Go程序开发注意事项Golang执行流程的分析 如果是对源码编译后&#xff0c;再执行&#xff0c;go的执行流程如下 如果对源码直接执行go run源码&#xff0c;go的执行流程如下 两种流程的方式区…

副业想做自媒体可以选择什么领域,适合宝妈的三个自媒体领域推荐

大家好&#xff0c;我是蝶衣王的小编&#xff0c;今天说说自媒体可以选择的领域 在过去的两年里&#xff0c;最受欢迎的职业之一必须属于自媒体。无论是全职还是副业&#xff0c;每个人都可以这样做。许多人经常在互联网上看到&#xff0c;通过自媒体&#xff0c;月收入数千或…