温馨提示×

MariaDB在Ubuntu上的资源限制如何设置

小樊
31
2025-12-04 19:31:48
栏目: 云计算

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。

0