Linux: проект ест ресурсы процессора?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Linux: проект ест ресурсы процессора?

Сообщение Владимир » 28.12.2017 18:17:31

Всем доброго!
Проект собран под Laz1.6. После запуска проекта htop по его pid показывает:
cpu% = 0,7
mem%=1,6
Спустя примерно 8 часов:
cpu% = 2,0
mem%=1,6
Спустя сутки:
cpu% = 5,7
mem%=1,6
Суть проекта - по таймеру из удаленной БД mySql вытаскивать данные (запрос простой и короткий к одной таблице).
Под Win7 такого эффекта не наблюдается. Волнуюсь.
Владимир
постоялец
 
Сообщения: 313
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: Linux: проект ест ресурсы процессора?

Сообщение Pavia » 29.12.2017 00:16:20

Попробуйте gprof, может поможет.
Аватара пользователя
Pavia
постоялец
 
Сообщения: 176
Зарегистрирован: 07.01.2011 12:46:51

Re: Linux: проект ест ресурсы процессора?

Сообщение fedan » 29.12.2017 01:12:06

А проект консоль или gui (gtk2, qt, win32)?
fedan
новенький
 
Сообщения: 32
Зарегистрирован: 15.09.2016 21:18:48

Re: Linux: проект ест ресурсы процессора?

Сообщение Владимир » 29.12.2017 09:27:17

fedan писал(а):А проект консоль или gui (gtk2, qt, win32)?


gtk2

Добавлено спустя 35 минут 54 секунды:
Pavia писал(а):Попробуйте gprof, может поможет.

Я так понимаю, что gprof относится к сборке под Qt, у меня gtk2.
По сути - в приложении тикают два таймера: по одному 4 раза в секунду меняется картинка (показ юзеру, что процесс идет),
по второму - собственно запрос к БД (раз в минуту).
Если таймеры остановить (не разрывая коннект с БД) - CPU%=0, Mem%=0,1.
При запуске таймеров - снова CPU%=8, Mem%=1,7 (приложение живет вторые сутки).
Два таймера едят ресурсы?
Владимир
постоялец
 
Сообщения: 313
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: Linux: проект ест ресурсы процессора?

Сообщение fedan » 29.12.2017 18:22:21

Попробовать оставить один таймер с картинкой. Протестировать.
Затем другой.
fedan
новенький
 
Сообщения: 32
Зарегистрирован: 15.09.2016 21:18:48

Re: Linux: проект ест ресурсы процессора?

Сообщение pupsik » 29.12.2017 18:59:47

по таймеру из удаленной БД mySql вытаскивать данные
таймеры/шмайнеры... А вот что вы с ними делаете?
Под Win7 такого эффекта не наблюдается. Волнуюсь.
пересмотрите ваш код. Есть вероятность что винда не показывает реалии (или по иному воспринимает).

А реально: что за гадания на кофейной гуще?
pupsik
энтузиаст
 
Сообщения: 1036
Зарегистрирован: 20.08.2014 16:20:13

Re: Linux: проект ест ресурсы процессора?

Сообщение Владимир » 29.12.2017 19:26:40

fedan писал(а):Попробовать оставить один таймер с картинкой. Протестировать.
Затем другой.

Один таймер с картинкой вообще ничего не ест. Но при плевом запросе к БД на локальной машине сразу CPU%=0.7, при отсутствии запросов к БД держится какое-то время, затем htop показывает CPU%=0.0, CPU%=0.7 попеременно. Через пару часов CPU%=0.0. .

Добавлено спустя 2 минуты 28 секунд:
pupsik писал(а):таймеры/шмайнеры... А вот что вы с ними делаете?

Показываю пользователю результаты запроса к БД.

Добавлено спустя 1 минуту 16 секунд:
pupsik писал(а):пересмотрите ваш код.

Хороший совет, спасибо.
Владимир
постоялец
 
Сообщения: 313
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: Linux: проект ест ресурсы процессора?

Сообщение olegy123 » 30.12.2017 13:04:58

Владимир писал(а):Спустя сутки:
cpu% = 5,7
mem%=1,6

