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