Маршрутизатор тормозит

From DD-WRT Wiki

Jump to: navigation, search

Contents

[edit] Введение

Проблемы возникают со многими маршрутизаторами, включая маршрутизаторы с DD-WRT, при использовании требовательных к вычислительным ресурсам приложений P2P. Маршрутизатор со временем работает всё медленнее и перезапуск помогает только на короткое время. Симптомами могут быть:

  • Медленный веб-интерфейс или вообще не получается подключиться к веб-интерфейсу.
  • Замедленная передача данных, например, медленно загружаются страницы в браузере.
  • Маршрутизатор не отвечает на команду ping.
  • Сбои или самопроизвольные перезагрузки маршрутизатора.

Обычно виновниками являются тяжелые P2P-программы, такие как Emule, BitTorrent, uTorrent, Azureus, Shareaza или что-то подобное. Эти программы по умолчанию могут требовать большого количества сетевых соединений, что может привести к заполнению таблицы ip_conntrack маршрутизатора.

  • Особенно функция DHT BitTorrent отправляет тысячи пакетов UDP, которые быстро переполняют эту таблицу.

Это довольно распространенные проблемы, влияющие на большое число маршрутизаторов, работающих под управлением DD-WRT.

[edit] Термины и определения

P2P
Одноранговые (Peer to Peer) приложения. Может означать eMule, uTorrent, Azureus и т.п. В контексте данной статьи не подразумевается Skype или другие не требовательные P2P-приложения.
DD-WRT устройство
Маршрутизатор под управлением прошивки DD-WRT.
Веб-интерфейс
Инструмент управления и настройки прошивки DD-WRT по умолчанию. Откройте в браузере адрес http://192.168.1.1 (или другой заданный IP-адрес) и увидите веб-интерфейс.

[edit] Диагностика

Когда происходит такое замедление и маршрутизатор не отвечает ни на эхо-запросы команды ping, ни на запросы веб-интерфейса, вы всё равно можете проверить, что происходит:

  • Закройте все P2P и сетевые приложения и подождите несколько минут, чтобы прекратить все соединения.
  • Попробуйте использовать один из вариантов подключения к командной строке (SSH или Telnet) для связи с маршрутизатором.
    • Если это невозможно, перезагрузите устройство DD-WRT.
    • Проверьте, не вызвана ли ваша проблема соединениями TCP или UDP. Из командной строки:
cat /proc/sys/net/ipv4/netfilter/ip_conntrack_max
4096 # Здесь маршрутизатор отображает максимальное количество возможных подключений.
grep -c ^udp /proc/net/ip_conntrack
3693 # Открыто 3693 соединений по протоколу UDP
grep -c ^tcp /proc/net/ip_conntrack
115  # Открыто 115 соединений по протоколу TCP
cat /var/log/messages
  1. Сначала вы увидите сообщения 'full, dropping packet.', следующие за 'messages suppressed.'.
  2. В конце концов вы увидите журналы, подобные следующим:
<4>kernel: ip_conntrack: table full, dropping packet.
<4>kernel: NET: 15 messages suppressed.
<4>kernel: ip_conntrack: table full, dropping packet.
<4>kernel: NET: 12 messages suppressed.

[edit] Решение

После перезагрузки и выключения любых тяжелых приложений P2P:

  • Перейдите в веб-интерфейс устройства DD-WRT и войдите в систему.
  • Перейти в 'Administration' → 'Management'.
  • Введите следующие значения в 'IP Filter Settings':
    • Maximum Ports: 4096 (для модели с 8 МБ RAM установите значение не выше 1024)
    • TCP Timeout (s): от 300 до 900 секунд (чем выше, тем безопаснее, чем ниже, тем быстрее соединения будут сброшены из-за истечения времени ожидания, НИКОГДА НЕ УКАЗЫВАЙТЕ ЗНАЧЕНИЕ НИЖЕ 300 (5 минут) !!)
    • UDP Timeout (s): 30

IP Filter Settings на DD-WRT v24 SVN 12548

  • Сохраните настройки (кнопка Save Settings) и затем перезагрузите маршрутизатор (кнопка Reboot Router).

