[root@dbmain ~]# su - mysql
su: cannot set user id: Resource temporarily unavailable
max user processes (-u) 25600 # 看似足夠
open files (-n) 1024
mysql soft nproc 500
mysql hard nproc 500 # 關鍵:硬限制僅 500
mysql soft nofile 1024
mysql hard nofile 65536
ps -ef | grep mysql
# 僅顯示 3-4 個進程 (mysqld_safe, mysqld, client 連線)
進程數遠低於 500,為何仍報錯?
Linux 線程由 clone() 建立,在 /proc/ 下各佔一個目錄,**每個線程佔用一個 nproc 名額**。MySQL 預設 max_connections=151,加上內部背景線程 (IO、Purge、Binlog Dump 等),輕鬆超過 500。
# 查看 mysqld 主進程所有線程
ls /proc/$(pidof mysqld)/task/ | wc -l
# 結果可能 600+,遠超 nproc=500
mysql soft nproc 65535
mysql hard nproc 65535
mysql soft nofile 65535
mysql hard nofile 65535
或參考 Oracle/Grid 設置:nproc 16384、nofile 65536。
# /etc/systemd/system/mysqld.service.d/override.conf
[Service]
LimitNPROC=65535
LimitNOFILE=65535
執行 systemctl daemon-reload && systemctl restart mysqld。
max_connections 僅限制「用戶連線線程」,不包含內部系統線程。Slave_IO_Running、Slave_SQL_Running 各佔一線程。limits.conf nproc/nofile ≥ 65535 (mysql 用戶)。LimitNPROC/NOFILE。max_connections 根據記憶體試算:(總記憶體 - 全域Buffer) / 單線程記憶體。Threads_connected、Threads_running、ps -eLf | grep mysql | wc -l 實際線程數。MySQL 線程模型導致系統層面 nproc 消耗遠超可見進程數。**DBA 必須同時調整 OS 層面 limits.conf/systemd 與 MySQL 參數**,單調整一方必失效。此錯誤常發生於新部署、從庫啟動、高併發突增場景,建議納入部署清單標準化配置。