Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Всем доброго дня.
Возникла следующая проблема.
Есть таблица задач для многопроцессового демона.
Формат таблицы (id,task,work). Движок - innodb. task - это задача, work - флаг занятости. Изначально при добавлении задачи work=0.
Параллельно работает много процессов. Одна задача должна достаться только одному процессу.
Беру задачу запросом вида:
SELECT `id`,`task` FROM `xxx` WHERE `work`=0 ORDER BY `id` ASC LIMIT 1 FOR UPDATE
И сразу же помечаем ее как занятую
UPDATE `xxx` SET `work`=1 WHERE `id`={xxx}
Ну и коммит в итоге:
$sql->commit();
У каждого процесса свое подключение к базе.
Теперь что касается проблемы. Если количество потоков примерно 90-100, то все работает прекрасно.
Но если количество потоков превышает эту цифру, ту спустя секунд 20-30 после запуска, все процессы подвисают
на операции SELECT `id`,`task` FROM `xxx` WHERE `work`=0 ORDER BY `id` ASC LIMIT 1 FOR UPDATE со статусом Sending data. Т.е. висит штук 200 процессов с описанными параметрами. Сама база отвечает, но никакие запросы не обрабатывает. Все идет в кучу к зависающим процессам.
Судя по всему, все упирается в какой-то установленный лимит. Но вот что это за лимит - никак не найду.
Дамп переменных сервера во вложенном файле.
Всем заранее спасибо за ответы.
Отредактированно dark_drakon (21.09.2013 04:22:18)
Неактивен
Точно все в одинаковом состоянии "Sending data" или какая-то одна в другом состоянии? Что видно снаружи - хватает ли памяти на сервере, используется ли диск. Пишется ли что-то в логи?
Неактивен
А остальные процессы в каком состоянии? И что в SHOW ENGINE INNODB STATUS?
И, может, они не подвисают, а реально пытаются получить данные?
Неактивен
Страниц: 1