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
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.
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%