Это не о чем не говорит. Тем более у вас оконное приложение. В период расчетов и вывода на экран пиковая загрузка процессора может доходить и до 100%/200%/300%, среднее по времени как раз лежать в 0%..10%.
подключение к БД на ассинхронном сокете? если да - то даже простой холостой опрос состояния сокета без ожиданий - уже может дать 100%.
как любой длительный for to do - грузит процессор так что вентиляторы разгоняются по максимуму.
olegy123
энтузиаст
 
Сообщения: 800
Зарегистрирован: 25.02.2016 12:10:20

Re: Linux: проект ест ресурсы процессора?

Сообщение Владимир » 30.12.2017 22:11:38

olegy123 писал(а):
Владимир писал(а):Спустя сутки:
cpu% = 5,7
mem%=1,6

Это не о чем не говорит. Тем более у вас оконное приложение. В период расчетов и вывода на экран пиковая загрузка процессора может доходить и до 100%/200%/300%, среднее по времени как раз лежать в 0%..10%.
подключение к БД на ассинхронном сокете? если да - то даже простой холостой опрос состояния сокета без ожиданий - уже может дать 100%.
как любой длительный for to do - грузит процессор так что вентиляторы разгоняются по максимуму.

В период расчета и вывода - CPU%=1.3, откуда 300% ,?
и нет там цикла...
Похоже, разобрался.
Есть таймер1 - основной, по которому происходит запрос к БД (20 - 300 сек, выбирается пользователем).
Есть таймер2 - 500 мс - для показа пользователю оставшегося времени до очередного запроса к БД.
Таймер1 по OnTimer сообщает Таймеру2 текущий таймаут запросов, и тот начинает новый отсчет времени до очередного запроса.
Отключил таймер2 - все здорово, CPU%=0
Владимир
постоялец
 
Сообщения: 313
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: Linux: проект ест ресурсы процессора?

Сообщение Владимир » 10.01.2018 16:36:06

Рано обрадовался.
Собрал тестовый проект.
По таймеру раз в секунду на панель вывожу текущее время, в StatusBar - время, оставшееся до некого события.
Вот эти выводы и грузят проц.
Код: Выделить всё
procedure TForm1.Timer1Timer(Sender: TObject);
var   //интервал - 1000 мс
  dt:TDateTime;
  mm,ss:Integer;
begin
  dt:=time;
  Label1.Caption:=TimeToStr(dt);
  ttt:=ttt-1;
  mm:=ttt div 60;//минуты
  ss:=ttt mod 60;//секунды до ttt=0
  StatusBar1.Panels[0].Text:=IntToStr(mm)+' мин '+IntToStr(ss)+' сек';
  if ttt=1 then ttt:=200;
end;

Время | CPU% | MEM%
0 час | 0,0 | 0,8
3 час | 0,7 | 0,8
5 час | 1,3 | 0,9
8 час | 1,3 | 0,8
18 час | 2,7 | 1,0
20 час | 3.3 | 1,1
Владимир
постоялец
 
Сообщения: 313
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: Linux: проект ест ресурсы процессора?

Сообщение olegy123 » 10.01.2018 20:54:47

Вообще 1 команду процессор всегда выполняет на максимуме шины скорости, т.е загрузка будет в этот момент будет всегда 100%.
Но есть исключения - режимы работы процессора когда он понижает скорость шины, переходит в режим ожидания, заморозки(hibernate) или даже выключает некоторые блоки ради экономии электроэнергии. Это регулируется на уровне ядра процессора или на уровне ядра оси. Оно может быть очень специфично даже на версиях ядра.
Рядовому юзеру сеё не доступно. Кроме как командой sleep/wait или регулированием привилегиями потока среди других потоков.
Поэтому регулировать CPU% - это абсурд.
Вообще CPU% - это среднее значение загрузки процика между двумя измерениями по времени.. т.е если приложение между t0 и t1 занимало 0,7% CPU времени то будет 0,7%. Но можно подсчитать и так - что CPU% -100% был 0,7% от расчетного T-время(допустим 1 минута) .
Рост CPU% - это второстепенный признак проблемы...
Есть задачи которые грузят CPU на все 100% и на долго - как пример та же крипта.

А вот увеличение MEM% может говорить об утечки памяти, и возможно при увеличении памяти растет объем вычислений - отсюда рост CPU%.

Добавлено спустя 13 минут 38 секунд:
Владимир писал(а):откуда 300%

