Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > POE::Component::Client::HTTP, FIN_WAIT_2 коннекты


Автор: Nuclon 24.11.2008, 17:41
Непонятная загвоздка с POE::Component::Client::HTTP

Программа обходит большое количество ссылок. Работает нормально в течении первого часа или вроде того. После этого netstat показывает большое количество FIN_WAIT_2 соединений. При этом любая попытка создания запроса возвращает сразу

500 Internal Server Error
Cannot connect to somehost.com:80 (connect error 60: Operation timed out)


Подозреваю, что POE::Component::Client::Keepalive считает сокеты в таком состоянии рабочими и пытается послать запросы туда.

Ось - FreeBSD 6.

Кто виноват и что делать?

Автор: n4n0bit 24.11.2008, 19:04
Cтатуса FIN_WAIT_2 говорит о полузакрытом соединении на другой стороне. 
 Может это поможетhttp://www.google.com.by/search?hl=be&client=firefox-a&rls=org.mozilla%3Aen-US%3Aunofficial&hs=16d&q=POE+connect+error+60%3A+Operation+timed+out&btnG=Шукаць&meta=

ps: Соединение с FIN_WAIT_2 статусом исчезнит через 10 минут и 75 секунд если верить Стивинсону ( такова реализация в *BSD ) TCP модуль насильно переведет в состояние CLOSE .

Автор: Nuclon 24.11.2008, 22:25
n4n0bit, ну, допустим, в гугле я уже искал, что такое FIN_WAIT_2 знаю.
про 10 минут и 75 секунд - это неправда - некоторые FIN_WAIT_2 висели по несколько часов и больше, хотя может в теории такого быть и не должно.

вопрос был, как заставить POE::Component::Client::HTTP работать с этой особенностью - то ли скидывать сокеты в CLOSE сразу, то ли сразу убирать сокеты из пула.

Автор: n4n0bit 24.11.2008, 22:51
Ну код бы увидеть.

ps: ты линк на гугл сморел про POE ??? там есть линк в первых страницах на perlmonks с твоей проблемой

Автор: Nuclon 25.11.2008, 12:06
n4n0bit, более того - это я на perlmonks и написал smile там автор POE подсказал, что выставить для сокета, сейчас буду играться... и пробовать делать test-case.

в коде - ничего особенного, создаю Client::HTTP с дефолтными значениями, и засылаю ему боо-о-ольшой список запросов (около 10.000 позиций), в обработчике вытягиваю нужную инфу и, если ошибка, перезапрашиваю урл снова.

как решение проблемы, конечно, заюзать Client::UserAgent, но работать, чую, будет медленней из-за создания нового подключения для каждого запроса


Автор: n4n0bit 25.11.2008, 17:15
Заюзай тогда Socket.pm 

Автор: hellman 27.12.2008, 16:13
Нашли какиое нибудь решение? А то сейчас столкнулся с точно такой же проблемой. А переписвать все под Socket совсем не хочется.

Автор: gcc 28.12.2008, 07:54
на сервер скорее всего запрещено посылать "кривые" пакеты навереное, с отсутсвием каких-то важных заголовков

Автор: Nuclon 29.12.2008, 11:02
hellman, решение временное и нехорошее - заюзал POE::Component::Client::UserAgent.

сейчас стараюсь найти свободное время и написать case, чтобы продемострировать проблему создателю либы POE и POE::Component::Client::HTTP.

Автор: Ramirez 29.12.2008, 13:22
мне кажется, это не проблема POE.
Я бы порекомендовал потюнить tcp стек freebsd.
например в 7ой ветке  есть:
Код

net.inet.tcp.fast_finwait2_recycle
net.inet.tcp.finwait2_timeout 



Автор: Nuclon 29.12.2008, 13:24
Ramirez, ну у мну сервер на 6.2, и поставить семёрку я туда не могу.
в шестой ветке таких настроек нету, да. Если есть идеи, что можно подкрутить в шестёрке - буду рад

Автор: Ramirez 30.12.2008, 10:33
В шестерке я бы попробовал:
Код

net.inet.tcp.msl


"максимальное время жизни сегмента (Maximum Segment Life - MSL) - максимальное время ожидания ASK в ответ на SYN-ACK или FIN-ACK (миллисекунд). По RFC 753 оно 120 секунд. Но это писалось в 1979 году и многое поменялось. В современных FreeBSD оно равно 30 секунд. Имеет смысл поставить его меньше"

вот полезное чтиво по тюнингу tcp/ip во фре:
http://www.opennet.ru/base/net/tune_freebsd.txt.html
и немного про sysctl:
http://www.lissyara.su/?id=1147

Автор: gcc 30.12.2008, 10:55
Цитата(Ramirez @ 30.12.2008,  10:33)
http://www.lissyara.su/?id=1147

сейчас не работает

может быть так http://unixforum.org.ua/index.php?topic=10055.0 :
Код

   sysctl -w net.inet.ip.fw.dyn_keepalive=0





Автор: Nuclon 30.12.2008, 11:45
Цитата(gcc @  30.12.2008,  10:55 Найти цитируемый пост)
   sysctl -w net.inet.ip.fw.dyn_keepalive=0

это пробовал. безрезультатно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)