Вставка БД PHP скрипт зависает случайным образом, без журнала ошибок - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть скрипт, который я запускаю как задание cron каждые X минут.

Он запускается на VPS с использованием Apache, Centos, Maria DB 10.2, 6 ядер и 8 ГБ оперативной памяти.

Я применил механизм, предотвращающий повторный запуск сценария, если текущий запуск еще не завершен sh.

Кажется, он работает нормально примерно в 99% случаев.

Однако, случайным образом, иногда сценарий просто «зависает». Файл журнала, создаваемый сценарием, либо остановится на один момент раньше EOE, либо файл журнала 0 байтов будет создан без заполнения. Нет журналов ошибок и нет зарегистрированных MySQL ошибок.

Сегодня я включил mysqlbinlog log и увидел, что в ту самую секунду, когда журнал выполнения скрипта остановился, скрипт делал ~ 290 Вставок в две таблицы БД, одна таблица имеет ~ 40 столбцов, а другая ~ 85 столбцов.

Но это нормальное поведение для сценариев.

Я консультировался с несколькими разработчиками, и ни один из у них было четкое представление о том, что может происходить. Мне просто предложили, что, возможно, оперативной памяти недостаточно для сценария. Однако я не знаю, имеет ли это смысл, поскольку в большинстве случаев сценарий успешно завершает работу sh, и он не сообщает о проблеме с памятью, он просто зависает.

Можете ли вы предложить способ отладить это?

1 Ответ

0 голосов
/ 20 апреля 2020

Использовать насыпную вставку; это будет примерно в 10 раз быстрее, что, по крайней мере, уменьшит частоту конфликтов.

INSERT INTO tbl (a,b) VALUES
    (1,2),
    (33,44),
    ...

Проверяете ли вы на ошибки? SHOW ENGINE INNODB STATUS;. Необнаруженный тупик может привести к отсутствию данных, но не к зависанию.

Может произойти зависание от действия, блокирующего работу cron. Это может истечь через 50 секунд; ты так долго ждал? Обязательно проверяйте ошибки и регистрируйте их.

0.5G - что если несколько заданий cron накапливаются ?? PHP работает на той же машине, что и MySQL? Могут ли они бороться за оперативную память?

(Я подозреваю, что в вашем коде предотвращения столкновений есть ошибка.)

...