Не может, кажется, ударить 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 2

1 ответ:

Итак, я нашел виновника этой проблемы.

При выполнении стресс-нагрузки это не было постепенным - все соединения были открыты сразу, наводнив сервер.

MySQL имеет значение по умолчанию back_log 50 - это число выдающихся соединений, которые MySQL может иметь до их обработки. Мы достигли этого предела, когда затопление сервера и дальнейшие соединения через порог 50 были отклонены.

Чтобы исправить это, мы отредактировали мой.cnf со следующей строкой:, увеличение отставания прослушивания до разумного 128, которое работает для нашей установки:

back_log = 128
Пожалуйста, имейте в виду, что максимальное значение, которое вы можете ввести здесь, зависит от вашей операционной системы и ограничений, установленных в вашей операционной системе. MySQL может иметь максимальное отставание прослушивания 65535, однако ваша ОС может иметь цифру меньше.

С новым back_log 128 наша проблема исправлена, и мы больше не получаем Connection refused сообщение об ошибке под нагрузкой.