#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; Разницу можно увидеть здесь, на следующем рисунке.