Apache / PHP процессы зависают при взаимодействии с MySQL - PullRequest
5 голосов
/ 10 февраля 2010

Мы наблюдаем какое-то странное поведение, и мы не уверены, что это проблема с apache, php, mysql или ОС, поэтому перейдем к большому мозгу stackoverflow!

У нас есть Apache и mod_php, которые общаются с сервером mysql5. Иногда процесс будет зависать, пытаясь прочитать из файлового дескриптора.

Запуск одного из них (все процессы зависания показали одинаковые результаты) дал следующее:

[root@prweb133v ~]# strace -p 8450
Process 8450 attached - interrupt to quit
read(57,  <unfinished ...>

Так что же он пытался прочитать?

[root@prweb133v ~]# lsof -p 8450
...
...
httpd   8450 apache   57u  IPv4    5546599             TCP
prweb133v.local:36615->hadat.local:mysql (ESTABLISHED)

Это наш сервер MySQL! Хорошо, возможно, он пытался прочитать результаты запроса, подумал я. Проверка списка процессов на сервере MySQL, соединение было установлено, но в состоянии SLEEP.

Хммм.

Итак, я проверил netstat, чтобы увидеть, кто что пытался отправить / получить.

На веб-сервере:

[root@prweb133v ~]# netstat -t -n -a | grep 36615
tcp        0      5 172.23.179.6:36615          172.23.179.67:3306         
ESTABLISHED 

и на сервере MySQL было установлено соединение, но 0 в очередях отправки или получения.

Есть идеи, какими могут быть эти загадочные 5 байтов или почему они случайно не получают сервер mysql?

Ура!

Mike

Ответы [ 2 ]

1 голос
/ 11 июня 2012

Кто-то написал мне по электронной почте с этой страницы, поэтому я вернулся к OP и получил это обновление о возможном исправлении, которое мы использовали:

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

Мы перестали использовать постоянные соединения, и проблема исчезла.

1 голос
/ 11 февраля 2010

Какой MySQL-движок вы используете (myisam, innodb, ...)? Используете ли вы MySQL или MySQL интерфейс на стороне PHP?

Я бы дал "log" и "log_slow_queries" в конфигурационном файле mysql попытку (возможно, на виртуальный диск) вместе с переходом через вывод для "SHOW GLOBAL STATUS;" в оболочке mysql (каждая серверная переменная, оканчивающаяся на "* _waits" или связанная с подключением).

Вы вносили какие-либо изменения в раздел «Тонкая настройка» файла конфигурации mysql? Поменял несколько буферов?

В php.ini у вас есть значение по умолчанию (60) для mysql.connect_timeout? Если для параметра "mysql.trace_mode" установлено значение "on", какое-то время это не повредит.

Вам также может потребоваться провести стресс-тестирование, если возможно, различных частей / URL-адресов вашего приложения с помощью инструмента, такого как «ab», чтобы сузить его.

Или: при использовании apache с модулем prefork локально запускайте только один сервер («Startservers 1», «MaxSpareServers 0», что-то в этом роде) и выполняйте стресс-тест до его зависания. Тогда журналы могут быть более ценными.

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