Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.27;
Скачать: CL | DM;

Вниз

утечка ресурсов (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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.038 c
6-1103017032
Ivolg
2004-12-14 12:37
2005.02.27
Прекачка!


1-1108363229
Piero
2005-02-14 09:40
2005.02.27
_isres32.dll


14-1107851510
uw
2005-02-08 11:31
2005.02.27
Eclipse не запускается


3-1106739472
LLineser
2005-01-26 14:37
2005.02.27
Ibase Events вопрос другой


1-1108221983
Massiv
2005-02-12 18:26
2005.02.27
Шрифт