Приведенные выше настройки определяют, сколько времени потребуется, чтобы неактивные соединения TCP и UDP были забыты маршрутизатором. Если вы установите их слишком низкими, маршрутизатор слишком быстро забудет активные соединения, и они будут сброшены (прерваны).

  • Если вы начинаете получать частые отключения в определенных программах, но не в других (обычно это программы мгновенного обмена сообщениями), увеличьте TCP Timeout как минимум до 600 или более.

Если вам нужно на 15% больше доступной оперативной памяти RAM, можно отключить веб-интерфейс DD-WRT. Следующая инструкция может помочь маршрутизатору достичь теоретического максимума в 4096 портов:

  • Сначала убедитесь, что интерфейс командной строки включен. Таким образом, можно подключиться к устройству DD-WRT и снова включить веб-интерфейс при необходимости.
  • Затем выключите веб-интерфейс. Сделайте это через веб-интерфейс и примените изменения.
  • Если нужно включить веб-интерфейс, по мере необходимости используйте команду 'httpd'. Чтобы закрыть его позже, используйте команду 'killall httpd'.

На этом мы закончили. Если вы хотите ознакомиться с дополнительной технической информацией и техническими результатами, дополнительная информация представлена ​​ниже.

[edit] Увеличение максимального количества подключений за пределы доступного в веб-интерфейсе значения

Обратите внимание, что представленные здесь инструкции экспериментальные и могут поставить под угрозу стабильность работы маршрутизатора.

Из темы форума:

>> Вот решение для увеличения максимального количества соединений в прошивке с ядром 2.6:

Ядро K2.6 очень отличается в отношении параметра ip_conntrack_max (параметр IP Filter Maximum Ports в веб-интерфейсе) и его хэш-таблицы по сравнению с предыдущей версией ядра.

Параметр ip_conntrack_max устанавливает максимальное количество соединений, которые могут быть открыты одновременно. Большинство людей думают, что лучше уменьшить таймаут (по умолчанию 3600 секунд) для этих соединений (что приводит к другим проблемам) вместо увеличения максимального количества подключений.

На маршрутизаторах с большим объемом оперативной памяти (например, 64 МБ и выше) можно без проблем увеличить максимальное количество подключений в 10 раз по сравнению со значением по умолчанию, равным 4096.

Как я понимаю, также нужно увеличить размер хеш-таблицы hashsize, в которой они хранятся, чтобы извлечь выгоду из этого увеличения. В старых версиях ядра это было невозможно, так как нужно было задать это значение перед загрузкой маршрутизатора (но для этого не было параметра в NVRAM?).

В ядре K2.6 оба параметра можно изменять динамически в реальном времени без перезагрузки. Насколько я понимаю, размер хеш-таблицы hashsize, равный значению conntrack_max, имеет наилучшую производительность. Также, начиная с версии ядра K2.4.21, hashsize работает лучше всего со значением, равным степени 2, например, 214 = 16384 (ниже я использую это значение в качестве примера).


Начиная с ядра K2.4.23 (и новее), чтобы изменить параметр ip_conntrack_max используйте команду:

echo "16384" > /proc/sys/net/ipv4/netfilter/ip_conntrack_max

Начиная с ядра K2.6.20 (и новее), чтобы изменить параметр hashsize используйте команду:

echo "16384" > /sys/module/nf_conntrack/parameters/hashsize

Но ни одно из этих значений не будет сохранено после перезагрузки, т.к. они хранятся в оперативной памяти.


Изменить значение ip_conntrack_max так, чтобы оно сохранилось после перезагрузки, можно задав его в веб-интерфейсе или введя следующие команды в командной строке:

nvram set ip_conntrack_max=16384
nvram commit
reboot

Я не нашел способа навсегда изменить параметр hashsize. Хотя теперь в ядре K2.6 можно изменять его в режиме реального времени, вы можете просто добавить его в автоматически запускаемый сценарий.

echo "16384" > /sys/module/nf_conntrack/parameters/hashsize

[edit] Проверка результатов

Помимо очевидного улучшения производительности, есть способ проверить из командной строки технические результаты:

cat /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
90
cat /proc/sys/net/ipv4/netfilter/ip_conntrack_udp_timeout_stream
90


[edit] Часто упоминаемое устаревшее решение и современный эквивалент

Следующая команда часто рекомендуется на форумах, но применима только к более старым версиям прошивки DD-WRT до V23SP1:

