Утечка памяти Nginx с socket.io

#nginx #memory-leaks #proxy #socket.io

#nginx #утечки памяти #прокси #socket.io

Вопрос:

Предыстория: мы управляем инфраструктурой для многих клиентов, и почти у всех есть прокси Nginx, где они завершают SSL и выполняют некоторое кэширование. Мы никогда не сталкивались с какими-либо проблемами в Nginx, и мы столкнулись со стеной во время этого устранения неполадок.

Проблема: Недавно мы выполнили миграцию для новых клиентов и их приложений socket.io . Мы заметили, что использование памяти со временем только увеличивается, и причиной этого является только один рабочий процесс. Перезапуски не помогают, когда 1 рабочий становится «заблокированным», использование оперативной памяти только увеличивается. Все работает хорошо, и ничто не работает медленно, но это может вызвать ООМ, и это будет проблемой. Когда рабочий убит, оперативная память освобождается, но затем новый делает то же самое.

Установка: виртуальная машина Nginx 4vCPU / 8GB RAM (версия 1.18.0), работающая на гипервизоре ESXi — Ubuntu 18.04.4 LTS. Nginx настроен только как прокси-сервер, обслуживающий около 150-200 запросов в секунду. Нет кэширования, нет обслуживания статических файлов. Мы рассмотрели pmap и увидели, что это считается загрязненной памятью, но мы не знаем, что является причиной этого. Нет ошибок в системном журнале или nginx error.log. Журналы доступа отключены, и если вы хотите перезагрузить конфигурацию, рабочий, у которого возникли проблемы, зависает в состоянии «рабочий процесс завершается». Мы предполагаем, что что-то неправильно настроено для сокета.ввод-вывод на стороне Nginx, но трудно понять, что именно.

Большое спасибо за помощь и приношу извинения за грамматику. При необходимости я могу предоставить дополнительную информацию / показатели / конфигурацию.

Некоторые параметры конфигурации:

 events {
    worker_connections  4096;
    use epoll;
    multi_accept on;
}
http {
    aio threads;
    keepalive_timeout 65;
    proxy_buffering                 on;
    proxy_read_timeout              120s;
    proxy_send_timeout              120s;
    proxy_buffers                   8 2m;
    proxy_buffer_size               12m;
    proxy_busy_buffers_size         12m;
    proxy_headers_hash_max_size     1024;
    proxy_headers_hash_bucket_size  128;
    ....
}
  

Ответ №1:

Решение состояло в том, чтобы удалить все параметры конфигурации proxy_buffering и оставить только: proxy_buffering off; proxy_buffer_size 4k; Разницу можно увидеть здесь, на следующем рисунке.