Re: nginx есть десятки гигабат памяти и сервер уходит в swap

Maxim Dounin mdounin на mdounin.ru
Пн Янв 10 19:07:16 UTC 2022


Hello!

On Mon, Jan 10, 2022 at 05:40:44PM +0300, Дугин Сергей wrote:

> Помогите nginx в течении часа после запуска начинает жрать порядка 60-70 гигобайт памяти и дальше растет
> не хвтает свапа и сервер перегружать приходится если вовремя не килнуть и не перезапустить nginx
> Скриншот прилагаю. 
> Была более старая версия, таже была проблема.
> 
> В логе  ошибок
> error_log  /var/log/nginx/error.log warn;
> Ошибок нет
> 
> Меня смущает только такие параметры в nginx:
>     server_names_hash_max_size 131070;
>     server_names_hash_bucket_size 128;
> 
> Но если делать меньше nginx не запускается, так как порядка 2000 доменов в конфиге прописано. Подбирал эти числа на практике.
> Но даже с ними не понятно почему пару процессов nginx отжирают по 30 гиг RAM

Эти параметры точно ни при чём: хэши строятся один раз при чтении 
конфига, и не могут приводить к последующему росту потребления 
памяти отдельными рабочими процессами.

> Больше идей нет, есть у кого-нибудь мысли как можно починить ситуацию?

А что при этом в конфиге?  В частности, worker_connections и 
всевозможные буфера (client_header_buffer_size, 
large_client_header_buffers, client_body_buffer_size, 
proxy_buffer_size, proxy_buffers, output_buffers и так далее)?  
Если включён HTTP/2 - то ещё и http2_max_concurrent_streams.

Отдельно интересно нет ли в конфиге сторонних модулей.  А если 
есть, то воспроизводится ли проблема без них.

[...]

>  cat /etc/os-release
> NAME="CloudLinux"
> VERSION="7.9 (Boris Yegorov)"
> ID="cloudlinux"
> 
> Linux 3.10.0-962.3.2.lve1.5.42.el7.x86_64 #1 SMP Mon Nov 9 08:11:18 EST 2020 x86_64 x86_64 x86_64 GNU/Linux
> 
> 
> top - 17:33:50 up 12:18,  1 user,  load average: 13.88, 13.09, 12.50
> Tasks: 909 total,   7 running, 901 sleeping,   0 stopped,   1 zombie
> %Cpu(s): 12.1 us,  4.8 sy,  0.1 ni, 82.2 id,  0.3 wa,  0.0 hi,  0.6 si,  0.0 st
> KiB Mem : 13182188+total,  4598376 free, 75250656 used, 51972864 buff/cache
> KiB Swap: 10077298+total, 96888000 free,  3884988 used. 44158760 avail Mem
> 
>   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
> 12785 root      20   0   35.0g  34.0g   2440 S  28.0 27.1  10:43.40 nginx
> 12807 root      20   0   14.4g  13.4g   2448 S  29.6 10.6   4:22.15 nginx
> 12805 root      20   0 2904776   1.8g   2588 S   3.0  1.4   1:10.02 nginx
> 12802 root      20   0 2880556   1.8g   2432 S   2.0  1.4   0:52.17 nginx
> 12799 root      20   0 2859616   1.8g   2452 S   1.6  1.4   0:31.47 nginx

Судя по всему, растут те процессы, которые собственно занимаются 
обработкой соединений: на современных линуксах распределение 
соединений между рабочими процессами может быть сильно 
неравномерным, лечить проще всего включением accept_mutex'а 
(https://trac.nginx.org/nginx/ticket/2285).

Почему растут - отдельный вопрос.  Для начала, наверное, стоит 
посмотреть, до какого размера процессы могут расти по памяти в 
соответствии с текущими настройками.  Грубая оценка максимального 
потребления памяти одним рабочим процессом - worker_connections * 
<сумма всех буферов>.  Если она не превышена - то вопрос, скорее, 
в настройках, не соответствующих имеющемуся объёму памяти.  Если 
превышена - то имеет смысл разбираться дальше.

-- 
Maxim Dounin
http://mdounin.ru/


Подробная информация о списке рассылки nginx-ru