首页 > 数据库 >记录一次mysql5.7oomkill

记录一次mysql5.7oomkill

时间:2023-10-09 13:58:00浏览次数:46  
标签:files cur 记录 max mysql5.7 oomkill rlimit file rlim

集群节点环境

[root@master ~]# uname -a
Linux master 5.14.0-229.el9.x86_64

启动mysq:5.7镜像会出现oomkill,属于系统镜像问题,解决方法有两个,使用centos7(centos8未测试),或者修改镜像启动命令

修改镜像启动命令参考了链接:
https://learnku.com/articles/34598
大致内容如下
MySQL 源码分析
MySQL 源码中直接调用 getrlimit 的地方不多,排除了 ndb、innodb_memcached、libevent 之后,只有一处直接调用:

static uint set_max_open_files(uint max_file_limit)
{
  struct rlimit rlimit;
  uint old_cur;
  DBUG_ENTER("set_max_open_files");
  DBUG_PRINT("enter",("files: %u", max_file_limit));

  if (!getrlimit(RLIMIT_NOFILE,&rlimit))
  {
    old_cur= (uint) rlimit.rlim_cur;
    DBUG_PRINT("info", ("rlim_cur: %u  rlim_max: %u",
                        (uint) rlimit.rlim_cur,
                        (uint) rlimit.rlim_max));
    if (rlimit.rlim_cur == (rlim_t) RLIM_INFINITY)
      rlimit.rlim_cur = max_file_limit;
    if (rlimit.rlim_cur >= max_file_limit)
      DBUG_RETURN(rlimit.rlim_cur);                /* purecov: inspected */
    rlimit.rlim_cur= rlimit.rlim_max= max_file_limit;
    if (setrlimit(RLIMIT_NOFILE, &rlimit))
      max_file_limit= old_cur;                        /* Use original value */
    else
    {
      rlimit.rlim_cur= 0;                        /* Safety if next call fails */
      (void) getrlimit(RLIMIT_NOFILE,&rlimit);
      DBUG_PRINT("info", ("rlim_cur: %u", (uint) rlimit.rlim_cur));
      if (rlimit.rlim_cur)                        /* If call didn't fail */
        max_file_limit= (uint) rlimit.rlim_cur;
    }
  }
  DBUG_PRINT("exit",("max_file_limit: %u", max_file_limit));
  DBUG_RETURN(max_file_limit);

其中逻辑是:如果系统的文件打开限制是 RLIM_INFINITY 或者比要设置的 max_file_limit 大,都返回系统的限制。

这个函数也只被直接调用一次:

uint my_set_max_open_files(uint files)
{
  struct st_my_file_info *tmp;
  DBUG_ENTER("my_set_max_open_files");
  DBUG_PRINT("enter",("files: %u  my_file_limit: %u", files, my_file_limit));

  files+= MY_FILE_MIN;
  files= set_max_open_files(MY_MIN(files, OS_FILE_LIMIT)); // 获取最大打开文件数
  if (files <= MY_NFILE)
    DBUG_RETURN(files);

  // 分配内存
  if (!(tmp= (struct st_my_file_info*) my_malloc(key_memory_my_file_info,
                                                 sizeof(*tmp) * files,
                                                 MYF(MY_WME))))
    DBUG_RETURN(MY_NFILE);

  // 初始化
  /* Copy any initialized files */
  memcpy((char*) tmp, (char*) my_file_info,
         sizeof(*tmp) * MY_MIN(my_file_limit, files));
  memset((tmp + my_file_limit), 0,
        MY_MAX((int) (files - my_file_limit), 0) * sizeof(*tmp));
  my_free_open_file_info();                        /* Free if already allocated */
  my_file_info= tmp;
  my_file_limit= files;
  DBUG_PRINT("exit",("files: %u", files));
  DBUG_RETURN(files);
}

原来 MySQL 会根据最大可打开文件数,提前为每个文件分配和初始化内存,在这个时候就可能分配过多内存,导致 OOM。

解决
启动前设置 ulimit
因为 K8s 目前不支持设置 ulimit,不少 Helm Chart 都在启动前设置 ulimit。

command: ["sh","-c", "ulimit -n 4096 && exec /usr/local/bin/docker-entrypoint.sh mysqld"]

针对mysql镜像重新制作新的镜像,dockerfile如下

FROM mysql:5.7.36

CMD ["/bin/sh", "-c", "ulimit -n 4096 && docker-entrypoint.sh mysqld"]

标签:files,cur,记录,max,mysql5.7,oomkill,rlimit,file,rlim
From: https://www.cnblogs.com/whtjyt/p/17751526.html

相关文章

  • 中国观鸟记录中心
    importrequests#调用js报错时,修改默认编码格式importsubprocessfromfunctoolsimportpartialsubprocess.Popen=partial(subprocess.Popen,encoding="utf-8")importexecjsrequest_data="{\"limit\":\"20\",\"page\"......
  • Sql Server 2008查询数据库中各表记录行数
    RT SELECTa.name,b.rows,LTRIM(STR(b.used*8/(casewhenb.used<1000then1else1024end),15,0)+(casewhenb.used<1000then'KB'else'MB'end))as[使用空间],LTRIM(STR(b.reserved*8/(casewhenb.reserved<1000th......
  • 做题记录
    题目名称知识点时间小贝的欢送会STL工具,贪心2023年10月7日小贝的守卫二分2023年10月7日阿尔法的谜题一元二次方程2023年10月8日小贝的旅途树,贪心2023年10月8日......
  • linux学习记录 10.9
    知识点:git-版本管理工具,一个树的结构来维护所有历史版本,可持久化,支持多人合作工作区:仓库的目录。工作区是独立于各个分支的。 =》暂存区:工作区写入版本库前的缓存区=》 版本库:将所有版本用一棵树的形式存下来每次head只会处于一个结点,要将当前暂存区存到版本库里的时候,就......
  • 【MySQL】 将字段相同的记录排在一起,按时间倒序
    一、实现效果:蓝牙mac字段是相同的记录,排在一起,再按时间倒序,总体时间来说也需要倒序 二、SQL编写:最开始的想法就是,那我直接按mac和时间排序不就好了SELECT*FROMaca_be_lpresultORDERBYmacDESC,update_dateDESC但是实际业务会有这样的的情况1、同一个mac的记录,......
  • linux学习记录 10.8
    acterminal分配了如下信息:(1)user用户名  (2)hostnameip地址(3)password密码homework4getinfo查看上述信息 知识点:1、ssh登录到某个自己的服务器sshuser@hostname=登录服务器 exit/logout/ctrl+d=退出退出后进入.ssh看到一个known_hosts就会记录刚......
  • iaas运维笔记记录
    iaas运维笔记记录镜像创建source/etc/keystone/admin-openrc.sh(挂载用户配置文件)glanceimage-create--name"cirros"--disk-formatqcow2--container-formatbare<cirros-0.5.2-x86_64-disk.qcow2--name:创建后的镜像名称--disk-format:镜像格式--contrainer-form......
  • 【玄铁杯第三届RISC-V应用创新大赛】LicheePi 4A+建材识别装置+CUG汪汪小分队+问题记
    【玄铁杯第三届RISC-V应用创新大赛】LicheePi4A+建材识别装置+CUG汪汪小分队+opencv问题记录一、开发板环境搭建1.1开发板外观图1开发板带铝合金外壳外部图图2开发板带铝合金外壳内部图在yolox模型部署好后,在虚拟环境中调用opencv的imshow等图形化操作会报下面错误:1.2......
  • 记录--解决扫码枪因输入法中文导致的问题
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助问题最近公司项目上遇到了扫码枪因搜狗/微软/百度/QQ等输入法在中文状态下,使用扫码枪扫码会丢失字符的问题思考这种情况是由于扫码枪的硬件设备,在输入的时候,是模拟用户键盘的按键来实现的字符输入的,所以会触发......
  • 学生管理系统使用集合保存,不是用数据库的(仅供参考,网上找的,记录用)
    packagecom.ima;importcom.itheima.Student;importjava.util.ArrayList;importjava.util.Scanner;/*学生管理系统*/publicclassStudentManager{publicstaticvoidmain(String[]args){//创建集合对象,用于存储学生数据ArrayList<Student>a......