Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

утечка ресурсов (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'ом, Диспетчер задач может врать ...


Наверх

Титульная страница Поиск, карта сайта Написать письмо