Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / пустой Service кушает до 15% ресурсов CPU / 25 сообщений из 166, страница 1 из 7
14.03.2021, 15:04
    #40053303
yemets63
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пустой Service кушает до 15% ресурсов CPU
почему нагрузка на CPU 10 - 15%.
показываю пустой Service, он работает, и он как полный с моим функционалом, так и пустой кушат 10-15% CPU, и максимально потребляет энергию по GPU и CPU.
я может не знаю, может какие то ключи надо поставить
антивирусником все прогнал, службу в исключения внес, служба запускается, могу остановить, перезапустить. к функционалу службы вопросов нет.

вот текст:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  ServiceApplication.Controller(CtrlCode);
end;

function TServiceApplication.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;

procedure TServiceApplication.ServiceExecute(Sender: TService);
begin
  while terminated = false do
  begin
    ServiceThread.ProcessRequests(false);
  end;
end;

procedure TServiceApplication.ServiceStart(Sender: TService;
  var Started: Boolean);
begin
  Started := true;
end;

procedure TServiceApplication.ServiceStop(Sender: TService;
  var Stopped: Boolean);
begin
  Stopped := true;
end;
...
Рейтинг: 0 / 0
14.03.2021, 15:20
    #40053305
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пустой Service кушает до 15% ресурсов CPU
А ведь тебя предупреждали не пользоваться ProcessMessages и компанией...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.03.2021, 15:21
    #40053306
asutp2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пустой Service кушает до 15% ресурсов CPU
yemets63,

добавь Sleep(100) после ProcessRequests
...
Рейтинг: 0 / 0
14.03.2021, 15:34
    #40053307
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пустой Service кушает до 15% ресурсов CPU
yemets63,

так это, цикл
Код: pascal
1.
2.
3.
4.
  while terminated = false do
  begin
    ServiceThread.ProcessRequests(false);
  end;



шарашит без перерыва, и на 100% грузит одно ядро. Ничего удивительного. imho то же самое, что в бесконечном цикле зарядить
a:=a + 0;
...
Рейтинг: 0 / 0
14.03.2021, 15:35
    #40053308
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пустой Service кушает до 15% ресурсов CPU
yemets63
Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure TServiceApplication.ServiceExecute(Sender: TService);
begin
  while terminated = false do
  begin
    ServiceThread.ProcessRequests(false);
  end;
end;



Что это за д. вечный цикл? Зачем вообще этот бред?
...
Рейтинг: 0 / 0
14.03.2021, 16:21
    #40053317
yemets63
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пустой Service кушает до 15% ресурсов CPU
цикл стоит для примера, к сожалению не могу показать полный текст функционала, хотя отдельно функционал не грузит проц вообще, а как вставляю в Execute так 14%. в нем нет зацикливаний.
сижу по шагам проверяю поведение функционала в Service.
...
Рейтинг: 0 / 0
14.03.2021, 16:33
    #40053320
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пустой Service кушает до 15% ресурсов CPU
yemets63
отдельно функционал не грузит проц вообще
Проц грузит постоянный вызов "функционала" в бесконечном цикле.
Просто while True do; будет грузить точно так же.
...
Рейтинг: 0 / 0
14.03.2021, 16:37
    #40053321
yemets63
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пустой Service кушает до 15% ресурсов CPU
когда вырезал код, немного ошибся,

asutp2, спасибо за sleep

я даже убрал Timer который мне не особо был нужен, и вставил в цикл, чего не было, но вставил в пример,
в итоге, еле-еле службу нашел, 0% и работает очень даже классненько, раздает и получает, слышить и посылает, и всегда CPU=0%.

Код: plsql
1.
2.
3.
4.
5.
6.
  while not Terminated do 
  begin
    ... функционал
    ServiceThread.ProcessRequests(true); 
    sleep(100);
  end;
...
Рейтинг: 0 / 0
14.03.2021, 16:40
    #40053322
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пустой Service кушает до 15% ресурсов CPU
yemets63
когда вырезал код, немного ошибся,

asutp2, спасибо за sleep

я даже убрал Timer который мне не особо был нужен, и вставил в цикл, чего не было, но вставил в пример,
в итоге, еле-еле службу нашел, 0% и работает очень даже классненько, раздает и получает, слышить и посылает, и всегда CPU=0%.

Код: plsql
1.
2.
3.
4.
5.
6.
  while not Terminated do 
  begin
    ... функционал
    ServiceThread.ProcessRequests(true); 
    sleep(100);
  end;

Вообще да, чем больше sleep-ов в коде - тем меньше процесс жрет процессор. Можно их еще превентивно расставлять между строками алгоритмов.
...
Рейтинг: 0 / 0
14.03.2021, 16:45
    #40053324
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пустой Service кушает до 15% ресурсов CPU
yemets63цикл стоит для примера,

А вставка Sleep() в несуществующий цикл помогла. Чудны дела твои...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.03.2021, 16:49
    #40053326
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пустой Service кушает до 15% ресурсов CPU
YuRock> Можно их еще превентивно расставлять между строками алгоритмов.


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.03.2021, 20:55
    #40053379
asutp2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пустой Service кушает до 15% ресурсов CPU
YuRock
Вообще да, чем больше sleep-ов в коде - тем меньше процесс жрет процессор. Можно их еще превентивно расставлять между строками алгоритмов.
Видимо ты забываешь, что речь идет о сервисе , центральным потоком, с точки зрения реализации в делфи, является ServiceExecute. Единократный вызов sleep в каждом шаге while это весьма сбалансированное решение, и оно также отлично работает и при реализации демонов для линуса.

А если считаешь, что использование Sleep() в связке ProcessRequests является неправильным решением для уменьшения нагрузки на проц внутри ServiceExecute, тогда расскажи свое, "правильное". Будет весьма интересно услышать, как в главном потоке без UI и минимальным внешним воздействием от ОС на сервис ты разруливаешь дележку проца)))))
...
Рейтинг: 0 / 0
14.03.2021, 21:20
    #40053383
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пустой Service кушает до 15% ресурсов CPU
asutp2
YuRock
Вообще да, чем больше sleep-ов в коде - тем меньше процесс жрет процессор. Можно их еще превентивно расставлять между строками алгоритмов.
Видимо ты забываешь, что речь идет о сервисе , центральным потоком, с точки зрения реализации в делфи, является ServiceExecute. Единократный вызов sleep в каждом шаге while это весьма сбалансированное решение, и оно также отлично работает и при реализации демонов для линуса.

А если считаешь, что использование Sleep() в связке ProcessRequests является неправильным решением для уменьшения нагрузки на проц внутри ServiceExecute, тогда расскажи свое, "правильное". Будет весьма интересно услышать, как в главном потоке без UI и минимальным внешним воздействием от ОС на сервис ты разруливаешь дележку проца)))))


1. Я никогда не использую ServiceExecute. В ServiceStart я запускаю свой поток, в ServiceStop - убиваю его.
2. Что такое ProcessRequests - я вообще не знаю, да и знать не хочу.
Ну это всё мои предпочтения. Не претендую на единственно правильные решения.

Вот самое главное.
Любой поток должен либо выполнять задачу, либо ждать сигнала, после которого либо завершаться, либо начинать выполнять очередную задачу. Для Sleep тут места нет.
Sleep допустимо применять в 3 случаях:
- Для осознанной передачи управления другому потоку (бывает такая необходимость) - Sleep( 0 );
- Для тестовых программ;
- Для программ типа такой:

Код: pascal
1.
2.
3.
4.
5.
6.
program pause;
uses Windows, SysUtils;
begin
  if ParamCount > 0 then
    Sleep( StrToIntDef( ParamStr( 1 ), 0 ) * 1000 );
end.
...
Рейтинг: 0 / 0
14.03.2021, 23:40
    #40053404
yemets63
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пустой Service кушает до 15% ресурсов CPU
и так в продолжении, теперь уже SLEEP
SLEEP- кстати чудная штука,
в моем SERVICE я попробовал 2 решения, свои потоки и ServiceExecute с использованием sleep,
мне всё одинаково, но ServiceExecute нравится больше.

и так о SLEEP, почему это чудная, парадоксальная и полезная штука.
году в 2004, тогда первые проекты огромные были, и я очень любил и люблю трехзвенку, и тогда уже года 4 был на DEVART, не помню как они тогда назывались, начал внедрять рабочую систему в Воркуте и на севере. Разработка нашей команды и уже пару лет проработавшая в центральном регионе России. Проблем до Воркуты не было.
Но там, на севере было что то, не то спутники советские, не то интернет за счет динамомашин, а трехзвенка любит постоянный коннект. скорость низкая и постоянные паузы. что делать? Проверять обрыв коннекта, сздавать и восстанавливать транзакции, или делать пакеты для локальной работы потом их гонять и сохранять, или искать другие решения...?
В итоге поехал я на север решать проблемы, Мирный, Архангельск, и т.д., да еще и зимой, и когда стал совсем замерзать, решил попробовать между вызовом метода сервера и использованием ClientDataSet вставлять sleep и всё это завернул в потоки. Так вот, при 256 Кбит с нестабильной связью это все ЗАработало. значением Sleep можно было управлять.
До 2011 года работа приложений-клиентов с серверов-прилоений была безупречно, ну и функционал тоже, потом потеряли контакт с заказчиком, смена хозяина, другие правила бизнеса, "грёбанные" торги...

так что sleep полезная вещь!
...
Рейтинг: 0 / 0
14.03.2021, 23:56
    #40053408
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пустой Service кушает до 15% ресурсов CPU
yemets63
а трехзвенка любит постоянный коннект

