ulimit 和 mysql 的故事

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
简介:

背景

前些天,mysql 自带的监控脚本无故卡死,报错信息如下: Resource temporarily unavailable
然后将mysql 用户下的 ulimit 设置为8192 , 则正常。
虽然暂时解决了问题,但是背后的原理还没弄清楚,这里打算详细了解一下。

ulimit -u & ulimit -n 区别?

这里先弄清楚一个概念:

open files                      (-n) 40000 : 最大文件打开数

max user processes              (-u) 8092 :  最大用户进程数

如何有效的设置ulimit -u ?

这里有一篇淘宝褚霸的blog, 请参考:http://blog.yufeng.info/archives/2568

简单总结:

ulimit -u

1)先读取/etc/security/limits.conf,如果有/etc/security/limits.d/90-nproc.conf存在,会覆盖掉/etc/security/limits.conf 的设置(RHEL6)。 如果没有,则使用limits.conf(RHEL5)。

2)如果注释掉/etc/security/limits.d/90-nproc.conf 里面的内容,那么ulimit -u 的值由内核决定:

$ cat /proc/meminfo |grep MemTotal
MemTotal:       65858988 kB
$ echo "65858988 / 128"| bc
514523
$ ulimit -u
514523

如何有效的设置ulimit -n

1) 直接修改/etc/security/limits.conf , 只能修改非root用户
2) 对于root用户,可以在/etc/profile 中设置ulimit -HSn 65535

mysqld_safe 的相关知识

在root用户下,虽然这样启动mysq: mysqld_safe --user=mysql & , mysqld 虽然是用mysql用户启动的,但是它使用的环境变量如(ulimit -u & ulimit -n )都是root下的。 --谨记

ulimit -u 和 mysql的纠缠

既然知道了ulimit -u 是设置的mysql的最大进程数,那我们就来测试一把。

先考虑一个问题: mysql是单进程多线程,那么为啥会超过max值呢?

不管,先测。。。

[root@db10-091 ~]# cat /etc/security/limits.d/90-nproc.conf
mysql       soft    nproc     40

[mysql@db10-091 ~]$ ulimit -u
40

[root@db10-091 ~]# lsof -u mysql | grep pipe | wc -l
2

循环40次后:
    mysql -ubackup -pbackup -e 'select 1,sleep(60)'

[root@db10-091 ~]# lsof -u mysql | grep pipe | wc -l
72

报错:
    -bash: fork: retry: Resource temporarily unavailable
    -bash: fork: retry: Resource temporarily unavailable
    -bash: fork: retry: Resource temporarily unavailable

所以,mysql的链接数会占用mysql的nproc,当超过max值后,会导致以上错误。

ulimit -n 和 mysql的纠缠


  • innodb_open_files & open_files_limit
解释来自官方文档:

1) innodb_open_files:
It specifies the maximum number of .ibd files that MySQL can keep open at one time

表示mysql能够同时打开的innoDB的表的数量。

2)open_files_limit
Changes the number of file descriptors available to mysqld.

mysql 能够打开的文件描述符数量。

PS: 一个表,不一定只打开一个文件描述符。计算方法请参照官方文档。

问题:如果超过了innodb_open_files的大小会怎么样?
答: mysql会将之前的表关闭,然后重启开启新的表。

问题:如果超过了open_files_limit的大小会怎么样?
答: 报错。 too many files 等

如何有效的设置open_files_limit

以下测试的前提条件是 : RHEL6.4, mysql 5.6.16 , 以root用户启动mysqld_safe . --至于区别,之前已经提到过。

至于以mysql用户启动mysqld_safe , 请自行测试。

  • mysql配置文件中设置了open_files_limit
cat /etc/my.cnf | grep limit
open-files-limit = 3000

[root@db10-091 ~]# ulimit -n
40000


场景一:
dbadmin:(none)> show global variables like '%max_connections%';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 1000  |
+-----------------+-------+
1 row in set (0.00 sec)

dbadmin:(none)> show global variables like '%open_files_limit%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| open_files_limit | 5000  |
+------------------+-------+
1 row in set (0.00 sec)

场景二:
dbadmin:(none)> show global variables like '%max_conn%';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| max_connections    | 100   |
+--------------------+-------+
1 rows in set (0.00 sec)


dbadmin:(none)> show global variables like '%open_files_limit%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| open_files_limit | 3000  |
+------------------+-------+
1 row in set (0.00 sec)


结果是:   open_files_limit = 5000.
计算方式: 当open_file_limit被配置的时候,比较open_files_limit和max_connections*5的值,哪个大用哪个
  • mysql配置文件没有设置open_files_limit
cat /etc/my.cnf | grep limit  --没有设置open_files_limit
# open-files-limit = 3000

