я хотел бы спросить вашу помощь по давней проблеме с соединениями 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, которые остаются на связи, и фактически ничего не делают на стороне базы данных.
Основная идея, поэтому: убедитесь, что у вас нет процессов 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 годам!
Поэтому мой совет любому, у кого есть эта проблема, – эксперимент с запуском меньше, чем больше, и посмотрите, улучшится ли он. Там будет меньше памяти и процессора, поэтому процессы, которые выполняются, будут иметь больше возможностей и скорость может улучшиться.