Зависание TIdHttpServer

Обсуждаются как существующие проекты (перевод документации, информационная система и т.п.), так и создание новых.

Модератор: Модераторы

Зависание TIdHttpServer

Сообщение anzo » 07.12.2009 21:53:59

Здравствуйте. Конечно у меня вопрос не совсем по FreePascal и не по Lazarusu. Однако темы близкие. И на этом форуме, очень осведомленные профы обитают! Да и ниже описанную проблему надо решать, в будущем планируется перенести проект на lazarus.

Задача следующего характера.
Разработан программный комплекс (DELPHI 7+Indy10+FastMM), где есть несколько программ.
Программы обмениваются данными между собой по средвам HTTP.
Передача организована с помощью TIdHttp и TIdHttpServer.
Одна из программ представляет собой сервер печати,обслуживает различное печатающее оборудование.
Архитектура программы следующая.
На главной форме лежит TIdHttpServer - слушает запросы.
Есть еще поток, в конструкторе которого создается TIdHttp, и в execute раз в минуту
делает запрос на главный сервер с целю получить конфигурацию оборудования.
Так же для каждого печатающего устройства работает поток, обслуживающий печать на нем.
Обмен данными между потоками происходит с помощью специальных потокобезопасных объектов.
Утечек памяти нет, очевидных ошибок так же нет.
Все работает достаточно стабильно. Но у одного из клиентов раз в месяц на одной из машин
(программа работает на 10 машинах по 20 часов в сутки) происходит следующая ситуация.
При постановке задачи печати зависает соединение клиентской программы и сервера печати.
То, есть клиент делает запрос, а на сервере в INDY логе даже намека нет, что кто-то подключился,
HTTPServerCommandGet не срабатывает.
Клиентская программа зависает (пока таймаут соединения не сработает).
Если в момент зависания закрыть сервер печати, то он корректно закрывается (ни каких Exception'ов).
А в программе клиенте в зависшем запросе возникает исключение "Connection closed gracefully". То есть
соединение было корректно разорвано на сервере.

Дополнительная информация к размышлению.
Зависание происходит, когда программа клиент и сервер печати находятся на одной машине.
(Возможно из-за редкости ошибки она просто не проявила себя в распределенном варианте).
Сервер печати - это Delphi программа сворачиваемая в трей с помощью TCoolTrayIcon.
(Слышал, что тоже как-то на работу многопоточных программ влияет).

В общем нужна помощь... Сам по-видимому не осилю проблему.
Есть мысли, что как то друг другу мешают TIdHttp и TIdHttpServer, так это или не так?
anzo
новенький
 
Сообщения: 28
Зарегистрирован: 09.07.2009 10:53:46

Re: Зависание TIdHttpServer

Сообщение Mr.Smart » 07.12.2009 22:14:35

anzo
По описанию полная сумеречная зона :wink:
Вообще Indy не пользуюсь предпочитаю всё реализовывать на Synapse. Менее глючное и более прозрачное...
А возможны ситуации "гонок"? Когда один поток захватил ресурс и не отдаёт его? Других вариантов пока не вижу.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Зависание TIdHttpServer

Сообщение anzo » 07.12.2009 23:19:35

На счет Indy, как черного ящика согласен. Однако, я на нем не первый проект реализовал и до этого он меня не подводил.
На счет гонок скорее всего нет, только если в самой INDY. В тепличных условиях (у себя в офисе) проводил нагрузочные испытания: несколько десятков потоков, с высокой интенсивность запросов, единственное, что было замечено это заканчивались свободные порты, но это уже проблема ОС, и правится конфигом.
Смущает в ошибке, то что когда клиентская программа висит, а сервер закрыть, он нормально завершает работу, то есть все порожденные потоки закрываются без ошибок. Если бы где-то было зависание в критической секции, то зависший поток нормально не завершился бы.
А вот клиент ждет ответа, и если закрыть сервер, выдает исключение Closed gracefully.
Может мне, кто подскажет как "снять" состояние сервера на момент зависания..., то есть в каком состоянии находятся потоки.
anzo
новенький
 
Сообщения: 28
Зарегистрирован: 09.07.2009 10:53:46

Re: Зависание TIdHttpServer

Сообщение anzo » 09.12.2009 11:51:05

Заметил еще одну закономерность.
Зависание происходит, когда отваливается сетка.
Убрал поток, который конектится к главному серверу.
Зависания вроде как прекратились. Думаю из-за чего там могло зависать. В этом потоке раз в 30 секунд делается запрос на сервер с помощью IdHttp.
А перед HTTP запросом я пингую сервак с помощью TIdIcmpClient.
Может TIdIcmpClient зависает?
....
Еще заметил, что с других IP шников конектится, зависает только соединение с локального IP
anzo
новенький
 
Сообщения: 28
Зарегистрирован: 09.07.2009 10:53:46

Re: Зависание TIdHttpServer

Сообщение Cheb » 23.02.2010 19:07:04

Когда отваливается сетка, вызовы совершенно невинных, вроде бы, системных функций могут "задумываться" невероятно надолго - пока у них тайм-аут в потрохах не случится.

У меня такой опыт был: использовал php библиотеку, читавшую RSS другого сайта и отображавшую часть новостей у нас на портале. Причём, ей был напрямую выставлен тайм-аут в две секунды, если соединения нет. Всё работало пока не стал периодически отваливаться DNS - и вот тут-то наша главстраница начала виснуть при открытии секунд на сорок, если вообще открывалась. Оказалось, против лома (т. е. не удаётся определить IP по урлу) никакие меры предосторожности не помогают.

Мне пришлось сделать такой изврат, что на чужой сайт лазит не сама страница, а невидимый айфрейм в ней, пишет результат в файл, и уже этот файл инклюдится главстраницей при следующем заходе. Изврат ещё тот, но как ещё бороться с этими сетевыми функциями?
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34


Вернуться в Разное

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

Рейтинг@Mail.ru