首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 文件句柄優化:突破 open_files_limit 限制的實戰配置

     編輯:MySQL 資料庫相關知識

問題現象

生產庫報 Too many open files、Can't open file (errno: 24),或長時間運行後連接數受限、性能抖動。

排查步驟

# 1. 確認 mysqld 進程 PID
ps -ef | grep mysqld

# 2. 統計進程打開的文件描述符數
lsof -p  | wc -l
# 輸出 38728(遠超默認 1024)

# 3. 系統級文件句柄使用情況
cat /proc/sys/fs/file-nr
# 40290  0  741811
# 已分配  已釋放  系統最大值

# 4. 當前用戶/進程軟限制
ulimit -a
# open files (-n) 1024  ← 瓶頸在這裡

三層限制鏈路

  1. 系統硬限制:/proc/sys/fs/file-max(內核參數 fs.file-max)。
  2. 用戶會話軟/硬限制:/etc/security/limits.conf、ulimit -n。
  3. MySQL 內部參數:open_files_limit(mysqld 啟動時自動向系統申請,受上層限制)。

解決方案:逐層放開

1. 系統級(永久生效)

# /etc/sysctl.conf
fs.file-max = 1000000
# 生效
sysctl -p

2. 用戶級(需重新登錄/重啟服務生效)

# /etc/security/limits.conf
mysql soft nofile 65535
mysql hard nofile 65535
root  soft nofile 65535
root  hard nofile 65535

# 確保 pam_limits.so 生效
# /etc/pam.d/login /etc/pam.d/sshd /etc/pam.d/su 含
session required pam_limits.so

3. systemd 服務級(MySQL 官方 RPM/二進制安裝常用)

# /usr/lib/systemd/system/mysqld.service 或 override
[Service]
LimitNOFILE=65535
LimitNPROC=65535
# 重載並重啟
systemctl daemon-reload
systemctl restart mysqld

4. MySQL 內部參數(配置文件)

# /etc/my.cnf [mysqld]
open_files_limit = 65535
table_open_cache = 4000  # 5.6+ 替代 table_cache,建議 ≈ open_files_limit / 2

注意:mysqld 啟動時會嘗試 setrlimit(RLIMIT_NOFILE, open_files_limit),若受 systemd/limits.conf 限制無法提升,錯誤日志會記錄 Could not increase number of max_open_files to more than ...。

驗證生效

# 重啟後
mysql> SHOW VARIABLES LIKE 'open_files_limit';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| open_files_limit | 65535 |
+------------------+-------+

mysql> SHOW GLOBAL STATUS LIKE 'Open_files';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Open_files    | 1234  |  -- 當前打開數,應遠低於限制
+---------------+-------+

關聯參數協同調優

參數建議值說明
table_open_cache4000-8000表緩存,減少 .frm/.ibd 重複打開,受 open_files_limit 制約
table_definition_cache2000-4000表定義緩存,大量表時防止打開 .frm 過多
max_connections500-2000每連接消耗 2-3 個文件描述符(表、日志、網絡 socket)
innodb_open_files3000-6000InnoDB 獨立表空間 .ibd 文件緩存(file_per_table=ON 時)

總結

文件句柄耗盡是高併發、大量表、長運行 MySQL 的常見隱性瓶頸。**系統→用戶→systemd→MySQL 四層同步放開**,配合 table_open_cache、innodb_open_files 協同調優,才能徹底解決「Too many open files」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved