[emerg] 6428#0: malloc() 3053187144 bytes failed (12: Cannot allocate memory)

Eugene Batogov johnbat26 на gmail.com
Пт Мар 25 11:53:47 MSK 2011


Приветствую всех.
Возникли две интересные проблемы, а точнее записи в nginx.log:
...
2011/03/18 17:34:46 [alert] 6431#0: ngx_slab_free(): chunk is already free
2011/03/18 17:34:46 [alert] 6429#0: ngx_slab_free(): chunk is already free
2011/03/18 17:34:46 [alert] 6429#0: ngx_slab_free(): chunk is already free
2011/03/18 17:35:16 [alert] 6429#0: ngx_slab_free(): chunk is already free
2011/03/18 17:35:16 [alert] 6429#0: ngx_slab_free(): chunk is already free
2011/03/18 17:35:46 [alert] 6433#0: ngx_slab_free(): chunk is already free
2011/03/18 17:35:46 [alert] 6433#0: ngx_slab_free(): chunk is already free
2011/03/18 17:36:16 [crit] 6436#0: ngx_slab_alloc() failed: no memory
2011/03/18 17:36:16 [crit] 6436#0: ngx_slab_alloc() failed: no memory
2011/03/18 17:36:16 [crit] 6433#0: ngx_slab_alloc() failed: no memory
2011/03/18 17:36:16 [crit] 6433#0: ngx_slab_alloc() failed: no memory
2011/03/18 17:36:16 [crit] 6433#0: ngx_slab_alloc() failed: no memory
2011/03/18 17:36:16 [crit] 6433#0: ngx_slab_alloc() failed: no memory
2011/03/18 17:36:16 [crit] 6429#0: ngx_slab_alloc() failed: no memory
2011/03/18 17:36:16 [crit] 6429#0: ngx_slab_alloc() failed: no memory
....
Почему появляются эти сообщения?
Кто их инициатор?

и вторая:
...
2011/03/18 17:30:16 [emerg] 6428#0: malloc() 3053187144 bytes failed (12:
Cannot allocate memory)
...
Под что nginx выделяет так много памяти?
Как это можно узнать?

--------
И еще вопрос: можно ли в Linux x86 увеличить размер памяти выделяемого ядру
?
Просто, если использовать http_push (a.k.a comet) то памяти для сокетов
может не хватить при >50K соединений.
А на 64-bit какой размер памяти для ядра по умолчанию?

И еще возникла проблема с остановом nginx после использования
nginx_http_push_module.
Он очень долго останавливается, такое ощущение, что ждет окончания
таймаутов.

Наш sysctl.conf прикреплен к письму.

--------------
Наши окружения:
-----------
nginx version: nginx/0.7.65
built by gcc 4.1.2 20080704 (Red Hat 4.1.2-48)
TLS SNI support disabled
configure arguments: --user=nginx --group=nginx --prefix=/usr/share/nginx
--sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf
--error-log-path=/var/log/nginx/error.log
--http-log-path=/var/log/nginx/access.log
--http-client-body-temp-path=/var/lib/nginx/tmp/client_body
--http-proxy-temp-path=/var/lib/nginx/tmp/proxy
--http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi
--pid-path=/var/run/nginx.pid --lock-path=/var/lock/subsys/nginx
--with-http_ssl_module --with-http_realip_module --with-http_addition_module
--with-http_sub_module --with-http_dav_module --with-http_flv_module
--with-http_gzip_static_module --with-http_stub_status_module
--with-http_perl_module --with-mail --with-mail_ssl_module
--with-cc-opt='-O2 -g -m32 -march=i386 -mtune=generic
-fasynchronous-unwind-tables'
--add-module=/usr/src/redhat/BUILD/nginx-0.7.65/nginx-upstream-fair
--add-module=/usr/src/redhat/BUILD/nginx-0.7.65/nginx_http_push_module-0.692
--add-module=/usr/src/redhat/BUILD/nginx-0.7.65/nginx_upstream_hash-0.3.1
-----------
nginx version: nginx/0.8.53
built by gcc 4.1.2 20080704 (Red Hat 4.1.2-48)
TLS SNI support disabled
configure arguments: --user=nginx --group=nginx --prefix=/usr/share/nginx
--sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf
--error-log-path=/var/log/nginx/error.log
--http-log-path=/var/log/nginx/access.log
--http-client-body-temp-path=/var/lib/nginx/tmp/client_body
--http-proxy-temp-path=/var/lib/nginx/tmp/proxy
--http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi
--pid-path=/var/run/nginx.pid --lock-path=/var/lock/subsys/nginx
--with-http_secure_link_module --with-http_random_index_module
--with-http_ssl_module --with-http_realip_module --with-http_addition_module
--with-http_sub_module --with-http_dav_module --with-http_flv_module
--with-http_gzip_static_module --with-http_stub_status_module
--with-http_perl_module --with-mail --with-mail_ssl_module
--with-cc-opt='-O2 -g -m32 -march=i386 -mtune=generic
-fasynchronous-unwind-tables' --with-ipv6
--add-module=/usr/src/redhat/BUILD/nginx-0.8.53/nginx-upstream-fair
--add-module=/usr/src/redhat/BUILD/nginx-0.8.53/nginx-upload-progress-module
--add-module=/usr/src/redhat/BUILD/nginx-0.8.53/mod_zip-1.1.6
--add-module=/usr/src/redhat/BUILD/nginx-0.8.53/nginx_upload_module-2.2.0
--add-module=/usr/src/redhat/BUILD/nginx-0.8.53/nginx_mod_h264_streaming-2.2.7
--add-module=/usr/src/redhat/BUILD/nginx-0.8.53/nginx_http_push_module-0.692
--add-module=/usr/src/redhat/BUILD/nginx-0.8.53/nginx_upstream_hash-0.3.1
------------

