Ошибка слишком большого количества открытых файлов в Ubuntu 8.04
mysqldump: Couldn't execute 'show fields from `tablename`': Out of resources when opening file './databasename/tablename#P#p125.MYD' (Errcode: 24) (23)
при проверке ошибки 24 на оболочке написано
>>perror 24
OS error code 24: Too many open files
как мне это решить?
7 ответов
Сначала, чтобы определить определенные ограничения пользователей или групп, вы должны сделать следующее:
root@ubuntu:~# sudo -u mysql bash
mysql@ubuntu:~$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 71680
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 71680
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
mysql@ubuntu:~$
Важная строка:
открыть файлы (-n) 1024
Как видите, поставщик вашей операционной системы поставляет эту версию с базовой конфигурацией Linux - 1024 файла на процесс.
Этого явно недостаточно для загруженной установки MySQL.
Теперь, чтобы исправить это, вы должны изменить следующий файл:
/etc/security/limits.conf
mysql soft nofile 24000
mysql hard nofile 32000
Некоторые разновидности Linux также требуют дополнительной настройки, чтобы привязать процессы демона к сеансам входа в систему. Например, в Ubuntu 10.04 вам также нужно установить пределы сеанса pam, добавив следующую строку в /etc/pam.d/common-session
:
session required pam_limits.so
Довольно старый вопрос, но вот мои два цента.
Вы можете столкнуться с тем, что движок mysql не установил правильную переменную open-files-limit.
Вы можете видеть, сколько файлов вы разрешаете открывать mysql mysql> SHOW VARIABLES;
Вероятно, установлено значение 1024, даже если вы уже установили ограничения на более высокие значения.
Вы можете использовать опцию --open-files-limit=XXXXX в командной строке для mysqld.
ура
Нет необходимости настраивать PAM, как мне кажется. В моей системе (Debian 7.2 с Percona 5.5.31-rel30.3-520.squeeze) у меня есть:
Перед изменениями my.cnf:
\#cat /proc/12345/limits |grep "open files"
Max open files 1186 1186 files
После добавления "open_files_limit = 4096" в my.cnf и перезапуска mysqld я получил:
\#cat /proc/23456/limits |grep "open files"
Max open files 4096 4096 files
12345 и 23456 - это, конечно, PID процесса mysqld.
SHOW VARIABLES LIKE "open_files_limit" показывают 4096 сейчас.
Все выглядит нормально, пока "ulimit" не показывает изменений:
\# su - mysql -c bash
\# ulimit -n
1024
Также возможно, что какой-то код, который обращается к таблицам, не закрывает их должным образом, и через некоторое время может быть достигнуто количество открытых файлов.
Пожалуйста, обратитесь к http://dev.mysql.com/doc/refman/5.0/en/table-cache.html по возможной причине.
Перезапуск mysql должен привести к исчезновению этой проблемы (хотя это может произойти снова, если основная проблема не будет устранена).
Нет никакой гарантии, что "24" - это номер ошибки на уровне ОС, поэтому не думайте, что это означает, что открыто слишком много файловых дескрипторов. Это может быть некоторый тип внутреннего кода ошибки, используемого в самом mysql. Я бы посоветовал спросить об этом в списках рассылки mysql.