[fpc-pascal] How to find where my app consumes CPU?

Travis Siegel tsiegel at softcon.com
Wed May 19 00:37:38 CEST 2021


Apparently, you can release cpu cycles, but it's with the sched_yield 
(section 2 in the man pages), not the sleep command on linux.

So, apparently, the sleep is still using full system recourses, even 
though it's just waiting.  You apparently have to release cpu time with 
the sched_yield command to make it actually give up time slices., and 
even then, it's not clear it will actually do so, the description claims 
it simply moves your application to the end of the cue, which doesn't 
really give away it's cpu cycles, just changes it's location in the 
execution order.

Perhaps it will help with the cpu usage though, I've not done any 
testing to see how (or not) it affects cpu.


On 5/18/2021 6:29 PM, Bo Berglund via fpc-pascal wrote:
> On Tue, 18 May 2021 21:40:15 +0000, Alexander Grotewohl via fpc-pascal
> <fpc-pascal at lists.freepascal.org> wrote:
>
>> if it's waiting on keyboard input you might be better off using select() for
>> that instead of looping and checking for keyboard input each go around.
>>
>> sleep() might already do something similar with a zero timeout but even that
>> would probably be insufficient
> As I tried to explain at the start of this thread my application runs as a
> *systemd service* on Linux, so there is absolutely no keyboard input.
>
> The main program looks like this after initializations etc:
>
>    try
>      try
>        bSTerm := False;
>        bSInt := False;
>        bsHup := False;
>        {$IFDEF UNIX}
>        fpSignal(SigTerm, SignalHandler(@handleSignal));
>        fpSignal(SigInt, SignalHandler(@handleSignal));
>        fpSignal(SigHup, SignalHandler(@handleSignal));
>        {$ENDIF}
>
>        Debug_Writeln('Enter eternal loop');
>        FLogServ.StdLog('Enter eternal loop');
>
>        While not (bSTerm or bSInt or bsHup) do
>        begin
>          //Here is where the server runs as defined elsewhere
>          //Eternal loop to wait for system messages
>          Sleep(1); //To not hog the CPU
>          CheckSynchronize; //To get thread comm working
>        end;
>
>        Debug_Writeln('Exit eternal loop');
>        FLogServ.StdLog('Exit eternal loop');
>      except
>        on E: Exception do
>        begin
>          FLogServ.ExceptionLog('Unhandled exception: ' + E.Message);
>        end;
>      end;
>    finally
>      ShutdownServer;
>    end;
>
> As you can see it sits in the eternal loop until the system sends a "signal" to
> it to stop. So systemd does that if I issue a sudo systemctl stop myservice and
> this works fine.
> Could this tiny loop consume 6-7% CPU cycles?
>
>


More information about the fpc-pascal mailing list