![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
утечка ресурсов (TServerSocket) [D6, Win2k]
Argentum © (2004-11-06 18:19:00)Происходит (предположительно) утечка системых ресурсов. После нескольких дней работы программы-сервера (TSreverSocket) в Win2000 процесс SVCHOST начинает занимать 200MB в памяти. После перезапуска TSreverSocket, все опять становится нормально.
Часто происходят disconnect'ы клиентов. Думаю дело в этом.
Вот обработчик ServerSocket OnError:
procedure TCallManager.CMClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
var Msg:string;
begin
try
Socket.Close;
if Assigned(FCallManagerEvent) then
begin
case ErrorEvent of
eeGeneral: Msg:='General socket error';
eeSend: Msg:='Socket write error. Cannot write to socket';
eeReceive: Msg:='Socket read error. Cannot read from socket';
eeConnect: Msg:='Socket connection error.';
eeDisconnect: Msg:='Socket disconnection error';
eeAccept: Msg:='Socket accept error';
end;
Msg:=Msg+' '+Socket.RemoteAddress+' '+Socket.LocalHost+':'+IntToStr(Socket.LocalPort);
Msg:=Msg+' errorcode: '+IntToStr(ErrorCode);
end;
ErrorCode:=0;
except
end;
end;
Что может быть?
Argentum (2004-12-20 20:12:00) [1]Спасибо всем!
А ошибка оказалась не в этом, а в TAPI.. :) Исправил.
Beglec (2004-11-28 21:18:00) [2]Работает сервер уже 2 года без передыху конектов дисконектов было море.
1. Была проблема с переполнением из-за частого disconnecta на системах из семейства Windows 9х. Проблема в самом Windows.
2. Windows XP решил эту проблема.
3. В твоем случает вообще косяк сдоровенный
Socket.Close - закрываешь сокет принудительно!!! Для клиента это по барабану, а сервер начинает некоторое время думать (5-10 минут) о том что же случилось с сокетом и только потом его принудительно отрубает. Опять же если у тебя на сервере не стоит нормальный обработчик ошибок то тогда переполнение понятно из-за чего идет.
Лучше испольщовать Socket.Disconnect - проверено работает все чики пуки.
Beglec (2004-11-28 21:17:00) [3]Работает сервер уже 2 года без передыху конектов дисконектов было море.
1. Была проблема с переполнением из-за частого disconnecta на системах из семейства Windows 9х. Проблема в самом Windows.
2. Windows XP решил эту проблема.
3. В твоем случает вообще косяк сдоровенный
Socket.Close - закрываешь сокет принудительно!!! Для клиента это по барабану, а сервер начинает некоторое время думать (5-10 минут) о том что же случилось с сокетом и только потом его принудительно отрубает. Опять же если у тебя на сервере не стоит нормальный обработчик ошибок то тогда переполнение понятно из-за чего идет.
Лучше испольщовать Socket.Disconnect - проверено работает все чики пуки.
TEXHAPb (2004-11-27 13:45:00) [4]В OnDisconnect Socket.Close вызывает повторное срабатывание OnDisconnect. Я так понимаю Socket.Close и вызывает OnDisconnect, т.е. это событие нормального закрытия сокета.
Так в чём же ещё может быть ошибка? Может она и не в сокетах вовсе. Но ведь если бы у меня был memory leak, тогда бы рос мой процесс, а не SVCHOST, так?
Argentum (2004-11-26 17:41:00) [5]Вот и снова я, господа!
Извините, что не скоро ответил, просто не было возможности попробовать. Приходится тестировать на реально работающей системе;)
Итог - в случае возникновения ошибки, делаю клиентскому сокету Socket.Close, но проблемы это не решило. Все равно SVCHOST за несколько дней вырос до 75MB.
Перелопатил код, везде, где надо стоит теперь Socket.Close
Выводы - или я что-то сделал не так, или причина в чём-то ещё..
Piter (2004-11-08 16:20:00) [6]Попробуй, попробуй...
Argentum (2004-11-08 16:14:00) [7]Ну, извини..
как закрываешь? Через массив Connections?
закрываю я соединения так:
ServerSocket.Close;
А в OnDisconnect есть такая строчка?
в OnDisconnect нет такой строчки.
Я попробую добавить её, посмотрим что получится.
Piter (2004-11-08 15:57:00) [8]Argentum (08.11.04 14:46) [3]
Да-да, Шерлок Хомс. Я задавал такой вопрос
ну вот и отлично. Почему бы не продолжить дискутировать там, зачем заводить еще одну ветку? К тому же, я тебе там задал вопросы, на которые ты так и не ответил.
Когда закрываешь все соединения, всё становится нормально
как закрываешь? Через массив Connections?
У тебя в обработчике CMClientError есть
Socket.Close;
и это правильно. А в OnDisconnect есть такая строчка?
Verg (2004-11-08 15:27:00) [9]
> Думаю, что ошибка именно в моём обработчике OnE
Нет. Ищи в другом месте.
Argentum (2004-11-08 14:46:00) [10]Да-да, Шерлок Хомс. Я задавал такой вопрос.
Когда закрываешь все соединения, всё становится нормально. Врёт, не врёт Task Manager, не знаю, но критической точкой является SVCHost>200MB, после чего прога перестаёт нормально работать.
К сожалению дебаггить её в реальных условиях возможности нет :(
Неужели ни у кого не возникало подобной ситуации? Думаю, что ошибка именно в моём обработчике OnError.
Piter (2004-11-06 19:37:00) [11]kaZaNoVa © (06.11.04 18:43) [1]
вроде как-то похожий вопрос был ..
Угу. Заданный тем же автором. У него, наверное, хобби такое - вопросы задавать, а ответы не читать: http://www.delphimaster.ru/cgi-bin/forum.pl?id=1097675430&n=4
kaZaNoVa (2004-11-06 18:43:00) [12]вроде как-то похожий вопрос был ..
> процесс SVCHOST начинает занимать 200MB в памяти
чем замеряли ?
надо Process Explorer'ом, Диспетчер задач может врать ...