3 ядра при 100% - в сумме дает CPU% 300% т.е. время когда целая система потела над задачами в три ядра занимает 300% общего времени CPU.. а могло и 6 ядер по 50%.. а могло 3 ядра по 100% и другие любые 3 ядра по 100%..
На западе продают виртуальные сервера где CPU% имеет ценик. CPU% -10% одна цена, а CPU% -20% уже другая..

Добавлено спустя 14 минут 59 секунд:
Владимир писал(а):Вот эти выводы и грузят проц.

Вполне реально что грузит X/Window система. Запросы идут чаще чем скорость обновление на экране. или можно найти проблему даже в SQL движке, вдруг там реализовано "сбор мусора","подсчет сылок" или иного чуда прогрессивного и затратного вычисления. Который может давать рост потребления ресурсов системы.SQL либла вообще может иметь свой thread - который начало берет от общего для приложения и живет своей жизнью - а планировщик в итоге суммирует затраты CPU% и дает общий результат.
Вообще то если хотите разобраться в конец что происходит - вам нужно задействовать профилирование.
olegy123
энтузиаст
 
Сообщения: 800
Зарегистрирован: 25.02.2016 12:10:20

Re: Linux: проект ест ресурсы процессора?

Сообщение Владимир » 11.01.2018 10:23:58

olegy123 писал(а):
Re: Linux: проект ест ресурсы процессора?
А вот увеличение MEM% может говорить об утечки памяти, и возможно при увеличении памяти растет объем вычислений - отсюда рост CPU%.

Утечка памяти на шести строках простого кода? Где рост объема вычислений? И нет в примере SQL-движка...
Про обновление Х-системы - возможно, но откуда рост?.
Скажу больше - если выводить время в Caption формы, а не в Label и не в StatusBar, то CPU и MEM СУТКАМИ в 0 и 0,8.
Владимир
постоялец
 
Сообщения: 313
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: Linux: проект ест ресурсы процессора?

Сообщение olegy123 » 11.01.2018 13:16:49

само оконное приложение - это не шесть строк, за LCL спрятано много кода, от инициализации X-окна, до создание примитивов. реализации системы сообщений, до MainLoop - что позволяет приложению жить.

Добавлено спустя 2 минуты 4 секунды:
Само Caption - это работа с bitmap-ом и Font. Инициализация, выделение места, загрузка шрифта, рисование на Caption текста, вывод в X.
olegy123
энтузиаст
 
Сообщения: 800
Зарегистрирован: 25.02.2016 12:10:20

Re: Linux: проект ест ресурсы процессора?

Сообщение zub » 11.01.2018 14:18:32

чето мне кажется сама идеология пихания в таймер "тяжелого" кода (хоть это и всего несколько строк, но действий там оййойой сколько происходит и зависить они могут от кучи разных факторов) - неверна.
В таймере надо только "тикать" циферки в переменных, а отрисовку в данном случае производить в онидле, если с момента прошлой отрисовки прошел необходимый интервал времени
ИМХО
zub
долгожитель
 
Сообщения: 2292
Зарегистрирован: 14.11.2005 23:51:26

Re: Linux: проект ест ресурсы процессора?

Сообщение olegy123 » 11.01.2018 15:15:12

zub писал(а):чето мне кажется сама идеология пихания в таймер "тяжелого" кода (хоть это и всего несколько строк, но действий там оййойой сколько происходит и зависить они могут от кучи разных факторов) - неверна.

Можно, TTimer - это возможность реализовать многопоточное решение, при этом сам TTimer за синхронизирован с приложением. Ничего страшного тут нет.

Idle не решение всех проблем, как background обновление не всегда гуд, оно не многопоточное.. т.е. при тяжелых расчетах в нем - будет фризить все.

Можно выключить части - и опытным путем нащупать проблему, допустим отключить вывод SQL данных, загружать но не выводить. Если будет расти - то проблему искать в уже в реализации получении данных.

Добавлено спустя 7 минут 51 секунду:
Кстати, если запросы идут по TCP - то вполне возможно, это предположение - что сокеты висят. Вы их явно не закрываете, а SQLлибла их не тушит.. по спецификации они вообще могут висеть 2 суток ничего не делая.. До 2х у вас будет рост в памяти. потом нормализируется.. Это как игра - накормить питона..
Но это опять предположение
olegy123
энтузиаст
 
Сообщения: 800
Зарегистрирован: 25.02.2016 12:10:20

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru