Маршрутизатор тормозит
From DD-WRT Wiki
English • Deutsch • Español • Français • Italiano • 日本語 • Polski • Português • Русский • Svenska • 中文(中国大陆) • 中文(台灣) • |
[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
- Также можно посмотреть сообщения системного журнала syslog:
cat /var/log/messages
- Сначала вы увидите сообщения 'full, dropping packet.', следующие за 'messages suppressed.'.
- В конце концов вы увидите журналы, подобные следующим:
<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
- Сохраните настройки (кнопка 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)