Welcome! Log In Create A New Profile

Advanced

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

February 04, 2011 03:26AM
Приветствую всех.
Тут случилась проблема 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@nginx.org
http://nginx.org/mailman/listinfo/nginx-ru
Subject Author Posted

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

JohnBat26 February 04, 2011 03:26AM

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

stitrace February 04, 2011 07:44AM

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

JohnBat26 February 04, 2011 08:04AM

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

stitrace February 14, 2011 10:23AM



Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 285
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready