Eigene Priorität sehr hoch setzen

Eigene Priorität sehr hoch setzen

am 28.01.2006 13:20:27 von Toni Erdmann

Hallo,

ich will die eigene Priorität des Perl-Scriptes höher setzen.
Genauer gesagt gehts darum, nach fork() im Child-Prozess
ein Programm mit exec() zu starten. Dieses Programm (/usr/lib/sa/sadc)
soll mit möglichst hoher Priorität laufen.

Wie bekomme ich das hin (außer mit 'nice')?

Habe es mal zunächst mit

perl -w -e 'require "sched.ph"; sched_priority();'

versucht, erhalte aber:

Undefined subroutine &main::__sched_priority called at (eval 178) line 1

Was eindeutig auf eine Zeile in 'sched.ph' hinweist.

SuSE Linux 9.3 bzw. SLES9, Perl 5.8.6


Hintergrund: /usr/lib/sa/sadc ist der Data Collector von SAR, der die
(binären) Daten im Sekunden-Intervall nach /tmp schreiben soll.

Bei hoher CPU-Last kommt er aber nicht immer im Sekunden-Intervall
dran (hatte sogar mal Aussetzer von 5 Minuten), was mir die
Messungen versaut.

Toni

Re: Eigene Prioritätsehr hoch setzen

am 28.01.2006 14:24:20 von Christian Lackas

* Toni Erdmann [2006-01-28]:

Hallo Toni,

> ich will die eigene Priorität des Perl-Scriptes höher setzen.

das geht, überraschender Weise, mit setpriority():

perldoc -f setpriority

Eine Liste mit allen Funktionen, findet du unter

perldoc perlfunc

(fürs nächste Mal).

> Bei hoher CPU-Last kommt er aber nicht immer im Sekunden-Intervall
> dran (hatte sogar mal Aussetzer von 5 Minuten), was mir die Messungen
> versaut.

Wenn du den Prioritätswert runter setzen (also mehr Anteil an der
Rechenleistung haben) willst, dann brauchst du außerdem noch root
Rechte.

Details siehe auch in setpriority(2) deines Systems.

Gruß
Christian

--
Die sechs Phasen der Planung:
Begeisterung, Ernüchterung, Panik, Suche nach dem Schuldigen, Bestrafung
der Unschuldigen, Auszeichnung der Nichtbeteiligten.
http://www.lackas.net/ Perl Delphi Linux MP3 Searchengines Domainchecker

Re: Eigene Priorität sehr hoch setzen

am 28.01.2006 20:36:56 von Toni Erdmann

Christian Lackas wrote:
> * Toni Erdmann [2006-01-28]:
>
> Hallo Toni,
>
>>ich will die eigene Priorität des Perl-Scriptes höher setzen.
>
> das geht, überraschender Weise, mit setpriority():
>
> perldoc -f setpriority
>
> Eine Liste mit allen Funktionen, findet du unter
>
> perldoc perlfunc
>
> (fürs nächste Mal).
>

Duck and Cover! Ich hatte mit 'man' für C-Funktionen angefangen
und dann mit perldoc -f (meistens klappts)
weiter versucht.

perldoc perlfunc sollte man aber wirklich kennen!

>>Bei hoher CPU-Last kommt er aber nicht immer im Sekunden-Intervall
>>dran (hatte sogar mal Aussetzer von 5 Minuten), was mir die Messungen
>>versaut.
>
> Wenn du den Prioritätswert runter setzen (also mehr Anteil an der
> Rechenleistung haben) willst, dann brauchst du außerdem noch root
> Rechte.
>

Klaro.

> Details siehe auch in setpriority(2) deines Systems.
>

Super und danke.

Toni

Re: Eigene Priorität sehr hoch setzen

am 02.02.2006 09:56:25 von Toni Erdmann

Toni Erdmann wrote:
> Hallo,
>
> ich will die eigene Priorität des Perl-Scriptes höher setzen.
> Genauer gesagt gehts darum, nach fork() im Child-Prozess
> ein Programm mit exec() zu starten. Dieses Programm (/usr/lib/sa/sadc)
> soll mit möglichst hoher Priorität laufen.
>
> Wie bekomme ich das hin (außer mit 'nice')?
>
> Habe es mal zunächst mit
>
> perl -w -e 'require "sched.ph"; sched_priority();'
>

Na ja, naiver Versuch!

perl -w -e 'my $param = pack("L",0);
require "syscall.ph";
printf "%d\n", syscall(SYS_sched_getparam(),7140,$param);
printf "%d\n", unpack("L",$param);'

bringt mehr Erfolg. '7140' ist hier die PID des KDE-Programms
'artsd', welches mit Real-Time-Prio 50 läuft.

Der Vorschlag von Christian bzgl. 'setpriority' ändert leider
nur im Rahmen des 'nice'-Values, was bei uns das Problem
nicht gelöst hat. Es laufen viele Real-Time-Prozesse, die
verhindern, dass 'sadc' rechtzeitig dran kommt.

Toni

Re: Eigene Priorität sehr hoch setzen

am 17.02.2006 18:26:08 von Toni Erdmann

Toni Erdmann wrote:

> Toni Erdmann wrote:
>
>> Hallo,
>>
>> ich will die eigene Priorität des Perl-Scriptes höher setzen.
>> Genauer gesagt gehts darum, nach fork() im Child-Prozess
>> ein Programm mit exec() zu starten. Dieses Programm (/usr/lib/sa/sadc)
>> soll mit möglichst hoher Priorität laufen.
>>
>> Wie bekomme ich das hin (außer mit 'nice')?
>>
>> Habe es mal zunächst mit
>>
>> perl -w -e 'require "sched.ph"; sched_priority();'
>>
>
> Na ja, naiver Versuch!
>
> perl -w -e 'my $param = pack("L",0);
> require "syscall.ph";
> printf "%d\n", syscall(SYS_sched_getparam(),7140,$param);
> printf "%d\n", unpack("L",$param);'
>
> bringt mehr Erfolg. '7140' ist hier die PID des KDE-Programms
> 'artsd', welches mit Real-Time-Prio 50 läuft.

Und dann gibt's da noch das 'chrt' Tool aus sched_utilities package.

Toni

Re: Eigene Priorität sehr hoch setzen

am 17.02.2006 18:29:32 von Toni Erdmann

Toni Erdmann wrote:

> Hallo,
>
> ich will die eigene Priorität des Perl-Scriptes höher setzen.
> Genauer gesagt gehts darum, nach fork() im Child-Prozess
> ein Programm mit exec() zu starten. Dieses Programm (/usr/lib/sa/sadc)
> soll mit möglichst hoher Priorität laufen.
>
> Wie bekomme ich das hin (außer mit 'nice')?
>
> Habe es mal zunächst mit
>
> perl -w -e 'require "sched.ph"; sched_priority();'
>
> versucht, erhalte aber:
>
> Undefined subroutine &main::__sched_priority called at (eval 178) line 1
>
> Was eindeutig auf eine Zeile in 'sched.ph' hinweist.
>
> SuSE Linux 9.3 bzw. SLES9, Perl 5.8.6
>
>
> Hintergrund: /usr/lib/sa/sadc ist der Data Collector von SAR, der die
> (binären) Daten im Sekunden-Intervall nach /tmp schreiben soll.
>
> Bei hoher CPU-Last kommt er aber nicht immer im Sekunden-Intervall
> dran (hatte sogar mal Aussetzer von 5 Minuten), was mir die
> Messungen versaut.
>
> Toni

Wen's interessiert:

Thread: 'sar' mit Interval 1 Sekunde lückenhaft

in: de.comp.os.unix.linux.misc

Dort geht die Geschichte weiter, da's mit Perl nichts
mehr zu tun hat.

Toni