Приветствую всех. Тут случилась проблема c nginx & nginx_http_push_module (http://ru.wikipedia.org/wiki/Comet_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29)
Мы используем comet a.k.a Reverse AJAX. Канал у клиентов ADSL. Очень часто рвется соединение по comet-у. Когда из _javascript_ вызывается abort для XMLHttpRequest, то соединения не накапливаются. Но когда рвется сеть на физическом уровне, то коннект остается на сервере и висит бесконечно.
Команда netstat четко показывает зависшие ESTABLISHED соединения.
Вопрос: как настроить nginx или sysctl.conf или netfilter, чтобы он гарантированно рвал зависшие соединения? Задача, поддержать на сервере ~ 80000 одновременных соединений без утечек памяти по соединениям.
------------------ Окружение: uname -a : Linux server1 2.6.18-194.el5PAE #1 SMP Fri Apr 2 15:37:44 EDT 2010 i686 i686 i386 GNU/Linux OS: CentOs 5.0 nginx -V: 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.conf:
####################################################################### # GLOBAL PARAMETERS #######################################################################
user root; worker_processes 8; timer_resolution 100ms; worker_rlimit_nofile 1000000; worker_priority -5;
# Kernel sysctl configuration file for Red Hat Linux # version 1.1 # 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
# 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 = 262144 # Буфер под хранение SYN запросов на соединение. Значение по умолчанию 1024, что очень мало для нагруженных серверов. net.ipv4.tcp_max_syn_backlog = 262144 # Возможное количество сокетов в состоянии 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 = 30 # Количество посылок keepalive запросов и интервалов между запросами. # По умолчанию делается 9 попыток с интервалом в 75 секунд, что в свою очередь займет 9*75=11 минут и 25 секунд,
# что в сочетании с параметром по умолчанию net.ipv4.tcp_keepalive_time = 7200 дает нам # значение 2часа 11 минут 25 секунд — минимальное значение времени после которого соединение будет закрыто нашей стороной # после прохождения через это соединение последнего пакета. Это очень большой интервал.
net.ipv4.tcp_keepalive_probes = 2 net.ipv4.tcp_keepalive_intvl = 10 # Максимальный размер буферов по умолчанию для приема и отправки данных через сокеты (в байтах) net.core.wmem_max = 33554432 net.core.rmem_max = 33554432
# Размер буферов по умолчанию для приема и отправки данных через сокеты (в байтах) net.core.rmem_default = 8388608 net.core.wmem_default = 4194394 # Настройка буферов для TCP и UDP соединений (min, default, max bytes) (в байтах)
net.ipv4.tcp_rmem = 4096 8388608 16777216 net.ipv4.tcp_wmem = 4096 4194394 16777216 # Этот параметр дает ядру больше памяти для TCP. # Это будет необходимо при 50k+ открытых соединений. net.ipv4.tcp_mem = 109568 109568 109568
# Количество попыток закрыть соединение перед тем как оно будет разорвано # принудительно. Если вы администрируете http-сервер, который испытывает # большие нагрузки, то стоит подумать об уменьшении этого значения.
# Переменная принимает целое число. Значение по-умолчанию 7, что # соответствует, примерно, от 50 секунд до 16 минут net.ipv4.tcp_orphan_retries = 3 # Переменная задает максимальное число осиротевших (не связанных ни с
# одним процессом) сокетов. Если это число будет превышено, то такие # соединения разрываются, а в системный журнал пишется предупреждение. Это # ограничение существует исключительно ради предотвращения простейших
# разновидностей DoS-атак. net.ipv4.tcp_max_orphans = 300000
net.ipv4.conf.eth0.rp_filter = 0 net.ipv4.conf.all.rp_filter = 0 # Максимальное значение открытых файлов. Что бы его узнать, выполните