Как найти причину увеличения времени execute в PDO?
Реализована следующая схема:
1) на сервер кладутся XML файлы для обработки и записи данных в БД
2) на сервере установлен Gearman, в который добавляется задача на обработку xml, в момент появления нового xml
3) на сервере установлен Supervisord, который держит 10 воркеров, для параллельной обработки очереди в несколько потоков
Все это дело чудесно работает, кроме одного но. У меня логируется время выполнения execute в PDO на вставку/обновление данных в БД . И оно увеличивается. Скажем я положил 80 файлов, на первый execute скрипт потратил 0,002s. на 80 execute это время увеличивается до 0,02.
Что я пробывал:
1) профилирование SQL запроса. По результатам можно точно сказать, что время выполнения запроса не увеличивается.
2) трассировка PHP. Ничего не дало
3) подозрительно кошусь на LOCK TABLES ... WRITE в запросе, но он работает так быстро, что не уверен что дело в нем. Без него скорость такая же, только + ловлю дедлоки.
Получается что на этапе перехода запроса из Execute в PDO в процесс выполнения запроса на СУБД где-то происходит затык. Помогите, что может мешать? Настройки СУБД? настройки коннектов? где еще можно посмотреть и про что можно почитать? спасибо
Настроить слоу лог в мускуле.
Посмотреть размер кеша мускуля, есть подозрение что ему приходится чистить/читать в кеш , ибо не хватает, и это сильно тормозит процесс.
Больше пока мыслей нет, но думаю затырка в каком-то наполнении чего то, раз первые запросы идут норм.
лог медленных запросов смотрел, равно как и профилировал. Все чисто, запросы отрабатывают за 0.0002s и т.д. Причем скорость запросов не проседает. Промониторил SHOW PROCESSLIST; во время работы всех потоков - похоже я ошибся в использовании LOCK TABLES. Точнее вызываю слишком часто. У меня каждый xml содержит порядка ~10000 нод, которые вокером бьются на фрагменты по 500-1000 элементов для мультиинсерта в несколько шагов. Так вот я вызывал LOCK TABLES перед вставкой каждого блока и судя по всему они скапливались (не знаю как, но SHOW PROCESSLIST показал именно это) и это приводило к описанному эффекту. Пока решение вынести лок таблицы на уровень выше (до начала всех вставок) частично решило проблему, но я еще ковыряюсь. Спасибо за отклик