Из сторонних модулей мы используем:
 - nginx_upstream_hash-0.3.1
 - *nginx_http_push_module <https://github.com/slact/nginx_http_push_module>
* -0.692.

--
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://nginx.org/pipermail/nginx-ru/attachments/20110325/05e34a78/attachment-0001.html>
-------------- next part --------------
# Kernel sysctl configuration file for Red Hat Linux
#
# For binary values, 0 is disabled, 1 is enabled.  See sysctl(8) and
# sysctl.conf(5) for more details.

# Controls IP packet forwarding
net.ipv4.ip_forward = 0

# Controls source route verification
net.ipv4.conf.default.rp_filter = 1

# Do not accept source routing
net.ipv4.conf.default.accept_source_route = 0

# Controls the System Request debugging functionality of the kernel
kernel.sysrq = 0

# Controls whether core dumps will append the PID to the core filename
# Useful for debugging multi-threaded applications
kernel.core_uses_pid = 1

# Controls the use of TCP syncookies
net.ipv4.tcp_syncookies = 1

# Controls the maximum size of a message, in bytes
kernel.msgmnb = 65536

# Controls the default maxmimum size of a mesage queue
kernel.msgmax = 65536

# Controls the maximum shared segment size, in bytes
kernel.shmmax = 4294967295

# Controls the maximum number of shared memory segments, in pages
kernel.shmall = 268435456

###################
#Custom parameters#
###################

# We use it always
# Параметр представляет собой два целых числа, которые определяют диапазон локальных портов,
# которые используются в клиентских соединениях, т.е. для исходящих
# соединений, которые связывают нашу систему с некоторым узлом сети, где мы выступаем в качестве клиента
net.ipv4.ip_local_port_range = 1025 65535
# Быстрая утилизация сокетов находящихся в состоянии TIME_WAIT
net.ipv4.tcp_tw_recycle = 1
# Время пребывания сокета в состоянии FIN-WAIT-2
net.ipv4.tcp_fin_timeout = 3

# New param
# Длина очереди для входящих пакетов
net.core.netdev_max_backlog = 10000
# Количество возможных подключений к сокету, прежде чем будут отброшены
net.core.somaxconn = 4096
# Буфер под хранение SYN запросов на соединение. Значение по умолчанию 1024, что очень мало для нагруженных серверов.
net.ipv4.tcp_max_syn_backlog = 2048
# Возможное количество сокетов в состоянии TIME_WAIT
#net.ipv4.tcp_max_tw_buckets = 720000
# Опция включена, иначе не будет работать опция tcp_tw_reuse описанная ниже
net.ipv4.tcp_timestamps = 1
# Механизм, разрешающий использовать уже существующие сокеты которые находятся в состоянии TIME_WAIT, если это не повредит безопасности.
net.ipv4.tcp_tw_reuse = 1
# Временной интервал попытки определения жизнеспособности соединения. 
# По умолчанию 7200, т е через 2 часа после того как через соединение прочел последний пакет,
# система отправит keep-alive запрос чтобы узнать состояние соединения. Уменьшим этот параметр до 30 минут.
net.ipv4.tcp_keepalive_time = 300
# Количество посылок keepalive запросов и интервалов между запросами. 
# По умолчанию делается 9 попыток с интервалом в 75 секунд, что в свою очередь займет 9*75=11 минут и 25 секунд, 
# что в сочетании с параметром по умолчанию net.ipv4.tcp_keepalive_time = 7200 дает нам 
# значение 2часа 11 минут 25 секунд ? минимальное значение времени после которого соединение будет закрыто нашей стороной
# после прохождения через это соединение последнего пакета. Это очень большой интервал.
net.ipv4.tcp_keepalive_probes = 7
net.ipv4.tcp_keepalive_intvl = 30
# Максимальный размер буферов по умолчанию для приема и отправки данных через сокеты (в байтах)
net.core.wmem_max = 16777216
net.core.rmem_max = 16777216
# Размер буферов по умолчанию для приема и отправки данных через сокеты (в байтах)
#net.core.rmem_default = 8388608
#net.core.wmem_default = 4194394
# Настройка буферов для TCP и UDP соединений (min, default, max bytes) (в байтах)
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# Этот параметр дает ядру больше памяти для TCP.
# Это будет необходимо при 50k+ открытых соединений.
net.ipv4.tcp_mem = 50576 64768 98152

# Количество попыток закрыть соединение перед тем как оно будет разорвано
# принудительно. Если вы администрируете http-сервер, который испытывает
# большие нагрузки, то стоит подумать об уменьшении этого значения.
# Переменная принимает целое число. Значение по-умолчанию  7, что
# соответствует, примерно, от 50 секунд до 16 минут
net.ipv4.tcp_orphan_retries = 3

# Переменная задает максимальное число осиротевших (не связанных ни с
# одним процессом) сокетов. Если это число будет превышено, то такие
# соединения разрываются, а в системный журнал пишется предупреждение. Это
# ограничение существует исключительно ради предотвращения простейших
# разновидностей DoS-атак.
net.ipv4.tcp_max_orphans = 8192

# Максимальное значение открытых файлов. Что бы его узнать, выполните
# команду cat /proc/sys/fs/file-max
fs.file-max = 999999
# Использовать swap только в крайнем случае

vm.swappiness = 20
#Запрещаем кеширование статуса ssthresh (были ретрансмиты) для других соединений
net.ipv4.tcp_no_metrics_save = 1


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