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