2017-11-21 5 views
3

Ich habe eine C++ - Anwendung, die pthread_setschedparam() verwendet, um Thread-Priorität festzulegen. In einem Andock-Container schlägt dies mit EPERM fehl.Überprüfen auf Linux-Funktionen zum Festlegen der Thread-Priorität

Wie kann ich feststellen, ob mein Prozess über die erforderlichen Funktionen zum Festlegen der Threadpriorität verfügt?

+0

Möglicherweise verwandt: [CoreOS - pthread_create Priorität Thread gibt EPERM zurück, wenn als root ausgeführt wird] (https://github.com/coreos/bugs/issues/410). – jweyrich

+0

@jwerich: Sieht aus wie das gleiche Problem, aber kein Code-Beispiel, wie überprüft werden kann, ob ein Prozess die Fähigkeit hat oder nicht. –

+0

Rechts. Ich nehme an, dass Ihr Container auf CoreOS läuft. Ist es nicht? Es sieht aus wie ein Fehler in CoreOS. – jweyrich

Antwort

1

In dem Mann pthread_setschedparam() heißt es:

Für eine Beschreibung der erforderlichen Berechtigungen und die Wirkung, eines Threads Planungsrichtlinie und die Priorität und die Einzelheiten der die zulässigen Bereiche für die Prioritäten zu ändern In jeder Zeitplanungsrichtlinie siehe sched (7).

In dem Mann Sched es Staat unter anderem:

Ein Thread privilegiert (CAP_SYS_NICE) um

Weitere Informationen zu setzen oder zu ändern, um eine SCHED_DEADLINE Politik sein muss Sie können sehen http://man7.org/linux/man-pages/man7/sched.7.html

+0

Wie überprüfe ich, ob mein Prozess CAP_SYS_NICE hat? –

0

Ich denke, Ihre C++ - Anwendung kann die Thread-Priorität festlegen, weil auf dem Host es die Requi hat red linux Fähigkeit cap_sys_nice

Alle Linux-Funktionen auf dem Host kann capsh --print

Hier innen Docker conatiner mit diesem Befehl herausgefunden werden Sie diese Fähigkeit mit --cap-add Option einstellen müssen.

docker run -it --rm --cap-add SYS_NICE ubuntu bash

Wenn es nicht funktioniert hat versuchen, dieses

docker run -it --rm --userns host --cap-add SYS_NICE ubuntu bash

Da könnte es ohne --userns Option einige Probleme sein, wie hier erwähnt https://github.com/moby/moby/issues/25622

Im schlimmsten Fall: Wenn irgendetwas davon nicht funktioniert dann versuchen, Container mit --privileged Option ausführen, das wird alle Linux-Funktionen zu diesem Container hinzufügen, obwohl es nicht ist t empfohlen.

Probieren Sie es aus.

+0

Danke für deine Antwort, aber meine Absicht ist wirklich das Gegenteil. Ich möchte meine App lieber abschalten, anstatt dem Container mehr Möglichkeiten zu geben. –

2

Der richtige Weg zu überprüfen ist einfach, es zu versuchen und zu sehen, wenn Sie den EPERM Fehler erhalten. Zum einen können LSMs beliebige Regeln für die zulässigen Scheduler-Änderungen setzen.

Also ist es wahrscheinlich das Richtige, wenn nur eine Warnung (einmal!) Protokolliert wird, wenn dies passiert.

Verwandte Themen