Не может, кажется, ударить MySQL max connections, хотя новые соединения терпят неудачу под нагрузкой
Мы проводим бенчмаркинг одного из наших сайтов с помощью ab (apachebench) на странице, которая создает соединение MySQL, запрашивает и затем закрывает соединение (через PHP).
Мы жестко закодировали нашу my.cnf с пределом max_connections 500.
Когда мы запускаем стресс-тест, MySQL, кажется, никогда не достигает предела соединения, который мы указываем, хотя у нас есть ошибки типа "не удается подключиться к базе данных", возвращаемые из нашего сценария. Это как если бы MySQL не мог открыть больше соединений, чем вокруг -237 за один раз.
Вот наш текущий мой.cnf:
[mysqld]
max_connections = 500
port = 3306
socket = /var/mysql/mysql.sock
skip-external-locking
key_buffer_size = 384M
max_allowed_packet = 1M
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size = 128M
thread_concurrency = 8
max_heap_table_size = 512M
tmp_table_size = 512M
table_cache = 2048
Ограничения Пользователя:
$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 16384
pipe size (512 bytes, -p) 1
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 1250
virtual memory (kbytes, -v) unlimited
Проблема, по-видимому, либо с PHP, либо с MySQL (или, конечно, с нашей неправильной конфигурацией).
Любая помощь, предложения и советы очень ценятся - заранее спасибо.
1 ответ:
Итак, я нашел виновника этой проблемы.
При выполнении стресс-нагрузки это не было постепенным - все соединения были открыты сразу, наводнив сервер.
MySQL имеет значение по умолчанию
back_log
50 - это число выдающихся соединений, которые MySQL может иметь до их обработки. Мы достигли этого предела, когда затопление сервера и дальнейшие соединения через порог 50 были отклонены.Чтобы исправить это, мы отредактировали мой.cnf со следующей строкой:, увеличение отставания прослушивания до разумного 128, которое работает для нашей установки:
Пожалуйста, имейте в виду, что максимальное значение, которое вы можете ввести здесь, зависит от вашей операционной системы и ограничений, установленных в вашей операционной системе. MySQL может иметь максимальное отставание прослушивания 65535, однако ваша ОС может иметь цифру меньше.back_log = 128
С новым back_log 128 наша проблема исправлена, и мы больше не получаем
Connection refused
сообщение об ошибке под нагрузкой.