Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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.035 c
6-1096457916
Наташа
2004-09-29 15:38
2004.12.05
Как можно скачать файл при помощи IdHTTP ?


14-1099820385
Piter
2004-11-07 12:39
2004.12.05
Редакторы ресурсов


3-1099983146
denis24
2004-11-09 09:52
2004.12.05
редактирование в гриде


4-1098463382
Cheburek
2004-10-22 20:43
2004.12.05
Drag &amp; Drop имён файлов из моего приложения в проводник?


14-1100598102
sweetk
2004-11-16 12:41
2004.12.05
Как обойти дст?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский