Форум: "Сети";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];
ВнизЗагрузка ЦП: 100% Найти похожие ветки
← →
Геннадий (2004-09-24 08:11) [0]Мой вопрос теоритический, так как даже не знаю, как его чётко сформулировать. При использовании компонент для сетевой (клиент-серверной) работы, загрузка процессора резко возрастает (во время работы приложения). Причём, если приложение получает информацию, обрабатывает и шлёт ответ (по логу эти события видны), то загрузка, наоборот, падает. А в момент простоя приложения - загрузка процессора под 100%. Если запустить на двупроцессорной платформе, то 25%. Причём такое случалось и с Indy-компонентами, и с компонентами сторонних производителей (то есть, моих деловых партнёров). Здесь я думаю исключительно на своё незнание какого-либо момента в программированиии. В связи с чем появляется вопрос, что вообще (теоритически) способно вызывать такое явление?
← →
Polevi © (2004-09-24 09:25) [1]while not Terminated do Sleep(0) к примеру
← →
Digitman © (2004-09-24 09:29) [2]каждый процесс, вне зависимости от того какие задачи он решает, в каждый момент времени находится в одном из 2-х режимов - kernel-mode или user-mode .. суммарное время работы процесса (с момента старта) в том или ином режиме контролируется ядром ОС - это т.н. kernel-time и user-time
в kernel-mode ядро ОС не выделяет процессу квантов времени, в user-mode же выделяет (в соответствии уровнями приоритетов кодовых потоков процесса)
т.н. "нагрузка" процессора растет, если суммарное время user-time существенно превышает суммарное kernel-time, и наоборот снижается, когда kernel-time превышает user-time
под kernel-mode подразумеваются моменты исполнения вызовов трэдами процесса API-ф-ций ожидания сообщений и ожидания срабатывания объектов синхронизации, а так же ф-ций задержки/приостановки трэдов.. когда все трэды процесса находятся в kernel-mode, user-time не растет, зато растет kernel-time ... когда хотя бы один трэд процесса нажодится в user-mode, user-time растет
"нагрузка" процессора для данного процесса в любой момент времени м.б. оценена по приблиз.формуле : 100 * user-time / (kernel-time + user-time)... из формулы видно, что значение "нагрузки" пропорционально значению user-time
иллюстрация :
1.
while True do;
такой пустой бесконечный цикл приводит к росту "нагрузки" вплоть до 100% (зависит от работы системного планировщика трэдов)
2.
while True do sleep(Х);
цикл так же бесконечен, но в его теле постоянно вызывается ф-ция задержки, приводящая к переключению в kernel-mode на время Х, при этом трэд не квантуется и "нагрузка" соответственно падает
← →
Геннадий (2004-09-24 10:01) [3]В приложении есть циклы (работают до некоторого события или таймаута), которые (судя по всему) и приводят к такой загрузке ЦП. Нужно делать примерно так:
T:= GetTickCount;
while GetTickCount - T < 10000 do
begin
Application.ProcessMessages;
Sleep(1);
end;
← →
Polevi © (2004-09-24 10:12) [4]>Геннадий (24.09.04 10:01) [3]
не надо так делать
← →
Anatoly Podgoretsky © (2004-09-24 10:16) [5]Надо использовать объекты синхронизации, а не разогревать процессор.
← →
Digitman © (2004-09-24 10:34) [6]
> Геннадий
тебе что, задержку нужно осуществить ? для каких целей, в каком контексте она используется тобой ?
← →
Геннадий (2004-09-25 09:38) [7]> Digitman © (24.09.04 10:34) [6]
Дело в том, что при отключении (имеется в виду сетевое отключение моего клиента), нужно убедиться в том, что оно действительно произошло. На само отключении уходит когда 1 ms, а когла и минута. Так как заранее не известно сколько времени придёться ждать и при этом вечно ждать нельзя, я ввожу таймаут (~1 мин). Реализуется это так:
xxxxClient.Disconnect;
T:= GetTickCount;
while xxxxClient.Connected do
begin
Application.ProcessMessages;
Sleep(1);
If GetTickCount - T > 60000
then begin
raise Exception.Create("Timeout");
end;
end;
Polevi © (24.09.04 10:12) [4]
А почему? Загрузка ЦП упала до нуля! :)
← →
atruhin © (2004-09-25 11:05) [8]>>Дело в том, что при отключении (имеется в виду сетевое отключение >>моего клиента), нужно убедиться в том, что оно действительно >>произошло.
И как же ты в этом убеждаешся? Если ты отключаешь клиента то куда ему деться? От проблем с сетью этот код тебя не защитит.
← →
Геннадий (2004-09-25 11:31) [9]atruhin © (25.09.04 11:05) [8]
:) Дело в том, что вот казалось бы - куда ему деваться?! А этот гадёнышь может и не отключиться! Компонента - левая (SMPPClient), заменить не могу - не на что. Так что приходиться проверять...
← →
Digitman © (2004-09-27 09:51) [10]
> Геннадий
> Компонента - левая (SMPPClient),
и ты, конечно, ведать не ведаешь, в каком режиме он работает - синхронном или асинхронном ? и исх.текстов нет ?
а что, кстати, страшного происходит, если сразу после Disconnect ты продолжишь дальнейшие действия, не дожидаясь чего-то ?
← →
Геннадий (2004-09-27 15:48) [11]
> и ты, конечно, ведать не ведаешь, в каком режиме он работает
> - синхронном или асинхронном ? и исх.текстов нет ?
Угу.
> а что, кстати, страшного происходит, если сразу после Disconnect
> ты продолжишь дальнейшие действия, не дожидаясь чего-то ?
А какой смысл переподключаться, если не произойдёт отключение?
← →
Digitman © (2004-09-27 15:55) [12]
> Геннадий
события-то есть какие-нибудь у этого компонента ?
что-то вроде OnConnect ? OnDisconnect ?
← →
Геннадий (2004-09-28 10:33) [13]2 Digitman © (27.09.04 15:55) [12]
Конечно! Только вот они не всегда срабатывают. Например, если на серверной стороне что-то случится - событие OnDisconnect может и не сработать. :(
← →
Digitman © (2004-09-28 10:57) [14]
> если на серверной стороне что-то случится
так ведь если уж там что-то случилось, то тебе никакое "ожидание" и никакой повторный коннект не помогут !
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.04 c