У нас есть два сервера ubuntu 8.04. С сервером базы данных я установил table_cache на 1000, однако, когда я перезапускаю mysql, статус показывает только 257, а предел открытых файлов говорит 1024
Я настроил ulimit, выполнив ulimit -n 8192, а затем перезапустив mysql; похоже, это сработало, однако через несколько часов я сделал ulimit -n и увидел, что он вернулся к 1024
Немного беспокоиться.
Я отредактировал /etc/security/limits.conf и добавил
mysql soft nofile 8192
mysql hard nofile 8192
затем перезагрузился, без изменений. Затем я отредактировал и изменил mysql на * перезагрузку, без изменений, я затем отредактировал и изменил его на одну строку
* - nofile 8192
и перезагрузился, без изменений.
cat /proc/sys/fs/file-max
дает мне 768730
sysctl fs.file-max
дает мне fs.file-max = 768730
Я немного не понимаю, как я могу установить и сохранить установленное значение ulimit, чтобы я мог правильно увеличить кеш таблицы в mysql.
[изменить: подробности объяснены для ясности]
Я подозреваю, что вы проверили ulimit для другого пользователя, отличного от mysql;)
После изменения перезагружаться не нужно limits.conf
. Вы должны включить использование этого файла в соответствующей службе PAM в /etc/pam.d/
.
Делать grep pam_limits /etc/pam.d/*
иметь ключ к разгадке в какой ситуации limits.conf
будет использоваться.
Например, изменить limits.conf
for может быть виден в оболочке, вызываемой как sudo -u user bash
но не работает как sudo su - user
- это потому, что в Ubuntu настройки по умолчанию выглядят так:
$ grep limits /etc/pam.d/*|grep su
/etc/pam.d/su:# session required pam_limits.so
/etc/pam.d/sudo:session required pam_limits.so
Итак, если вы проверили лимиты с помощью sudo su - mysql
потом был бардак - su
не включил ограничения. Вы можете проверить, какая служба pam запущена, посмотрев /var/log/auth.log
.
Для всех возможных типов вызова вашего mysql должно быть безопасно изменять pam.d/other
или просто pam.d/common-session
.
Если вы не уверены в текущих ограничениях MySQL, проверьте текущий идентификатор процесса для mysqld с помощью метода по вашему выбору (top, ps aux, pgrep, что угодно). Затем просто введите
sudo cat /proc/mysql_process_id_you_found/limits
Если он не сообщает вам 8192 для открытых файлов, вы всегда можете взломать сценарий инициализации, как кто-то предложил.
Более простой способ (и своего рода взлом) - просто добавить ulimit -n 8192
команда внутри сценария инициализации для mysql /etc/init.d/mysql
. Элемент управления действителен для оболочки и дочерних процессов / оболочек, которые она открывает.
РЕДАКТИРОВАТЬ: su
и sudo
«странность» связана с тем, что файл limits.conf связан с ограничениями PAM, которые, если я не ошибаюсь, применяется только к оболочкам входа в систему. Также есть некоторая информация о start-stop-daemon
невозможность использовать лимиты памяти.
Вы добавили требуемый сеанс pam_limits.so в /etc/pam.d/common-session?