2010-09-06 11 views
43

Ich benutze Pthread in Linux. Ich möchte die Thread-Priorität erhöhen, indem ich die Parameter sched_param.priority einstelle. Ich konnte jedoch nicht viele Informationen über den Bereich der Threadpriorität, die ich festlegen konnte, oder über die Beschreibung der Threadpriorität aus dem Netz finden.Wie kann die Priorität von Threads in Pthreads erhöht werden?

Auch würde ich gerne über die relative Thread-Priorität wissen, da ich nicht wollen, dass die Thread-Priorität zu hoch und damit das Betriebssystem zu stoppen. Könnte mir jemand dabei helfen?

Antwort

48

Die standardmäßige Linux-Zeitplanungsrichtlinie ist SCHED_OTHER, die keine Prioritätsoption, sondern eine nice-Ebene zum Optimieren innerhalb der Richtlinie haben.

Sie werden auf eine andere Planungsrichtlinie ändern müssen Funktion pthread_setschedparam (siehe auch man sched_setscheduler)

'Normal' Scheduling-Politik: (von sched_setscheduler(2))

SCHED_OTHER the standard round-robin time-sharing policy; 
    SCHED_BATCH for "batch" style execution of processes; and 
    SCHED_IDLE for running very low priority background jobs. 

Echtzeit-Scheduling-Politik :

SCHED_FIFO a first-in, first-out policy; and 
    SCHED_RR  a round-robin policy. 

In Ihrem Fall können Sie vielleichtverwenden, da dies keine Root-Rechte erfordert.

Warnung: falsche Verwendung von Echtzeit-Zeitplanungsrichtlinien kann Ihr System hängen. Aus diesem Grund benötigen Sie Root-Rechte, um diese Art von Operation auszuführen.

Nur um sicher zu sein, was Ihre Maschine in der Lage ist, können Sie chrt Werkzeug von util-linux Paket verwenden.
Als Beispiel:

$ chrt -m 
SCHED_OTHER min/max priority : 0/0 
SCHED_FIFO min/max priority  : 1/99 
SCHED_RR min/max priority  : 1/99 
SCHED_BATCH min/max priority : 0/0 
SCHED_IDLE min/max priority  : 0/0 

Ein Weg, um Abfall weniger Zeit (die ich oft):

alias batchmake='time chrt --batch 0 make --silent' 

Während mit Benutzerrechten zu bleiben, dies treibt die make um 15% (in meinem Fall).

Edit: Einführung nice, SCHED_BATCH, SCHED_IDLE und chrt Werkzeug. Für Genauigkeit! :)

+0

re: 'SCHED_OTHER', das ist nicht ganz richtig, da schönes Niveau noch wirksam wird. – Hasturkun

+0

@Hasturkun: Sie haben recht, es ist die * nette * zwicken, als ein Tipp für den Scheduler (keine Scheduler-Priorität!). Danke für die Richtigkeit! – levif

+0

Sie brauchen nicht wirklich Root-Rechte, müssen nur die rlimits gesetzt haben, so dass das maximale prio, das Sie einstellen dürfen,> 0 ist – Spudd86

23

POSIX definiert eine Abfrage, so dass Sie das Betriebssystem nach dem gültigen Bereich der Prioritäten fragen können.

int sched_get_priority_max(int policy);

int sched_get_priority_min(int policy);

Erwarten Sie nicht Priorität erhöht, um die Maschine zu ersticken. Erwarten Sie nichts, wenn Sie nicht bereits 100% der CPU-Zyklen verwenden. Seien Sie nicht überrascht, wenn die Abfrage Ihnen sagt, dass es keine höhere Priorität als die Standardeinstellung gibt.

+2

+1 guter Tipp .... –

22

Die aktuelle Antwort von levif (Empfehlung SCHED_BATCH) ist nicht korrekt für die aktuelle NPTL-Thread-Implementierung unter Linux (Sie können überprüfen, welche Implementierung Ihr Kernel hat, indem Sie 'getconf GNU_LIBPTHREAD_VERSION' ausführen).

Im heutigen Kernel erlauben nur die Real Time Scheduling-Richtlinien die Einstellung von sched_priority - es ist immer 0 für die Nicht-RT-Richtlinien (SCHED_OTHER, SCHED_BATCH und SCHED_IDLE). Ihre einzige Wahl für die Nicht-RT-Richtlinien besteht darin, 'nette' Werte zu setzen, z. von setpriority(). Es gibt keine guten Spezifikationen für das genaue Verhalten, die man erwarten kann, wenn man 'nett' setzt, und zumindest theoretisch könnte es von Kernel-Version zu Kernel-Version variieren. Für aktuelle Linux-Kernel hat 'nett' einen sehr starken Effekt ähnlich der Priorität, so dass Sie es ziemlich synonym verwenden können. Um zu erhöhen, wie oft Ihr Thread geplant ist, möchten Sie unter Ihren 'netten' Wert senken. Dies erfordert die CAP_SYS_NICE-Fähigkeit (normalerweise root, obwohl nicht unbedingt, siehe und http://man7.org/linux/man-pages/man3/cap_set_proc.3.html).

In der Tat SCHED_BATCH für den gegenüber Fall entworfen, was die Fragesteller angefordert: es für CPU-intensive ausgelegt ist, lange laufende Aufträge, die mit niedrigeren Priorität leben kann. Es weist den Scheduler an, die Weckpriorität für die Threads geringfügig zu strafen.

Auch um einen der früheren Kommentare zu beantworten (Ich habe noch nicht genügend Ruf, um eine Antwort zu kommentieren - einige Upvotes für diese Antwort würden helfen :)). Ja, die schlechte Nachricht ist, dass die POSIX.1-Spezifikation besagt, dass "nett" Prozesse und nicht einzelne Threads betrifft. Die gute Nachricht ist, dass die Linux-Thread-Implementierungen (sowohl NPTL als auch die originalen Linux-Threads) die Spezifikation durchbrechen und es erlauben, einzelne Threads zu beeinflussen. Ich finde es amüsant, dass dies oft im Abschnitt "BUGS" der man-Seiten aufgerufen wird. Ich würde sagen, der Fehler war in der POSIX.1-Spezifikation, die dieses Verhalten erlaubt haben sollte, nicht in den Implementierungen, die gezwungen waren, es trotz der Spezifikation bereitzustellen, und dies bewusst und absichtlich getan hat. Mit anderen Worten - kein Fehler.

Das meiste ist detailliert auf der Sched (7) man-Seite (die aus irgendeinem Grund nicht auf meinem Fedora 20-System geliefert wird): http://man7.org/linux/man-pages/man7/sched.7.html

Wenn Sie wirklich beeinflussen wollte sched_priority Sie auf das aussehen könnte Echtzeit-Richtlinien wie SCHED_RR).

+0

Was ist/war die "aktuelle NPTL-Thread-Implementierung"? Ich brauche etwas, um mit der Ausgabe von 'getconf' auf einem Legacy-Ziel zu vergleichen. – jhfrontz

+3

NTPL (Native POSIX-Threadbibliothek) ist der Name der aktuellen Linux-Threadimplementierung. Es unterscheidet sich von der ursprünglichen Thread-Implementierung, bei der mehrere Prozesse zum Simulieren des Multithreading-Verhaltens verwendet wurden. NTPL wurde in Linux 2.6 eingeführt. Weitere Details und Geschichte hier: https: //en.m.wikipedia.org/wiki/Native_POSIX_Thread_Library – BobDoolittle

Verwandte Themen