Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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.035 c
3-1106892093
PQR
2005-01-28 09:01
2005.02.27
Interbase


14-1107950398
Cheater
2005-02-09 14:59
2005.02.27
Проблема с запуском DVD


4-1105897188
msn777
2005-01-16 20:39
2005.02.27
Как бороться с “thread creation error: Недостаточно памяти для...


1-1108069505
bot v0.00000001
2005-02-11 00:05
2005.02.27
дробная часть


1-1108224281
TeNY
2005-02-12 19:04
2005.02.27
как правильно использовать функцию EnumResourceNames





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский