MariaDB 在 Ubuntu 上的资源限制设置指南
一 系统级限制 systemd 与 limits.conf
- 使用 systemd 管理的 MariaDB,需要在服务单元上显式放宽限制(仅修改 limits.conf 通常对 systemd 服务不生效)。创建目录与覆盖文件:
- sudo mkdir -p /etc/systemd/system/mariadb.service.d
- sudo tee /etc/systemd/system/mariadb.service.d/limits.conf <<‘EOF’
[Service]
LimitNOFILE=10000
LimitNPROC=4096
EOF
- 重新加载并重启:
- sudo systemctl daemon-reload
- sudo systemctl restart mariadb
- 如仍受限于 1024,说明未命中服务单元的限制,请确认使用的是 systemd 服务(而非直接 mysqld_safe 启动),并确保上述 drop-in 已生效。
- 可选:为运行 MariaDB 的系统用户(如 mysql)在 /etc/security/limits.conf 中设置用户级上限(对登录会话及通过 PAM 启动的进程有效):
- 在 /etc/security/limits.conf 追加:
- mysql soft nofile 65535
- mysql hard nofile 65535
- mysql soft nproc 4096
- mysql hard nproc 4096
- 确保 PAM 加载 limits:在 /etc/pam.d/common-session 与 /etc/pam.d/common-session-noninteractive 中均有 session required pam_limits.so
- 验证:
- 查看服务限制:systemctl show mariadb | egrep ‘LimitNOFILE|LimitNPROC’
- 查看进程实际值:prctl -n process.max-file-descriptor $(pidof mysqld)
- 查看系统级上限:cat /proc/sys/fs/file-max
- 登录到 mysql 用户会话后:ulimit -n / ulimit -u
二 MariaDB 自身的关键参数
- 编辑配置文件(路径可能为:/etc/mysql/my.cnf 或 /etc/mysql/mariadb.conf.d/50-server.cnf),在 [mysqld] 段落调整:
- 最大连接数:max_connections(示例:200–500;过小会报 “Too many connections”,过大则占用更多内存)
- 打开文件数:open_files_limit(应 ≤ 系统/服务限制;通常设置为与 LimitNOFILE 接近)
- 超时回收:wait_timeout / interactive_timeout(避免大量空闲连接长期占用资源)
- 示例片段:
- [mysqld]
- max_connections = 500
- open_files_limit = 10000
- wait_timeout = 300
- interactive_timeout = 300
- 动态查看与持久化:
- 查看:SHOW GLOBAL VARIABLES LIKE ‘max_connections’; SHOW GLOBAL VARIABLES LIKE ‘open_files_limit’;
- 持久化:写入配置文件后重启;个别变量支持 SET GLOBAL 动态生效(重启后失效,除非写入配置)
三 内存与连接数的调优要点
- 内存占用由多类缓冲与会话级缓冲区共同决定;盲目提高 max_connections 会线性增加内存压力。
- 小内存场景(如 128MB 虚拟机)可用更保守的缓冲配置示例(MariaDB 10.5):
- [mysqld]
- performance_schema = off
- key_buffer_size = 16M
- query_cache_size = 2M
- query_cache_limit = 1M
- tmp_table_size = 1M
- innodb_buffer_pool_size = 1M
- innodb_log_buffer_size = 1M
- max_connections = 25
- sort_buffer_size = 512K
- read_buffer_size = 256K
- read_rnd_buffer_size = 512K
- join_buffer_size = 128K
- thread_stack = 196K
- binlog_cache_size = 0M
- 重启后内存占用可降至约 22MB(视版本与负载而定,仅作低内存参考)
四 验证与常见问题
- 常见报错与修复:
- 启动日志出现 “Could not increase number of max_open_files to more than 1024 (request: 5035/8131)” 时,说明服务级文件描述符上限不足。按上文创建 systemd drop-in,将 LimitNOFILE 设置为大于请求值(如 10000),执行 daemon-reload 并重启 MariaDB。
- 变更后快速自检清单:
- 服务限制:systemctl show mariadb | egrep ‘LimitNOFILE|LimitNPROC’
- 进程实际值:prctl -n process.max-file-descriptor $(pidof mysqld)
- MariaDB 参数:SHOW GLOBAL VARIABLES LIKE ‘open_files_limit’; SHOW GLOBAL VARIABLES LIKE ‘max_connections’;
- 系统级上限:cat /proc/sys/fs/file-max
- 登录会话值:ulimit -n / ulimit -u
- 提示:
- 若使用非 systemd 启动方式(如 mysqld_safe),需改用相应的启动脚本或改用 systemd 管理。
- 调大 max_connections 前,先评估内存与后端连接池配置,避免连接风暴与 OOM。