Тут некоторые люди переходят на "трехзвенку" из-за того, что не нужен постоянный коннект...
...
Рейтинг: 0 / 0
15.03.2021, 00:11
    #40053409
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пустой Service кушает до 15% ресурсов CPU
yemets63
когда стал совсем замерзать, решил попробовать между вызовом метода сервера и использованием ClientDataSet вставлять sleep и всё это завернул в потоки. Так вот, при 256 Кбит с нестабильной связью это все ЗАработало. значением Sleep можно было управлять.
Я и говорю - использование Sleep как можно чаще - снижает нагрузку на железо, а сэкономленную таким образом электроэнергию можно использовать для обогрева окружающей среды, чтоб не замерзать.
...
Рейтинг: 0 / 0
15.03.2021, 00:18
    #40053410
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пустой Service кушает до 15% ресурсов CPU
YuRock1. Я никогда не использую ServiceExecute. В ServiceStart я запускаю свой поток, в ServiceStop - убиваю его.
воистину!
Кстати, я нашел аналогичное обсуждение, 5-летней давности, там такому же автору настучали канделябром.
https://stackoverflow.com/questions/33625164/service-application-in-delphi

Собственно, мораль такая, что если в ServiceExecute вызывать такой цикл, то никакой TThread не нужен. А надо наоборот - ServiceExecute не вызывать, и всё делать в TThread.Execute. Там тоже можно сделать бесконечный цикл с загрузкой 1 ядра на 100%, но это уже другой вопрос.
...
Рейтинг: 0 / 0
15.03.2021, 00:19
    #40053411
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пустой Service кушает до 15% ресурсов CPU
Настало время охуительных историй.
...
Рейтинг: 0 / 0
15.03.2021, 00:27
    #40053413
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пустой Service кушает до 15% ресурсов CPU
rgreat,

да по первому сообщению возникло впечатление, что автор вопроса не знает, что у него 6-ядерный проц, и как эти ядра загружаются.
...
Рейтинг: 0 / 0
15.03.2021, 00:27
    #40053414
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пустой Service кушает до 15% ресурсов CPU
Давно про трехзвенку не баяли.
...
Рейтинг: 0 / 0
15.03.2021, 01:20
    #40053417
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пустой Service кушает до 15% ресурсов CPU
Не перевелись ещё любители запускать поток и следующей строкой ожидать его завершения...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
15.03.2021, 06:02
    #40053422
asutp2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пустой Service кушает до 15% ресурсов CPU
YuRock
Любой поток должен либо выполнять задачу, либо ждать сигнала, после которого либо завершаться, либо начинать выполнять очередную задачу. Для Sleep тут места нет.
А теперь расскажи мне в рамках применительно к сервису? Напомню, у сервиса и автоматически создаваемого и используемого в нем потока TServiceThread есть 5 управляющих событий, которыми ОС управляет службой. Иных сигналов нет.
Внутри TServiceThread.Execute вызывается пользовательский код, который снаружи может получить всего 1 управляющий сигнал - terminate. Всё. Без сигнала завершения, после выполнения задачи и до перехода к следующему выполнению задачи сервис должен делиться ресурсами с другими приложениями в системе. Я так и не увидел, а каким образом это делается антогонистами sleep?

kdv
Кстати, я нашел аналогичное обсуждение, 5-летней давности, там такому же автору настучали канделябром.
https://stackoverflow.com/questions/33625164/service-application-in-delphi
А я вот смотрю заплюсованное решение Remy Lebeau и вижу:
Код: pascal
1.
2.
3.
4.
5.
6.
while not Terminated do
  begin
    Workflow.InsertInFile;
    Workflow.InsertInDatabase;
    TThread.Sleep(3000);
  end;

Как интересно))))
...
Рейтинг: 0 / 0
15.03.2021, 09:04
    #40053433
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пустой Service кушает до 15% ресурсов CPU
asutp2
Внутри TServiceThread.Execute

Это часть кривой реализации для неофитов. Чтоб не сильно грузить их серое вещество сервисами и их внутренним миром. Считай, что это главный поток приложения. В нем sleep вреден в боевой обстановке.

Захочет винда твой сервис остановить, а он спит. И так три раза. И твой сервис помечается плохим словом.
...
Рейтинг: 0 / 0
15.03.2021, 09:11
    #40053434
asutp2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пустой Service кушает до 15% ресурсов CPU
wadman
asutp2
Внутри TServiceThread.Execute

Это часть кривой реализации для неофитов. Чтоб не сильно грузить их серое вещество сервисами и их внутренним миром. Считай, что это главный поток приложения. В нем sleep вреден в боевой обстановке.

Захочет винда твой сервис остановить, а он спит. И так три раза. И твой сервис помечается плохим словом.
Да неужели.
Что то я ни разу не сталкивался с тем, что мой сервис не отвечал виндам и соответственно был помечен плохими словами. В своих реализациях я точно также использую доппотоки для выполнения основного функционала, а TServiceThread.Execute служит исключительно для управления дочерними потоками.
А насчет неофитов, их серого вещества и прочего - это ты по своему личному опыту говоришь?)
...
Рейтинг: 0 / 0
15.03.2021, 09:13
    #40053435
asutp2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пустой Service кушает до 15% ресурсов CPU
И я очень хочу увидеть реальный код балансировки использования процессоров в потоках у супер мега экспертов, не признающих sleep. А то слов много, реального кода - 0.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / пустой Service кушает до 15% ресурсов CPU / 25 сообщений из 166, страница 1 из 7
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]