Использование постоянных соединений в MySQL, но все еще много открытых соединений - PullRequest
2 голосов
/ 29 марта 2020

У меня есть чат-бот, который работает на API обратного вызова, который отправляет запрос на мой сервер каждый раз, когда кто-то пишет сообщение

Недавно я прочитал о так называемых постоянных соединениях, что заставило меня думать, что Я могу избежать повторного подключения к базе данных каждый раз, когда я получаю запрос на моем сервере, потому что загрузка базы данных занимает некоторое время, и я хотел бы ускорить этот процесс

Итак, я изменил любое соединение в моем скрипте на иметь префикс p:, например

$conn = new mysqli("p:".$servername, $username, $password, $dbname);

Как я понял, таким образом mysqli находит существующее соединение с такими же параметрами или создает его, если оно не существует, вместо открытия нового соединения каждый раз

Но, тем не менее, пару часов спустя я проверил открытые соединения и заметил множество похожих соединений, отличающихся только ID, например

  ID      | USER | HOST      | DB       | COMMAND | TIME | STATE | INFO |
+---------+------+-----------+----------+---------+------+-------+------+
| 5248403 | user | localhost | database | Sleep   |   24 |       | NULL |
| 5248609 | user | localhost | database | Sleep   |  113 |       | NULL |
| 5247822 | user | localhost | database | Sleep   |    1 |       | NULL |
| 5248652 | user | localhost | database | Sleep   |   79 |       | NULL |

user и database, маскирующими реального пользователя и базу данных)


Есть ли что-то, что я неправильно понял в отношении постоянных соединений? Что я могу сделать, чтобы избежать подобных соединений?

Ответы [ 4 ]

3 голосов
/ 29 марта 2020

Постоянные соединения могут быть повторно использованы последующими запросами, но если ваш сайт обрабатывает несколько одновременных запросов, каждому из них требуется свое собственное соединение.

Другими словами, несколько одновременных PHP запросы не могут использовать одно и то же соединение с базой данных одновременно.

Для MySQL не является проблемой обработка нескольких соединений. Значение по умолчанию max_connections ограничено 151 в MySQL 8.0, но оно может быть выше, если ваш сервер достаточно силен. В моей работе мы используем высокопроизводительные серверы баз данных, поэтому мы повысили max_connections до 4096. Но мы предупреждаем разработчиков, что они, вероятно, не хотят, чтобы он превышал 1024. Как правило, мы видим, что число соединений остается на уровне нескольких сотен .

1 голос
/ 29 марта 2020

Проблема XY из учебника

загрузка базы данных занимает некоторое время, и я хотел бы ускорить этот процесс

У меня такое ощущение, что постоянное соединение будет иметь был последний вариант, чтобы решить вашу проблему, если таковые имеются.

Как я понял, таким образом mysqli находит существующее соединение с теми же параметрами или создает его, если оно не существует, вместо открытия нового соединения каждый раз

Это на самом деле далеко от этого. Постоянное соединение в PHP связано с несколькими потоками, в которых PHP выполняется. И каждый поток, который может открыть соединение, будет удерживать его открытым, обеспечивая это уже открытое соединение для сценариев, которые он собирается выполнить. Означает, что постоянное соединение является постоянным или, другими словами, постоянно открытым.

Следовательно, изображение, которое вы видите, ожидаемо.

Пока вы не столкнетесь с ошибкой "слишком много соединений", все в порядке, хотя я сомневаюсь, что вы - ощутимое преимущество в использовании постоянного соединения.

0 голосов
/ 29 марта 2020

Да, я полагаю, вы немного не поняли, что такое постоянные соединения.

Я понял, что таким образом mysqli находит существующее соединение с теми же параметрами или создает его, если оно не существует, вместо того, чтобы открывать новое соединение каждый раз

При использовании постоянных соединений PHP не будет запрашивать закрытие соединения, когда скрипт PHP завершит свое выполнение. Вместо этого соединение будет поддерживаться в рабочем состоянии, и если оно находится в состоянии ожидания, PHP может снова использовать это соединение.

Каждое выполнение одного и того же сценария требует отдельного соединения в любом случае. Если нет доступных подключений для повторного использования, PHP попытается открыть новое постоянное подключение.

Это всего лишь рецепт катастрофы. Если вы не очистите соединение вручную, вы увидите странное поведение. Если вам не нужно их использовать, лучше держаться от них подальше. Использование постоянных соединений может сделать это только для того, чтобы вы быстрее достигли предела max_connections.

Если вы используете MySQL на локальном хосте, что, похоже, имеет место, вы не увидите значительного прироста производительности. Существует очень мало причин для go для таких небольших оптимизаций. Открытие и закрытие соединения обычно очень быстрый процесс, особенно если он находится на локальном хосте.

0 голосов
/ 29 марта 2020

Я предполагаю, что это пул соединений. В вашем случае он создает пул из 4 соединений, которые можно использовать для параллельного обслуживания 4 запросов / запросов. Если у вас было только 1 соединение, и по нему выполнялся запрос, то любой другой запрос, которому нужна БД, должен был бы ждать.

Другое объяснение может состоять в том, что ваш веб-сервер выполняет 4 дочерних процесса для обслуживания нескольких запросов. параллельно, и, следовательно, каждый дочерний процесс создает / получает свое собственное соединение, которое он может повторно использовать для внутреннего использования

Это можно сказать о многих других веб-серверах / фреймворках и ничего не указывает c в php / mysqli

...