Es können nicht mehr als 10 MQs erstellt werden

8

Ich verwende ein Python-Modul, das die Posix-Echtzeiterweiterungen umschließt, um MessageQueues zu erhalten.

Dies ist der Python-Code

%Vor%

Dies erzeugt ungefähr 10 mqs, bevor OSError: This process already has the maximum number of files open

gemeldet wird

Ich habe mq limits und rlimit untersucht und geprüft, ob sie alle sehr hoch sind. Z.B.

%Vor%

Und selbst für privilegierte Benutzer werden immer nur ungefähr 10 Warteschlangen erstellt.

Das Äquivalent C, das die Echtzeit-Erweiterungen direkt verwendet, ist wie folgt

%Vor%

(kompilieren mit gcc -lrt test.c ) Aber das bringt mir nur 20 mq gleichzeitig. Realistisch möchte ich ein paar hundert, vielleicht tausend gleichzeitig haben.

Hat jemand irgendwelche Ideen oder Vorschläge?

EDIT: Bessere Fehlerprüfung in der C-Version. Immer noch max.

    
Jakob Bowyer 31.10.2016, 12:52
quelle

1 Antwort

5

Der Parameter fs.mqueue.queues_max ist nur eine globale Anzahl von Nachrichtenwarteschlangen, die im System erlaubt sind. Das Limit, das Sie erreichen, ist die Anzahl der Nachrichtenwarteschlangen pro Prozess. Weil mq_open über Fehlercodes sagt:

  

[EMFILE] Zu viele Warteschlangenbeschreiber oder Dateideskriptoren                           werden derzeit von diesem Prozess verwendet.

Normalerweise sollten Sie pro Prozesslimit mit getrlimit / setrlimit lesen können. Die man-Seite für rlimit sagt:

  

RLIMIT_MSGQUEUE (seit Linux 2.6.8)

     

Gibt die Grenze für die Anzahl der Bytes an, die für POSIX-Nachrichtenwarteschlangen für die reale Benutzer-ID des aufrufenden Prozesses zugeordnet werden können. Dieses Limit wird für mq_open (3) erzwungen. Jede Nachrichtenwarteschlange, die der Benutzer erstellt, zählt (bis diese entfernt wird) anhand dieser Formel gemäß der folgenden Formel:

     %Vor%      

Dabei ist attr die mq_attr-Struktur, die als viertes Argument für mq_open (3) angegeben ist.

     

Der erste Summand in der Formel, der sizeof (struct msg_msg *) (4 Byte unter Linux / i386) enthält, stellt sicher, dass der Benutzer keine unbegrenzte Anzahl von Nachrichten der Länge Null erstellen kann (solche Nachrichten verbrauchen jedoch jeweils etwas Systemspeicher) für den Buchhaltungsaufwand).

Sie können auch versuchen, den Wert zu lesen und ihn mit dem zu multiplizieren, was Sie brauchen:

%Vor%     
Serge Ballesta 04.11.2016 11:20
quelle

Tags und Links