[fpc-pascal] My Linux service application consumes 10% CPU when idling - why?

Michael Van Canneyt michael at freepascal.org
Fri Oct 8 00:12:50 CEST 2021

On Thu, 7 Oct 2021, Bo Berglund via fpc-pascal wrote:

> On Tue, 5 Oct 2021 10:22:44 +0200 (CEST), Michael Van Canneyt via fpc-pascal
> <fpc-pascal at lists.freepascal.org> wrote:
>>> My program in Lazarus *is* a "simple program" and it has no GUI components.
>>> I never even looked at the implementation of CheckSynchronize()...
>>> It was just given in another thread when I was working on the port from Delphi
>>> to Linux and thus from the Windows GUI environment to the non-GUI command line
>>> program environment.
>> The name 'Gui thread' is misleading. It's simply the main program thread.
>> If you want to use TThread.Synchronize then the call to CheckSynchronize is
>> needed. The LCL for GUI application simply calls it automatically for you.
>> In a non-GUI command-line program, you're responsible for calling it from
>> time to time.
> That is what I had learned back in beginning of this year when I was starting
> testing on actual hardware. Checksynchronize is needed in the main program loop
> in order for threads to fire off events etc. I use threads to handle serial port
> communications, and the threads should be disposed of after use...
> Now I have done some more investigations and I am more confused by it...
> My service program runs at about 4% CPU usage as shown by top. This holds true
> for a long time after starting it (several idle days).
> But when a client connects to inspect data on the system the usage spikes when
> he commands some data display etc. But then goes back to the 4% or so.
> If the client enables a task to be executed then nothing really happens until
> that task starts on its set time.
> At that time the CPU usage raises from 4% to 11% and goes up/down a few % for
> the minutes it runs and then returns to an idle value of about 8%, which it
> never gets below after that.
> No matter how long I wait it is now stuck at that double value.
> So clearly something must be left behind after the task has finished...
> The question is: how to find what is still using CPU?

Run the process under strace:
strace -f -p PID -o log1.txt
with PID the process ID.

You will see what system calls are executed. Do this when the load is 4% and
when it's 8%, maybe this will tell you something.


More information about the fpc-pascal mailing list