Вопрос или проблема
Наш стек:
RoR: 5.2.3
Puma 3
Ruby 2.6.3 и redis 4.0.9
Node 13.14.0 и
Mysql 5.7
Ubuntu 18.04
Сервер Puma иногда неожиданно сбрасывается без воспроизводимого паттерна.
Сообщение об ошибке, которое нам удалось собрать, следующее:
7fe97c2e1000-7fe97c47c000 r--p 00000000 103:01 12480 /usr/lib/locale/locale-archive
7fe97c47c000-7fe97c481000 rw-p 00000000 00:00 0
7fe97c485000-7fe97c486000 r-xp 00000000 00:00 0
7fe97c486000-7fe97c48d000 r--s 00000000 103:01 124282 /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
7fe97c48d000-7fe97c48f000 rw-p 00000000 00:00 0
7fe97c48f000-7fe97c490000 r--p 00029000 103:01 7777 /lib/x86_64-linux-gnu/ld-2.27.so
7fe97c490000-7fe97c491000 rw-p 0002a000 103:01 7777 /lib/x86_64-linux-gnu/ld-2.27.so
7fe97c491000-7fe97c492000 rw-p 00000000 00:00 0
7ffc1a0f7000-7ffc1a8f6000 rw-p 00000000 00:00 0 [stack]7ffc1a9c2000-7ffc1a9c5000 r--p 00000000 00:00 0 [vvar]
7ffc1a9c5000-7ffc1a9c7000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0 [vsyscall]
[ПРИМЕЧАНИЕ]
Вы могли столкнуться с ошибкой в интерпретаторе Ruby или в библиотеках расширений.
Мы приветствуем отчеты об ошибках.
Для подробностей: https://www.ruby-lang.org/bugreport.html
Что мы пробовали:
- Пытались заметить, когда происходят эти сбои, и обнаружили проблемы при высоких нагрузках. Наш стендовый сервер сбрасывается гораздо реже, так как на него меньше нагрузка.
- Мы установили программное обеспечение для мониторинга, чтобы отслеживать использование CPU и RAM, и не обнаружили подозрительных действий.
- Запустили наше приложение в Docker, но сбои все еще продолжаются.
Ответ или решение
Проблемы с неожиданными сбоями Puma в Ruby on Rails
Введение
Ваша система, использующая стеки Ruby on Rails (RoR) версии 5.2.3, Puma версии 3, Ruby 2.6.3, и другие компоненты, сталкивается с проблемой случайных сбоев серверного приложения. В данном анализе мы рассмотрим причины, потенциальные решения и шаги для диагностики данной проблемы.
Описание проблемы
Проблема проявляется в виде неожиданного завершения работы сервера Puma под нагрузкой, что, судя по собранным данным, происходит при высокой загрузке. Вы предоставили фрагмент трассировки, который указывает на возможные проблемы в интерпретаторе Ruby или его расширениях:
NOTE: You may have encountered a bug in the Ruby interpreter or extension libraries.
Анализ возможных причин сбоя
-
Перегрузка сервера: Как вы заметили, проблема усугубляется с увеличением нагрузки. Это может указывать на недостаточную производительность сервера или неправильную конфигурацию Puma, которая не справляется с большим количеством одновременных запросов. Убедитесь, что вы используете правильное количество потоков и воркеров в конфигурации Puma.
-
Системные ресурсы: Вы проверили использование CPU и RAM, но также стоит обратить внимание на другие системные ограничения, включая лимиты на количество открытых файлов и процессов.
-
Совместимость библиотек: Используемые вами версии Ruby, Puma и других библиотек могут иметь несовместимости или известные баги. Рекомендуется проверить changelogs и известные проблемы в документации каждого компонента.
-
Проблемы с памятью: Сбои могут происходить из-за утечек памяти в приложении. Убедитесь, что в коде нет бесконечных циклов или других конструкций, которые могут вызывать чрезмерное потребление памяти. Используйте инструменты профилирования, такие как
memory_profiler
для анализа использования памяти вашим приложением. -
Логи Puma: Проверьте логи Puma на наличие более подробной информации о сбоях. Также рассмотрите возможность включения трассировки стека для получения дополнительных данных при последующих сбоях.
Рекомендации по устранению проблемы
-
Настройка Puma: Оптимизируйте настройки Puma, увеличив количество рабочих процессов и потоков. Например, начните с 2-4 воркеров и 5-10 потоков на воркер.
workers Integer(ENV['WEB_CONCURRENCY'] || 2) threads_count = Integer(ENV['RAILS_MAX_THREADS'] || 5) threads threads_count, threads_count
-
Мониторинг и алертинг: Установите более детальную систему мониторинга, которая будет отслеживать метрики производительности, такие как время ответа, количество активных соединений и использование памяти в реальном времени.
-
Тестирование под нагрузкой: Проведите нагрузочное тестирование с инструментами такими как JMeter или Locust, чтобы выяснить пределы вашего приложения и адаптировать архитектуру под его требования.
-
Обновление компонентов: Рассмотрите возможность обновления версии Ruby и Puma до более новых, поскольку более свежие версии могут содержать исправления для известных ошибок и улучшения производительности.
-
Отладка и трассировка ошибок: Используйте инструменты для выявления ошибок, такие как Sentry или Rollbar, чтобы отслеживать сбои и исключения в вашем приложении.
Заключение
Необходимость в анализе и отладке проблемы со сбоями Puma в Ruby on Rails требует комплексного подхода, начиная с настройки конфигурации серверов и заканчивая анализом кода. Также важно учитывать все аспекты нагрузки и системных ресурсов, чтобы избежать сбоев в будущем. Регулярные обновления и мониторинг должны стать частью вашего рабочего процесса для обеспечения стабильности вашего приложения.