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

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

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

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

Сообщение Владимир »

[quote}
Можно выключить части - и опытным путем нащупать проблему, допустим отключить вывод SQL данных, загружать но не выводить. Если будет расти - то проблему искать в уже в реализации получении данных.
Но это опять предположение[/quote]
Ребят, я ж написал - сделал ТЕСТОВЫЙ проект, там кроме приведенного кода нет НИЧЕГО. Никаких запросов к БД.
И если не выводить часики - все Ок!

Добавлено спустя 1 минуту 33 секунды:
Ребят, я ж написал - сделал ТЕСТОВЫЙ проект, там кроме приведенного кода нет НИЧЕГО. Никаких запросов к БД.
И если не выводить часики - все Ок!

Добавлено спустя 2 минуты 35 секунд:
olegy123 писал(а):Можно выключить части - и опытным путем нащупать проблему, допустим отключить вывод SQL данных, загружать но не выводить.


Ребят, я ж написал - сделал ТЕСТОВЫЙ проект, там кроме приведенного кода нет НИЧЕГО. Никаких запросов к БД.
И если не выводить часики - все Ок!

Добавлено спустя 19 минут 9 секунд:
Вот весь код:

Код: Выделить всё

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  StdCtrls, ComCtrls,Math;

type

  { TForm1 }

  TForm1 = class(TForm)
    Label1: TLabel;
    Panel1: TPanel;
    StatusBar1: TStatusBar;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;
  ttt:Integer;
implementation

{$R *.lfm}

{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
  ttt:=200;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  dt:TDateTime;
  mm,ss:Integer;
begin
  dt:=time;
  ttt:=ttt-1;
  mm:=ttt div 60;
  ss:=ttt mod 60;
  StatusBar1.Panels[0].Text:=IntToStr(mm)+' мин '+IntToStr(ss)+' сек';//
  Label1.Caption:=TimeToStr(dt);
  //два предыдущих вывода грузят ЦП
  //а этот - нет
  Form1.Caption:=IntToStr(mm)+' мин '+IntToStr(ss)+' сек';
  if ttt=1 then ttt:=200;
end;
end.
     


Добавлено спустя 3 часа 55 минут 46 секунд:
И да, ситуация опробована на 4-х машинах.
Аватара пользователя
zoltanleo
постоялец
Сообщения: 459
Зарегистрирован: 17.10.2013 10:55:01

Сообщение zoltanleo »

Если владеете работой в доп.потоке, создайте там непрерывный цикл, вроде такого

Код: Выделить всё

While {true condition} do
begin
  //создание коннекта к БД (через Create), получение результата
  //отправка результата в основной поток SendMessage/PostMessage
  //убивание коннекта (через Free)

  sleep(<интервал таймера в мс>);
end;

Наверняка, утечек не будет, и код прозрачен и управляем
Владимир
постоялец
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Сообщение Владимир »

zoltanleo писал(а):Наверняка, утечек не будет, и код прозрачен и управляем

Блин, устал уже повторять: в тестовом проекте НЕТ работы с БД!
Есть просто вывод времени в StatusBar и Label. Ресурсы ЦП и память растут только под Linux, под Win все Ок
Аватара пользователя
zoltanleo
постоялец
Сообщения: 459
Зарегистрирован: 17.10.2013 10:55:01

Сообщение zoltanleo »

Владимир писал(а):Блин, устал уже повторять: в тестовом проекте НЕТ работы с БД!

Чудак-человек. Ну сделайте вывод неск. потоков без БД, как например здесь

да помониторьте, течет ли память. Если не течет, значит от TTimer'а придется отказаться
Последний раз редактировалось zoltanleo 13.01.2018 18:32:55, всего редактировалось 1 раз.
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

поотрубай по отдельности StatusBar и Label

Память под Linux может расти еще и от свойств менеджера памяти, т.е. он буфера может не сбрасывать до последнего..
sync; echo 3 > /proc/sys/vm/drop_caches

Добавлено спустя 4 минуты 30 секунд:
Запустил я тест у себя..

Хм.. память растет постепенно..

Добавлено спустя 3 минуты 33 секунды:
ps показал RES | SHR
вначале было: 142976 24636
через час стало: 143240 25164
- это
RES - Resident memory size & SHR - Shared Memory size

Добавлено спустя 6 минут 1 секунду:
тут пишут что это нормально:
https://groups.google.com/forum/#!topic ... d_hGn4-Eto
48-72 hours может расти, в зависимости от нагрузки..
связано это с выделением ядра памяти..

Добавлено спустя 15 минут 9 секунд:
pmap <pid>
дает очень интересную инфу..

Добавлено спустя 3 минуты 16 секунд:
https://elinux.org/Runtime_Memory_Measurement
Владимир
постоялец
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Сообщение Владимир »

olegy123 писал(а):поотрубай по отдельности StatusBar и Label

Ну слава Богу - поотрубал - все Ок (там в коде я все описал!!!)

Добавлено спустя 2 минуты 48 секунд:
olegy123 писал(а):Запустил я тест у себя..

Хм.. память растет постепенно..


Да Вы шо? Не может быть! (шучу) А CPU% не растет?
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

Хаха...
при поиске res memory linux java
джабисты негодуют.. почему Hello Word разрослась до 4Gb VM

советуют применить ulimit
https://www.opennet.ru/base/sys/ulimit_mc.txt.html

Добавлено спустя 3 минуты 6 секунд:
Владимир писал(а):А CPU% не растет?
CPU растет, но это может тесно связано с relocate memory.
Владимир
постоялец
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Сообщение Владимир »

olegy123 писал(а):CPU растет, но это может тесно связано с relocate memory.

Может быть, но у меня приложение работает сутками-месяцами, случайно заметил, что спустя неделю CPU% около15...
Пока решил проблему выводом "часиков" на канву (TextOut()) - все тихо-спокойно!
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

ulimit устарела
http://ru.manpages.org/setrlimit/2
Владимир
постоялец
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Сообщение Владимир »

zoltanleo писал(а):Чудак-человек. Ну сделайте вывод неск. потоков без БД, как например

На чудака не обижаюсь. Но, если элементарная операция жрет ЦП и память - это не правильно!
И не хочу изгаляться с потоками и проч. Это явный баг Лазаруса под Linux.

Добавлено спустя 13 минут 52 секунды:
zoltanleo писал(а):да помониторьте, течет ли память. Если не течет, значит от TTimer'а придется отказаться

А чего только от TTimer отказаться? Может, на asm перейти и не париться?

Добавлено спустя 12 минут 59 секунд:
olegy123 писал(а):ulimit устарела

Да ладно. Спасибо, что вьехали в тему. Не думаю, что разработчики Лазаруса тестировали такие выводы в течение десятков часов.
Под Linux - это явный баг (как мне кажется). Может, напишете в багтрекер?
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

Это не баг fpc - это особенности работы с Linux, менеджера памяти его называют ленивым (Lazy),
возможно чтобы выделить память он просто метит в новом месте.. Зачем разбираться какие page уже чистые, какие нужно дефрагментировать.. Да зачем оно нужно, когда проще отрезать кусок где свободно.
https://unix.stackexchange.com/question ... virt-memor

Добавлено спустя 29 минут 43 секунды:
https://stackoverflow.com/questions/864 ... ators-lazy
On Linux, malloc requests memory with sbrk() or mmap() - either way, your address space is expanded immediately, but Linux does not assign actual pages of physical memory until the first write to the page in question. You can see the address space expansion in the VIRT column, while the actual, physical memory usage in RES.
Mirage
энтузиаст
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia
Контактная информация:

Сообщение Mirage »

olegy123 писал(а):Можно, TTimer - это возможность реализовать многопоточное решение


Разве TTimer в LCL поток создает? А зачем?

По теме - вполне возможно, что в LCL утекают ресурсы. Если создать баг с компактным примером, то поправят.
Можно strace какой-нибудь натравить во время загрузки ЦП, чтобы понять чего оно там делает и его вывод приложить.

По памяти еще есть смысл проверить растет ли GetHeapStatus().TotalAllocated, хотя скорее всего утекает вне хипа.
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

Это явный баг Лазаруса под Linux
а почему так кардинально? Баг интерпретируется и под кедами, и под гномом? И в разных дистах? И там стоит то что поддерживается лазарем (gtk-2, qt-4)?
Если уж писать в баг трекер. То, как бы, слова: Линукс, баг = не достаточно.
Ответить