Почему Express на Ubuntu работает медленно?

Здравствуйте! У меня возник интересный случай: я поднял виртуальную машину с Ubuntu 20.04.6 на Hyper-V с установленным сервером Node.js и простым приложением на Express, которое возвращает "Hello World". Затем я запустил нагрузочное тестирование с другой машины, используя Apache Bench (команда ab -n 10000 -c 10000 -g address). В ходе тестирования я получил 260-300 запросов в секунду. 

Хотя сеть между машинами загружена максимум на 1.5%, а в Ubuntu по команде top нагрузка на процессор ноды варьируется от 13 до 30%, при этом пиковая загрузка достигает только 30%. Оперативная память в виртуалке составляет 2 гигабайта, из которых свободно 140 мегабайт, и во время теста ее использование не сильно меняется. Также у меня настроен только один vCPU.

В связи с этим, меня интересует: почему сервер обрабатывает запросы так медленно, если загрузка процессора и сети невысока?
  • 27 октября 2024 г. 13:42
Ответы на вопрос 1
Существует несколько факторов, которые могут влиять на производительность вашего приложения на Express на Ubuntu в среде виртуальной машины. Давайте рассмотрим основные из них:

1. **Ограничения ресурсов**:
   - **Процессор (vCPU)**: Ваша виртуальная машина имеет только один виртуальный процессор (vCPU). Это может серьезно ограничить параллельную обработку запросов. Express и другие фреймворки Node.js работают в одном потоке, и даже с асинхронными операциями можно сталкиваться с блокировкой в основном потоке, если есть какие-либо синхронные операции.
   - **Оперативная память**: Хотя у вас есть 2 ГБ ОЗУ, свободные 140 МБ могут оказаться недостаточными для обработки большого количества одновременных соединений, особенно если у вас есть дополнительные модули или зависимости в вашем приложении.

2. **Настройки сети**:
   - Если ваша виртуальная машина использует сетевой мост или NAT, это может оказать влияние на пропускную способность и задержки. Попробуйте разные настройки сети Hyper-V.

3. **Настройки Node.js**:
   - Проверьте, какие версии Node.js и Express вы используете. Некоторые версии могут иметь известные проблемы с производительностью.
   - Используйте кластерный модуль Node.js для запуска нескольких экземпляров вашего приложения на различных ядрах процессора. Это может значительно увеличить обрабатываемые запросы в секунду за счет увеличения параллелизма.

4. **Тестирование производительности**:
   - Команда `ab` может быть не идеальной для нагрузочного тестирования приложения, работающего на Node.js. Попробуйте использовать другие инструменты, такие как JMeter, Artillery или k6, которые лучше подходят для асинхронного сетевого программирования.
   - Убедитесь, что ваш тест правильно настраивается, и количество соединений и запросов не подавляет сервер.

5. **Оптимизация Express**:
   - Используйте кэширование, отложенные операции и другие методы оптимизации запросов.
   - Проверьте middleware, который может замедлять обработку запросов. Используйте легкие решения или отключите ненужные.

6. **Общее состояние системы**:
   - Убедитесь, что на машине нет других процессов, которые потребляют ресурсы.
   - Обратите внимание на задержки ввода-вывода (I/O) — если ваше приложение обращается к дискам, это может увеличить время обработки запросов.

7. **Мониторинг и профилирование**:
   - Используйте инструменты мониторинга (например, `pm2`, `clinic.js`) для анализа производительности вашего приложения для нахождения узких мест.

Проведите тестирование с учетом вышеперечисленных факторов, и вы сможете выявить, что именно тормозит ваш сервер и как это можно оптимизировать.
Похожие вопросы