Intereting Posts
Behat снова запускает сценарий программным путем Twig расширяют шаблон при условии Laravel 4 – транзакция db при сохранении при автоматическом создании другой модели Получить весь URL, включая строку запроса и привязку Ошибка в кодировке mysql -> Как я могу переконвертировать его в другое? CakePHP – общее количество разбиения на страницы отличается от фактического количества при использовании DISTINCT PHP Code – импортировать XML-файл с веб-сервера (/ public_html / ctrackxml) в базу данных mysql Отношение доктрины Как конвертировать шестнадцатеричные коды в данные JSON с помощью PHP Разделить массив, но сумма каждого массива не должна превышать максимальное значение else. Нажмите на следующий индекс массива остановить прямой доступ (.htaccess) и разрешить запрос ajax в подпапку RegEx необходим для инфобокса Википедии WAMP Stack PHP «Неустранимая ошибка: класс« SoapClient »не найден» Могу ли я использовать шаблон тестирования swagger с приложением non nodejs? Как поместить mysql внутри php-функции?

Список участников MySql, заполненный записями «Сон», приводящих к «Слишком много подключений»?

я хотел бы спросить вашу помощь по давней проблеме с соединениями php / mysql.

Каждый раз, когда я выполняю команду «SHOW PROCESSLIST», он показывает мне около 400 простоя (Status: Sleep) на сервере базы данных, выходящем из наших 5 веб-серверов.

Это никогда не было проблемой (и я не нашел быстрого решения) до тех пор, пока в последнее время число трафика не увеличилось, и с тех пор MySql неоднократно сообщает о проблемах «для многих подключений», даже поэтому 350+ из этих подключений находятся в состоянии «сна» , Также сервер не может получить соединение mysql, даже если есть спящее соединение с тем же сервером.

Все эти соединения исчезают при обновлении сервера Apache.

Код PHP, используемый для создания соединений с базой данных, использует обычный модуль «mysql», модуль «mysqli», PEAR :: DB и Zend Framework Db Adapter. (Различные проекты). В NONE проектов используются постоянные соединения.

Повышение предела соединения возможно, но не похоже на хорошее решение, так как сейчас это 450, и в любой момент есть только 20-100 «реальных» подключений.

Мой вопрос:

Почему так много соединений в состоянии сна и как я могу это предотвратить.

Спасибо за ваше время, если что-то неясно или отсутствует, пожалуйста, дайте мне знать

— Обновить:

Количество запросов Apache, выполняемых одновременно, никогда не превышает 50 одновременных запросов, поэтому я думаю, что существует проблема с закрытием соединения или apache поддерживает открытие порта без привязки phpscript или чего-то (?)

my.cnf в случае, если это полезно:

innodb_buffer_pool_size = 1024M max_allowed_packet = 5M net_buffer_length = 8K read_buffer_size = 2M read_rnd_buffer_size = 8M query_cache_size = 512M myisam_sort_buffer_size = 128M max_connections = 450 thread_cache = 50 key_buffer_size = 1280M join_buffer_size = 16M table_cache = 2048 sort_buffer_size = 64M tmp_table_size = 512M max_heap_table_size = 512M thread_concurrency = 8 log-slow-queries = /daten/mysql-log/slow-log long_query_time = 1 log_queries_not_using_indexes innodb_additional_mem_pool_size = 64M innodb_log_file_size = 64M innodb_log_buffer_size = 8M innodb_flush_log_at_trx_commit = 2 innodb_file_per_table 

В принципе, вы получаете соединения в состоянии «Сон», когда:

  • скрипт PHP подключается к MySQL
  • выполняются некоторые запросы
  • то PHP-скрипт делает некоторые вещи, которые требуют времени
    • без отсоединения от БД
  • и, наконец, скрипт PHP заканчивается
    • что означает, что он отключается от сервера MySQL

Таким образом, вы, как правило, получаете множество процессов в состоянии «Сон», когда у вас много процессов PHP, которые остаются на связи, и фактически ничего не делают на стороне базы данных.

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

Другое дело, что я часто вижу, когда на сервере есть некоторая загрузка:

  • В Apache все больше запросов
    • что означает, что многие страницы генерируют
  • Каждый скрипт PHP, чтобы сгенерировать страницу, подключается к БД и выполняет некоторые запросы
  • Эти запросы занимают все больше времени, поскольку загрузка на сервер БД увеличивается
  • Это означает, что все процессы продолжают складываться

Решение, которое может помочь, заключается в сокращении времени, которое потребуются ваши запросы, – оптимизации самых длинных.

Хорошо, поэтому, пробовав каждое решение для решения этих точных проблем в блоге WordPress, я мог бы сделать что-то действительно глупое или гениальное … Не знаю, почему происходит увеличение соединений Mysql, я использовал скрипт php ниже в своем заголовок, чтобы убить все спящие процессы ..

Поэтому каждый посетитель моего сайта помогает убивать спальные процессы.

 <?php $result = mysql_query("SHOW processlist"); while ($myrow = mysql_fetch_assoc($result)) { if ($myrow['Command'] == "Sleep") { mysql_query("KILL {$myrow['Id']}");} } ?> 

Таким образом, я запускал 300 PHP-процессов симулятивно и получал скорость от 60 до 90 в секунду (мой процесс включает в себя 3x запросов). Я поднял его до 400, и это упало примерно до 40-50 в секунду. Я бросил его до 200 и вернулся к 60 и 90 годам!

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