[root@db10-091 ~]# ulimit -n  --为什么看root用户的ulimit,之前已经讲过原因。
40000

场景一:

dbadmin:(none)> show global variables like '%max_conn%';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| max_connections    | 100   |
+--------------------+-------+
1 rows in set (0.01 sec)

dbadmin:(none)> show global variables like '%open_files_limit%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| open_files_limit | 40000 |
+------------------+-------+
1 row in set (0.00 sec)


场景二:
dbadmin:(none)> show global variables like '%max_connection%';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 10000 |
+-----------------+-------+
1 row in set (0.00 sec)

dbadmin:(none)> show global variables like '%open_files_limit%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| open_files_limit | 50000 |
+------------------+-------+
1 row in set (0.00 sec)

结果是:   open_files_limit=50000
计算方式: 当open_files_limit没有被配置的时候,比较max_connections*5和ulimit -n的值,哪个大用哪个
相关实践学习
自建数据库迁移到云数据库
本场景将引导您将网站的自建数据库平滑迁移至云数据库RDS。通过使用RDS,您可以获得稳定、可靠和安全的企业级数据库服务,可以更加专注于发展核心业务,无需过多担心数据库的管理和维护。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
7月前
|
人工智能 Java 机器人
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
Spring AI Alibaba集成Ollama,基于Java构建本地大模型应用,支持流式对话、knife4j接口可视化,实现高隐私、免API密钥的离线AI服务。
5949 2
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
|
缓存 Ubuntu Linux
Docker Buildx 简介与安装指南
Docker Buildx 是一个强大的工具,提供了多架构构建、并行构建和高级缓存管理等功能。通过正确安装和配置 Buildx,可以显著提升 Docker 镜像的构建效率和灵活性。希望本文能帮助你更好地理解和使用 Docker Buildx,以提高开发和部署的效率。
6315 16
|
Python
Python3.X使用tkinter报错,完美解决~(Python GUI)No matching distribution found for tkinter
Python3.X使用tkinter报错,完美解决~(Python GUI)No matching distribution found for tkinter
3155 0
Python3.X使用tkinter报错,完美解决~(Python GUI)No matching distribution found for tkinter
|
11月前
|
Linux 编译器 Android开发
鸿蒙系统被抹黑的深层解析:技术、商业与地缘政治的复杂博弈-优雅草卓伊凡
鸿蒙系统被抹黑的深层解析:技术、商业与地缘政治的复杂博弈-优雅草卓伊凡
585 1
鸿蒙系统被抹黑的深层解析:技术、商业与地缘政治的复杂博弈-优雅草卓伊凡
|
Ubuntu Linux 网络安全
Docker&Docker Compose安装(离线+在线)
Docker&Docker Compose安装(离线+在线)
22619 1
|
存储 小程序 Python
农历节日倒计时:基于Python的公历与农历日期转换及节日查询小程序
### 农历节日倒计时:基于Python的公历与农历日期转换及节日查询小程序 该程序通过`lunardate`库实现公历与农历的日期转换,支持闰月和跨年处理,用户输入农历节日名称后,可准确计算距离该节日还有多少天。功能包括农历节日查询、倒计时计算等。欢迎使用! (239字符)
1091 86
|
监控 前端开发 安全
C#一分钟浅谈:文件上传与下载功能实现
【10月更文挑战第2天】在Web应用开发中,文件的上传与下载是常见需求。本文从基础入手,详细讲解如何在C#环境下实现文件上传与下载。首先介绍前端表单设计及后端接收保存方法,使用`<input type="file">`与`IFormFile`接口;接着探讨错误处理与优化策略,如安全性验证和路径管理;最后讲解文件下载的基本步骤,包括确定文件位置、设置响应头及发送文件流。此外,还提供了进阶技巧,如并发处理、大文件分块上传及进度监控,帮助开发者构建更健壮的应用系统。
951 16
Vue3文字提示(Tooltip)
这是一篇关于 Vue2 文字提示(Tooltip)组件的教程,支持多种自定义属性,如最大宽度、展示文本、提示文本、样式、背景色、箭头显示等,并提供了在线预览示例。组件通过监听插槽和 `requestAnimationFrame` 实现了延迟显示与隐藏效果。文章详细介绍了组件实现代码及在页面中的使用方法。
896 0
Vue3文字提示(Tooltip)
|
前端开发 API 开发者
乱花迷人眼 - 一文彻底看懂 package.json 中的各种 dependencies
package.json 中存在各种各样的依赖定义:dependencies、devDependencies、peerDependencies、optionalDependencies、bundleDependencies,很容易让初学的开发者晕头,到底有什么区别。

热门文章

最新文章