table_cache, max_connections, open_files_limit の関係

昔はマニュアルに書いてあったような気がしたけど、最近のマニュアルには見当たらないのでメモ。

mysqld が同時に使用可能なファイル数は open_files_limit というパラメータで指定します。ただし、mysqld は最低でも table_cache*2+max_connections+10 --- (a) は必要だと考えるので、open_files_limit が (a) よりも小さければ、黙って (a) の値まで大きくします。table_cache を2倍しているのは、MyISAM が1テーブルにつき2ファイル使用するためでしょう。10 を足しているのは標準入出力エラー出力と、ログファイル等の分でしょうか。

また、max_connections*5 --- (b) の方が (a) よりも大きければ、open_files_limit は (b) になります。

(a), (b) よりも現在のファイル記述子の制限値(getrlimit(2) の rlim_cur の値) --- (c) が大きければ、(c) が採用されます。

open_files_limit の最大値は 65535 です。また、setrlimit(2) で open_files_limit 分のファイル記述子が割り当てられない場合(おそらくrootで起動しなかった場合)は、(c) になります。そのため結果的に (a) よりも小さな値になってしまう場合があります。open_files_limit パラメータを指定しておらず (a) よりも小さい値になった場合は、max_connections と table_cache が次のように調整されます。

max_connections が open_files_limit-10-64*2 よりも大きい場合は、その値まで小さくなります。

table_cache が (open_files_limit-10-max_connections)/2 よりも大きい場合は、その値まで小さくなります。ただし 64 よりは小さくなりません。

この調整が行われると、エラーログに次のように出力されます。

Changed limits: max_open_files: XXX  max_connections: XXX  table_cache: XXX

open_files_limit パラメータを指定している場合は、エラーログに次のように出力されるだけです。

Could not increase number of max_open_files to more than XXX (request: XXX)

table_cache と max_connections の調整は行われません。この場合は稼働中にファイル記述子が足りなくなる可能性があるため、注意が必要です。

mysqld --max_connections=100 --table_cache=64
(c) が採用される。

max_connections 100
table_cache 64
open_files_limit 1024

mysqld --max_connections=1000 --table_cache=64
(b) が採用される。

max_connections 1000
table_cache 64
open_files_limit 5000

mysqld --max_connections=100 --table_cache=1000
(a) が採用される。

max_connections 100
table_cache 1000
open_files_limit 2110

mysqld --max_connections=15000 --table_cache=64
(b) 15000*5=75000 だが 65535 より大きいので 65535 になる

max_connections 1000
table_cache 64
open_files_limit 65535

mysqld --max_connections=100 --table_cache=40000
(a) 40000*2+100+10=80110 だが 65535 より大きいので 65535 になり、max_connections, table_cache の値も調整される。

[Warning] Changed limits: max_open_files: 65535  max_connections: 100  table_cache: 32712
max_connections 100
table_cache 32712
open_files_limit 65535

mysqld --max_connections=100 --table_cache=40000 --open_files_limit=10
上と同じだが open_files_limit が指定されているので、max_connections, table_cache の値は調整されない。

[Warning] Could not increase number of max_open_files to more than 65535 (request: 80110)
max_connections 100
table_cache 40000
open_files_limit 65535