Недостаточно информации, чтобы дать какие-либо ответы о root причине проблемы, но, возможно, эти общие шаги, как начать решение проблемы, помогают.
Первая и самая важная часть - репликация замедление локально и запустите ваше приложение в профилировщике, чтобы выяснить, какие части кода фактически занимают весь этот процессор. Запуск вашего приложения с node --inspect
позволяет вам профилировать выполнение приложения в Chrome браузере-профилировщике.
Также звучит так, как будто вы запускаете только один процесс узла, так что довольно странно, как вы возможность использовать 100% CPU из всех 8 ядер с довольно низким количеством пользователей (менее 1000?) ... Одна вещь, которая приходит мне в голову, это то, что если вы проверяете, например, пароль ha sh при каждом запросе пользователя, он может на самом деле начать использовать много процессора очень быстро.
Если это действительно проблема, которую вы могли бы реализовать, например, JSON Поддержка Web Token для вашего приложения, где пароль используется только для получения токена доступа, который затем очень быстро проверяется по сравнению с аутентификацией по паролю. .
Когда ваше базовое c приложение работает нормально, вам следует задуматься о том, как запустить несколько процессов сервера на одном экземпляре, чтобы лучше использовать все ядра ЦП.
РЕДАКТИРОВАТЬ:
Похоже, что 12-20% 5-ядерных экземпляров - это около 100% одноядерных. Таким образом, ваше приложение, кажется, насыщает процессор.
Об использовании кучи: если вы профилируете приложение, вы сможете увидеть, является ли сборщик мусора, который начинает останавливать приложение.
Одной из причин может быть то, что вы на самом деле создаете слишком много тра sh, что в какой-то момент начинает ухудшать производительность. Вы также можете попробовать, если, например, немного увеличит размер кучи по умолчанию с 1,7 ГБ до 8 ГБ node --max-old-space-size=8092
.
В дополнение к сборке мусора, например, если вы возвращаете десятки тысяч строк из БД, просто анализируя их до javascript объекты могут насыщать процессор. Таким образом, профилирование - все еще правильный способ попытаться выяснить, что происходит. Парсинг, особенно дат, по умолчанию очень медленный в knex (когда они конвертируются в Date
объекты).