ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Настройка nginx и ядра Linux дл я разрыва зависших соеди нений


  • To: nginx-ru@xxxxxxxxx
  • Subject: Настройка nginx и ядра Linux дл я разрыва зависших соеди нений
  • From: Eugene Batogov <johnbat26@xxxxxxxxx>
  • Date: Fri, 4 Feb 2011 11:24:08 +0300
  • Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:date:message-id:subject:from:to :content-type; bh=daEHm4fz37hOjqES42mJ8iAo2BD7HLTdkr/8+VtrDIk=; b=Q/vZVjI0w1HQr+iMYzkGZf6XxZs6mCQqTm02dCwHaC1J1yx8WOR7HHr0kFlWGL1R8A SVgG2hB+K/iGnkNFaGBxJwgxI4Ne184PouOc6hchxD6oEcxgfyPxn0rfxpb1lB2tO7VW KHMgTamBGvJbgrGsHEXmhpAGO2Gm/VQshZTAc=
  • Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type; b=QhM/FhSoVR6qUa5KIymoleC3u1iLv4AgaUjsEvZm7hpCH1hbkXpWZYdESDIbAjN8UV xg1+qhzVVvvPTe6D7QMfSgz1gJsN1WBf1CLEAdN2/hqR1pivDeRG84HWkIyxtflVPQUz gvTPiqQUss9EwLIL1Zg/hCkeXgyf7bjDropZU=

Приветствую всех.
Тут случилась проблема 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;

error_log         /var/log/nginx/error.log  crit;
pid               /var/run/nginx.pid;

events {
    worker_connections  100000;
    use epoll;
}

#######################################################################
# HTTP PARAMETERS
#######################################################################
http {
    include       mime.types;   
    default_type  application/x-_javascript_;

    log_format main '$remote_addr - $remote_user [$time_local] $request '
    '"$status" $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';
   
    access_log on;
    client_header_buffer_size    1k;
    large_client_header_buffers  4 4k;

    gzip on;
    gzip_min_length 1100;
    gzip_buffers 64 8k;
    gzip_comp_level 3;
    gzip_http_version 1.1;
    gzip_proxied any;
    gzip_types text/plain application/xml application/x-_javascript_ text/css;

    output_buffers   32 512k;
    sendfile_max_chunk  128k;
    postpone_output  1460;
    server_names_hash_bucket_size 64;
    client_max_body_size 15m;

    sendfile         on;
    tcp_nopush       on;
    tcp_nodelay      on;
   #send_lowat       12000;

    #timeouts
    keepalive_timeout   60 60;
    client_header_timeout  1m;
    client_body_timeout    1m;
    send_timeout           1m;
    reset_timedout_connection on;
...
---------
Мой sysctl.conf:
-----------

# 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

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

# 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 = 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
# Максимальное значение открытых файлов. Что бы его узнать, выполните

#net.ipv4.netfilter.ip_conntrack_tcp_timeout_close = 30
#net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 30
#net.ipv4.netfilter.ip_conntrack_tcp_timeout_last_ack = 120
#net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 30
#net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 60
#net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 30
#net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_recv = 30
#net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_sent = 30

net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_sack = 0
net.ipv4.tcp_timestamps = 0

# команду cat /proc/sys/fs/file-max
fs.file-max = 999999
# Virtual memory
# Использовать swap только в крайнем случае
vm.swappiness = 20
--

_______________________________________________
nginx-ru mailing list
nginx-ru@xxxxxxxxx
http://nginx.org/mailman/listinfo/nginx-ru


 




Copyright © Lexa Software, 1996-2009.