Форум: "Сети";
Текущий архив: 2005.02.27;
Скачать: [xml.tar.bz2];
Внизутечка ресурсов (TServerSocket) Найти похожие ветки
← →
Argentum (2004-11-06 18:19) [0]Происходит (предположительно) утечка системых ресурсов. После нескольких дней работы программы-сервера (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;
Что может быть?
← →
kaZaNoVa © (2004-11-06 18:43) [1]вроде как-то похожий вопрос был ..
> процесс SVCHOST начинает занимать 200MB в памяти
чем замеряли ?
надо Process Explorer"ом, Диспетчер задач может врать ...
← →
Piter © (2004-11-06 19:37) [2]kaZaNoVa © (06.11.04 18:43) [1]
вроде как-то похожий вопрос был ..
Угу. Заданный тем же автором. У него, наверное, хобби такое - вопросы задавать, а ответы не читать: http://delphimaster.net/view/6-1097675430/
← →
Argentum (2004-11-08 14:46) [3]Да-да, Шерлок Хомс. Я задавал такой вопрос.
Когда закрываешь все соединения, всё становится нормально. Врёт, не врёт Task Manager, не знаю, но критической точкой является SVCHost>200MB, после чего прога перестаёт нормально работать.
К сожалению дебаггить её в реальных условиях возможности нет :(
Неужели ни у кого не возникало подобной ситуации? Думаю, что ошибка именно в моём обработчике OnError.
← →
Verg © (2004-11-08 15:27) [4]
> Думаю, что ошибка именно в моём обработчике OnE
Нет. Ищи в другом месте.
← →
Piter © (2004-11-08 15:57) [5]Argentum (08.11.04 14:46) [3]
Да-да, Шерлок Хомс. Я задавал такой вопрос
ну вот и отлично. Почему бы не продолжить дискутировать там, зачем заводить еще одну ветку? К тому же, я тебе там задал вопросы, на которые ты так и не ответил.
Когда закрываешь все соединения, всё становится нормально
как закрываешь? Через массив Connections?
У тебя в обработчике CMClientError естьSocket.Close;
и это правильно. А в OnDisconnect есть такая строчка?
← →
Argentum (2004-11-08 16:14) [6]Ну, извини..
как закрываешь? Через массив Connections?
закрываю я соединения так:ServerSocket.Close;
А в OnDisconnect есть такая строчка?
в OnDisconnect нет такой строчки.
Я попробую добавить её, посмотрим что получится.
← →
Piter © (2004-11-08 16:20) [7]Попробуй, попробуй...
← →
Argentum (2004-11-26 17:41) [8]Вот и снова я, господа!
Извините, что не скоро ответил, просто не было возможности попробовать. Приходится тестировать на реально работающей системе;)
Итог - в случае возникновения ошибки, делаю клиентскому сокету Socket.Close, но проблемы это не решило. Все равно SVCHOST за несколько дней вырос до 75MB.
Перелопатил код, везде, где надо стоит теперь Socket.Close
Выводы - или я что-то сделал не так, или причина в чём-то ещё..
← →
TEXHAPb (2004-11-27 13:45) [9]В OnDisconnect Socket.Close вызывает повторное срабатывание OnDisconnect. Я так понимаю Socket.Close и вызывает OnDisconnect, т.е. это событие нормального закрытия сокета.
Так в чём же ещё может быть ошибка? Может она и не в сокетах вовсе. Но ведь если бы у меня был memory leak, тогда бы рос мой процесс, а не SVCHOST, так?
← →
Beglec (2004-11-28 21:17) [10]Работает сервер уже 2 года без передыху конектов дисконектов было море.
1. Была проблема с переполнением из-за частого disconnecta на системах из семейства Windows 9х. Проблема в самом Windows.
2. Windows XP решил эту проблема.
3. В твоем случает вообще косяк сдоровенный
Socket.Close - закрываешь сокет принудительно!!! Для клиента это по барабану, а сервер начинает некоторое время думать (5-10 минут) о том что же случилось с сокетом и только потом его принудительно отрубает. Опять же если у тебя на сервере не стоит нормальный обработчик ошибок то тогда переполнение понятно из-за чего идет.
Лучше испольщовать Socket.Disconnect - проверено работает все чики пуки.
← →
Beglec (2004-11-28 21:18) [11]Работает сервер уже 2 года без передыху конектов дисконектов было море.
1. Была проблема с переполнением из-за частого disconnecta на системах из семейства Windows 9х. Проблема в самом Windows.
2. Windows XP решил эту проблема.
3. В твоем случает вообще косяк сдоровенный
Socket.Close - закрываешь сокет принудительно!!! Для клиента это по барабану, а сервер начинает некоторое время думать (5-10 минут) о том что же случилось с сокетом и только потом его принудительно отрубает. Опять же если у тебя на сервере не стоит нормальный обработчик ошибок то тогда переполнение понятно из-за чего идет.
Лучше испольщовать Socket.Disconnect - проверено работает все чики пуки.
← →
Argentum (2004-12-20 20:12) [12]Спасибо всем!
А ошибка оказалась не в этом, а в TAPI.. :) Исправил.
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2005.02.27;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.088 c