当前位置: 首页 > news >正文

Kylin V10 /UOS V20下 MySQL open_files_limit 容器内存占用异常的问题处理手册

适用场景: Kylin V10 系统 + Docker 容器部署 MySQL
问题类别: 容器文件描述符限制异常


一、问题描述

在 Kylin V10 系统上通过 Docker 容器部署 MySQL 时,发现以下异常现象:

  • 直接在 MySQL 中修改 open_files_limit 参数的值不生效
  • MySQL 容器重启后,open_files_limit 参数会被重置为异常值

说明: open_files_limit 的取值与 ulimit 设定的 open files 参数直接相关,表现为 Kylin V10 存在 MySQL 方面的兼容性问题。

1.1 各环境实测对比

环境 主机 open files 值 容器 open files 值 状态
Kylin V10 100001 1073741816 ⚠ 异常(过大)
CentOS 等其他系统 65535 1048576 ✅ 正常

二、原因分析

2.1 Linux 文件描述符限制机制

Linux 系统通过以下方式限制打开文件的数量(nofile):

  • 配置文件: /etc/security/limits.conf
  • 查看命令: ulimit -a 中的 open files

2.2 Docker 与宿主机的隔离关系

⚠️ 重要: Docker 对打开文件数量(nofile)的限制与 Linux 系统的限制完全隔离

Docker 守护进程通过 docker.service 文件中的 LimitNOFILE 参数独立管理容器的文件描述符上限,与宿主机 /etc/security/limits.conf 的配置互不影响。

2.3 Kylin V10 特殊性分析

问题根因在于 docker.service 文件中使用了 LimitNOFILE=infinity 默认配置:

操作系统 LimitNOFILE=infinity 换算值 备注
Kylin V10 1073741816(约 2³⁰) 系统特性导致换算异常
CentOS / Ubuntu 等 1048576(约 2²⁰) 标准换算结果

由于 Kylin V10 对 infinity 的换算方式与其他操作系统不同,导致容器内 open_files_limit 取值远超预期,进而引发 MySQL 参数异常。


三、解决方案

docker.service 中的 LimitNOFILEinfinity 改为明确数值 1048576,与其他主流操作系统行为保持一致。

步骤 1:定位 docker.service 文件

# 查找 docker.service 文件位置
systemctl show docker | grep FragmentPath# 常见路径(任选其一)
# /usr/lib/systemd/system/docker.service
# /lib/systemd/system/docker.service
# /etc/systemd/system/docker.service

步骤 2:编辑 docker.service 文件

# 使用编辑器打开文件(以 vim 为例)
vim /usr/lib/systemd/system/docker.service# 找到 [Service] 节,修改以下参数:
# 将:LimitNOFILE=infinity
# 改为:LimitNOFILE=1048576

步骤 3:重载并重启 Docker

# 重载 systemd 配置并重启 Docker 服务
systemctl daemon-reload && systemctl restart docker

步骤 4:验证修改结果

# 验证宿主机 open files 值
ulimit -a | grep 'open files'# 进入 MySQL 容器验证(将 <container_id> 替换为实际容器 ID)
docker exec -it <container_id> bash
ulimit -a | grep 'open files'# 在 MySQL 中验证参数
mysql -u root -p
SHOW VARIABLES LIKE 'open_files_limit';

四、验证标准

验证项 预期结果 验证方式
容器 open files 值 1048576 容器内 ulimit -a
MySQL open_files_limit 与 open files 值一致 MySQL SHOW VARIABLES
容器重启后参数保持 重启后不被重置 重启容器后再次验证
Docker 服务状态 正常运行 systemctl status docker

五、注意事项

⚠️ 修改 docker.service 文件后必须执行 daemon-reload,否则修改不会生效;重启 Docker 将导致所有容器短暂停止服务,请在维护窗口内操作。

  • 本方案适用于使用 systemd 管理 Docker 的 Kylin V10 环境
  • 修改后若业务对文件描述符有更高需求,可适当调大 LimitNOFILE 的值
  • 操作前建议备份原始文件:
    cp /usr/lib/systemd/system/docker.service ~/docker.service.bak
    
  • 若环境中存在多个 docker.service 文件(如 /etc/systemd/system/ 覆盖),需同步修改所有生效文件

六、相关背景知识

6.1 open_files_limit 参数说明

MySQL 的 open_files_limit 参数用于控制操作系统允许 MySQL 进程打开的文件数量上限。该值受操作系统(或容器)的 ulimit open files 限制,无法在 MySQL 层面单独超越该上限进行设置。

6.2 Linux nofile 与 Docker nofile 的关系

配置层 配置项 配置位置 影响范围
操作系统 nofile(open files) /etc/security/limits.conf 宿主机进程
Docker 守护进程 LimitNOFILE docker.service 所有 Docker 容器
单个容器(可选) --ulimit nofile docker run 参数 指定容器

附录:快速操作脚本

以下脚本可一键完成 docker.service 修改与服务重启,请在确认备份后执行:

#!/bin/bash
# MySQL open_files_limit 修复脚本
# 适用于 Kylin V10 + Docker 环境SERVICE_FILE=$(systemctl show docker | grep FragmentPath | cut -d= -f2)
echo "Docker service 文件路径: $SERVICE_FILE"# 备份原始文件
cp "$SERVICE_FILE" "${SERVICE_FILE}.bak"
echo "已备份至: ${SERVICE_FILE}.bak"# 修改 LimitNOFILE
sed -i 's/LimitNOFILE=infinity/LimitNOFILE=1048576/' "$SERVICE_FILE"# 重载并重启
systemctl daemon-reload && systemctl restart docker
echo "Docker 已重启,open files 上限已修正为 1048576"

如仍存在问题,请检查是否有其他 docker.service 覆盖文件(/etc/systemd/system/docker.service),并同步修改。

http://www.jsqmd.com/news/662714/

相关文章:

  • watchfiles实战:如何构建企业级代码热重载系统
  • 2026年3月,解析市面上头部欧宝A14net汽车增压器厂家,卡特增压器/纽荷兰增压器,汽车增压器组件推荐 - 品牌推荐师
  • 2026年美国投资移民项目推荐公司选择指南 - 品牌排行榜
  • 类和对象
  • 从Ptolemaic到Copernican模型:Statistical Rethinking 2023中的模型进化
  • Rust的#[derive(Hash, PartialEq, Eq)]派生宏一致性要求与自定义实现
  • 企业级API网关的功能扩展与流量控制策略实现
  • 如何用Python脚本实现大麦网智能抢票:3分钟快速配置完整指南
  • Statistical Rethinking 2023中的测量误差与缺失数据处理:初学者必备的完整指南
  • Heygem数字人视频生成惊艳效果:口型同步逼真度实测分享
  • SITS2026代码生成失败率从47%→2.3%:我们重构了Prompt架构、工具链与验收SOP(附GitHub私有仓库迁移清单)
  • ABAP Excel生成终极指南:3步实现SAP报表自动化
  • AI印象派艺术工坊应对大文件?内存优化部署实战解决方案
  • 2026.4.18 闲话:观《观《不会说明你有抑郁症5》有感》
  • Rust的匹配中的能力编译器
  • 代码随想录算法训练营第二十九天|134、加油站 135、分发糖果 860、柠檬水找零 406、根据身高重建队列
  • 完全免费的神器,支持批量操作
  • C++学习笔记——数据结构
  • Etar-Calendar ICS导入导出完全指南:安全分享日历数据的正确方法
  • Topit终极指南:5分钟掌握macOS窗口置顶,多任务效率提升300%
  • FanControl完整教程:3步实现Windows风扇智能精准控制
  • EmojiOne Color:终极免费彩色表情字体解决方案
  • Phi-4-reasoning-vision-15B快速上手:PPT截图→自动生成演讲备注与要点提炼
  • 如何用trackerslist终极优化BT下载:92个追踪器全解析与实战指南
  • Maven源码打包利器:maven-source-plugin核心配置与实战解析
  • 终极指南:如何用透明压缩工具为你的电脑瘦身
  • 如何为Solo1编写扩展应用:完整开发教程与实例
  • 酒馆点单小程序开发全方位指南!小程序平台0代码一键生成 - 企业数字化改造和转型
  • GeoPandas环境搭建避坑指南:从依赖冲突到一键部署
  • Phi-3-mini-4k-instruct-gguf实操手册:日志轮转配置+错误关键词自动告警脚本