Я заметил, что у меня слишком много mysqld
процессы, у которых есть различные запросы mysql; Я перезапустил mysqld
и все эти процессы возвращаются в течение 10 секунд.
Я знаю, что процессы создаются с помощью php; но не знаю, как это отследить. Как это сделать?
Чтобы ответить на мой собственный вопрос, вот что я обнаружил; это сильно зависит от вашей среды и включает использование lsof
и strace
.
Вам нужно будет найти идентификатор процесса вашего запроса (используя lsof
или netstat
или любой другой сетевой инструмент в Linux). Как только вы получите это, вам понадобится идентификатор родительского процесса, который вы можете пройти ps
. Затем вы захотите связать этот PPID следующим образом: strace -f -tt -T -s 10000 -p <PPID> -o ~/out.strace
.
Другой способ сделать это более продвинутый и предполагает использование /proc/
. Вам также нужно будет получить PPID вашего соединения, используя lsof
. Затем вы выполните ls -la /proc/<ppid>/fd/
и grep для socket:[*number*]
. Затем вы выполните lsof
на всех числоs, а затем strace
все pid от тех числос.
Выполните следующий запрос из CLI-клиента, из phpmyadmin или вашего любимого mysql-инструмента:
SELECT `USER`,
`HOST`,
`DB`,
`COMMAND`,
`TIME`,
`STATE`,
LEFT(`INFO`, 51200) AS `Info`
FROM `information_schema`.`PROCESSLIST`;
и вы увидите, кто заблокировал ваши базы. Конечно, я уверен, что хоть один индекс в ваших базах сломан и его нужно перестраивать. Вы должны запустить анализ / восстановление БД, чтобы решить вашу проблему:
REPAIR TABLE database.table;
Если вы не используете несколько экземпляров базы данных, у вас должен быть запущен только один процесс mysqld.