echo '600 1800 120 60 120 120 10 60 30 120' > /proc/sys/net/ipv4/ip_conntrack_tcp_timeouts
echo '30 60' > /proc/sys/net/ipv4/ip_conntrack_udp_timeouts

Примечание. Приведенный выше метод для решения проблем медленной работы маршрутизатора не применим для прошивки DD-WRT v23 SP2 и более поздних версий. Кроме того, эта команда относится только к трафику TCP, а не UDP.

Ядро 2.4.23 более новых прошивок (V23SP2 и новее) игнорирует оба этих файла. Чтобы этот метод работал в более поздних ядрах, значения таймаутов должны быть помещены в отдельные файлы. Нужные файлы находятся в /proc/sys/net/ipv4/netfilter/, как показано ниже.

[edit] Как это работает

Мало кто знает, что на самом деле делает эта линия. Это список всех возможных состояний соединений TCP и их таймауты в секундах. Смотрите таблицу ниже (они представлены в правильном порядке):

Состояние Значение таймаута
NONE 10 минут
ESTABLISHED 30 минут (по умолчанию 5 дней)
SYN_SENT 2 минуты
SYN_RECV 60 секунд
FIN_WAIT 2 минуты
TIME_WAIT 2 минуты
CLOSE 10 секунд
CLOSE_WAIT 60 секунд (по умолчанию 12 часов)
LAST_ACK 30 секунд
LISTEN 2 минуты

Полный список файлов в каталоге /proc/sys/net/ipv4/netfilter/, который можно заполнить, чтобы получить тот же эффект на v23 SP2 и более поздних прошивках:

/proc/sys/net/ipv4/netfilter/ip_conntrack_generic_timeout
/proc/sys/net/ipv4/netfilter/ip_conntrack_icmp_timeout
/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_close
/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_close_wait
/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_syn_sent
/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_syn_recv
/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_fin_wait
/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_time_wait
/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_last_ack
/proc/sys/net/ipv4/netfilter/ip_conntrack_udp_timeout
/proc/sys/net/ipv4/netfilter/ip_conntrack_udp_timeout_stream

[edit] Скрипт

Следующий сценарий командной строки (скрипт) должен задать эти значения автоматически. Его можно установить, скопировав строки в раздел веб-интерфейса «Administration → Commands» и нажав кнопку Save Startup.

Переменная 'prefix' используется для экономии места в NVRAM.

prefix=/proc/sys/net/ipv4/netfilter/ip_conntrack

echo 600 > ${prefix}_generic_timeout
echo 30 > ${prefix}_udp_timeout
echo 60 > ${prefix}_udp_timeout_stream
echo 1800 > ${prefix}_tcp_timeout_established
echo 120 > ${prefix}_tcp_timeout_syn_sent
echo 60 > ${prefix}_tcp_timeout_syn_recv
echo 120 > ${prefix}_tcp_timeout_fin_wait
echo 120 > ${prefix}_tcp_timeout_time_wait
echo 10 > ${prefix}_tcp_timeout_close
echo 60 > ${prefix}_tcp_timeout_close_wait
echo 30 > ${prefix}_tcp_timeout_last_ack

[edit] AIM, ICQ и другие программы обмена мгновенными сообщениями

При использовании определенных программ обмена мгновенными сообщениями (IM-клиентов), таких как ICQ или AIM (или других приложений, которые не отправляют частые пакеты поддержки активности), нужно установить тайм-аут TCP в 300 или 600 секунд, чтобы помочь им оставаться на связи. Поскольку более высокие значения тайм-аута TCP могут вызвать зависания при работе с очень интенсивным P2P-трафиком, вы можете поэкспериментировать с этими значениями.

[edit] Дополнительная помощь

DD-WRT имеет встроенную функцию прокси-сервера, которая позволяет фильтровать содержимое HTML - файлы Cookie, ActiveX и т.п. Поскольку это оказывает большую нагрузку на маршрутизатор, можно отключить эту функцию, чтобы дать устройству DD-WRT больше времени для выполнения других обязанностей. Это можно сделать в разделе веб-интерфейса Security → Firewall.

К сожалению, эта функция имеет 3 ошибки:

  • При снятии всех 4-х флажков параметров фильтрующий прокси-сервер всё ещё может работать (возможно, потребуется перезагрузка).
  • При большой нагрузке прокси-сервер сбрасывает соединения.
  • Один из пользователей заметил: прокси, вероятно, запускает проверку трафика и на других портах, не только на 80, и, следовательно, замедляет работу приложений P2P (не подтверждено).

Решением является отключение брандмауэра (не рекомендуется) в разделе веб-интерфейса Security → Firewall. Это также может решить проблему медленной работы маршрутизатора.

(Такое поведение было замечено в DD-WRT v22 и v23. Пожалуйста, сообщите об этом разработчику и запишите в базу данных ошибок.)

[edit] Ошибка в старом маршрутизаторе Linksys WRT54G/S

Видимо, есть ошибка в маршрутизаторе Linksys WRT54GS v2.2. Эта ошибка связана с фатальной ошибкой доступа к памяти из-за разницы в тактовой частоте процессора и тактовой частоте на шине памяти. Эта ошибка приводит к разрыву соединений при передаче больших файлов. Новые версии прошивки Linksys разгоняют процессор до 216 МГц. Это можно исправить, войдя в маршрутизатор через SSH или Telnet и выполнив следующие команды:

nvram set clkfreq=216
nvram commit
reboot

При работе DD-WRT micro v23sp2 на маршрутизаторе WRT54G v5 тактовую частоту можно настроить, войдя в маршрутизатор через SSH или Telnet и выполнив следующие команды:

nvram set overclocking=216
nvram commit
reboot

После перезагрузки маршрутизатора нужно убедиться, что используется новая тактовая частота, проверив страницу Status веб-интерфейса DD-WRT или войдя в систему через Telnet и выполнив следующую команду:

nvram get clkfreq

[edit] Дополнительная помощь: настройте P2P-приложения

Для приложений P2P, и особенно для BitTorrent, проблема может заключаться в большом количестве входящих соединений. Попробуйте отключить DHT и установить ограничение на количество пиров и входящих соединений около 100. Смотрите страницу Azureus page для дополнительной информации.

[edit] Дополнительная помощь: установка радиатора

Потребительские бюджетные маршрутизаторы не предназначены для приложений с высокой нагрузкой. В них часто отсутствуют радиаторы на основных микросхемах для снижения цены и экономии места внутри. Они могут перегреваться при постоянном интенсивном сетевом трафике.

Установка радиаторов, подобных тем, которые используются в компьютерах, но меньших размеров, помогает решить эту проблему. Небольшое количество термопасты и цианоакрилата (химическое название для клеев вроде "супер-клея" SuperGlue, хотя клей гораздо лучшего качества можно найти в магазинах хобби и электроники, или в Интернете). Оставьте небольшое расстояние между радиатором и корпусом маршрутизатора.

Обратите внимание, что некоторые маршрутизаторы Linksys являются неразборными. Возможно, придется использовать клей или другие уродливые способы, чтобы собрать корпус после вскрытия.

[edit] Дополнительная помощь: Web Traffic Daemon на v24x

Если вы не можете попасть в веб-интерфейс и попытка настроить таймаут TCP ничего не дала, попробуйте отключить WAN Traffic Daemon. Известно, что это вызывает проблемы на маршрутизаторах D-Link DIR-300 с DD-WRT версиий до v24.

[edit] Известные проблемы с приложениями и операционными системами

Приложения
  • При использовании Steam (от компании Valve) обновление списка серверов может привести к перезагрузке маршрутизатора и сбросу настроек в значения по умолчанию, поскольку программа-клиент открывает много соединений. Можно решить эту проблему, выполнив действия, указанные на следующей странице поддержки Steam: https://support.steampowered.com/kb_article.php?ref=4487-YUOC-6922.

[edit] Список протоколов P2P

Также смотрите список протоколов P2P на странице Википедии List of P2P protocols (англ.).

applejuice
audiogalaxy (tcp)
ares (tcp)
bearshare (tcp)
bittorrent (tcp/udp)
directconnect (tcp)
edonkey (tcp/udp)
fasttrak/kazaa (tcp/udp)
freenet
gnucleuslan
gnutella (tcp)
goboogy
hotline
imesh
kugoo
mute (tcp)
napster (tcp)
openft (tcp)
pando (tcp)
soribada (tcp)
soulseek (tcp)
tesla
waste
winmx (tcp)
xdcc
xunlei (tcp/udp)