Переполнен ошибками "TCP: переполнение таблицы времени ожидания" - Что я могу сделать, чтобы смягчить?

У меня есть устаревшая система с Debian 7 (proxmox), в которой размещаются контейнеры OpenVZ, и я вижу неприятную проблему, когда система перегружена открытыми подключениями к контейнеру VZ, работающему с интерфейсом apache.

Когда это происходит, журнал на сервере заполняется тысячами ошибок "TCP: переполнение таблицы ожидания времени (CT233)". Это связано с медленными ответами от веб-сервера. Что я могу сделать, чтобы смягчить эту проблему?

После поисков, я внес некоторые изменения в различные настройки conntrack, но я не хотел делать что-то слишком радикальное без лучшего понимания того, какими могут быть последствия (или, действительно, может ли это быть полезным в любой случай)

Чтобы понять, какова ситуация, вот вывод "sysctl -a | grep conntrack", когда это происходило сегодня:

net.netfilter.nf_conntrack_generic_timeout = 480
net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 120
net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 60
net.netfilter.nf_conntrack_tcp_timeout_established = 345600
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_last_ack = 30
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close = 10
net.netfilter.nf_conntrack_tcp_timeout_max_retrans = 300
net.netfilter.nf_conntrack_tcp_timeout_unacknowledged = 300
net.netfilter.nf_conntrack_tcp_loose = 1
net.netfilter.nf_conntrack_tcp_be_liberal = 0
net.netfilter.nf_conntrack_tcp_max_retrans = 3
net.netfilter.nf_conntrack_udp_timeout = 30
net.netfilter.nf_conntrack_udp_timeout_stream = 180
net.netfilter.nf_conntrack_icmp_timeout = 30
net.netfilter.nf_conntrack_acct = 0
net.netfilter.nf_conntrack_events = 1
net.netfilter.nf_conntrack_events_retry_timeout = 15
net.netfilter.nf_conntrack_max = 131072
net.netfilter.nf_conntrack_count = 128397
net.netfilter.nf_conntrack_buckets = 32768
net.netfilter.nf_conntrack_checksum = 1
net.netfilter.nf_conntrack_log_invalid = 0
net.netfilter.nf_conntrack_expect_max = 256
net.nf_conntrack_max = 131072

Это включает в себя несколько изменений, которые я сделал сегодня: я удвоил nf_conntrack_buckets с 16384 до 32768, я сократил conntrack_generic_timeout с 600 до 480 с и уменьшил conntrack_tcp_timeout_established с 5 до 4 дней.

Подавляющее большинство открытых соединений в любой момент времени находятся в TIME_WAIT.

Я надеюсь, что есть кто-то, кто знает больше о настройке TCP/Kernel, чем я могу порекомендовать.

Спасибо!

1 ответ

Решение

В итоге я настроил две другие переменные, удвоив каждую из них: "net.ipv4.tcp_max_tw_buckets" и "net.ipv4.tcp_max_tw_buckets_ub", и после внесения этих изменений ошибки "переполнение таблицы времени ожидания не возникали". Я собираюсь следить за этим в течение следующей недели или около того, однако, и посмотрю, действительно ли это решило проблему.

Другие вопросы по тегам