Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > 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 и написал ![]() в коде - ничего особенного, создаю 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ой ветке есть:
|
Автор: Nuclon 29.12.2008, 13:24 |
Ramirez, ну у мну сервер на 6.2, и поставить семёрку я туда не могу. в шестой ветке таких настроек нету, да. Если есть идеи, что можно подкрутить в шестёрке - буду рад |
Автор: Ramirez 30.12.2008, 10:33 | ||
В шестерке я бы попробовал:
"максимальное время жизни сегмента (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 | ||||
сейчас не работает может быть так http://unixforum.org.ua/index.php?topic=10055.0 :
|
Автор: Nuclon 30.12.2008, 11:45 |
это пробовал. безрезультатно. |