Помогите определить источник нагрузки. PHP+MySQL
Всем привет. Имеем достаточно мощный сервер 2xXeon Gold 5218R 2.10GHz 256DDR4, обслуживающий всего один сайт на php+mysql. В базе Mysql (innodb) имеется таблица items в 23 поля, основная работа происходит с ней - множество операций insert, множество операций чтения, раз в 3 часа - очистка ненужных записей. Для таблицы установлено 6 индексов + primary key. Все запросы происходят исключительно по ключам, основные - по полю
uidVARCHAR(32)
которое так же является индексом.
Принцип работы: пользователи добавляют в таблицу items записи, затем запускается долгий скрипт PHP, который в цикле выбирает записи по uid и обрабатывает их.
Этот скрипт - "бесконечный" цикл while. Он выбирает записи по uid+id пользователя+status (обработано или нет), обрабатывает, затем снова выбирает и обрабатывает - так до тех пор, пока записи существуют)
В среднем пользователь добавляет по 300-500 записей, их обработка занимает 10-30 минут. В таблице постоянно имеется ~2млн записей, уникальных uid - порядка 20 тысяч.
В данном режиме сервер работает относительно "спокойно" - потребление CPU на уровне 1-2%, быстрый отклик и т.д.
Кроме того, каждый час cron запускает аналогичные скрипты, которые в автоматическом режиме запускают такие же циклы обработки. Одновременно запускается от 500 до 1000 заданий (выбираются по условию из другой таблицы и в цикле exec ('/usr/bin/php ...'); запускаются). В такие моменты нагрузка на сервер заметно возрастает. Причем возрастает в разы, load average достигает 200 и выше, сайт становится недоступен. Такая нагрузка наблюдается 20-30 минут, затем постепенно спадает, затем (в очередной час) - снова скачет.

Оптимизацией занимаюсь последних пару недель. За это время сделано -
- mysql сконфигурирован, пожалуй, насколько это возможно
- по некоторым рекомендациям в бесконечные циклы добавлено sleep(1), и кажется это помогло немного снизить нагрузку
- оптимизирован php-код, проверены все запросы с explain
- INSERT, которые раньше в момент пиковой нагрузки занимали до 20 секунд, заменены на LOAD DATA INFILE, но даже сейчас такие запросы порой занимают до 3 секунд.
- Пробовали даже изменять настройку времени по рекомендациям https://blog.bullgare.com/2012/08/mysql-%D0%B5%D1%81%D1%82-%D0%B2%D1%81%D0%B5-%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D1%8B-%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%BE%D1%80%D0%B0-%D0%B4%D0%B0%D0%B6%D0%B5-%D0%B5%D1%81%D0%BB%D0%B8/ - не помогло.
Казалось бы, сайт требует действительно больших ресурсов, но до недавнего времени все прекрасно работало на "обычном" 4 ядерном сервере с 32Gb памяти, а сейчас многократно увеличив ресурс, без изменения в скриптах - получил странную производительность.
Надеюсь, здесь найдутся специалисты, которые подскажут над чем еще стоит поработать.