Puncte:2

Limitele cozii de mesaje Centos System V IPC

drapel cn

[Deși lucrez în perl, cred că această întrebare se referă la Linux System V IPC API-uri și limite, mai degrabă decât orice specific perl.]

Am două mașini Centos, fiecare la CentOS Linux versiunea 7.9.2009 (Core).

Am un program care furcă un copil și apoi folosește mesajele System V IPC pentru a comunica cu copilul, copilul pregătește răspunsuri și le trimite părintelui.

Pe o mașină vedem comportamentul așteptat. Copilul produce loturi de mesaje, părintele le consumă. Ocazional, copilul lucrează puțin mai repede decât părintele și astfel poate umple coada, apoi copilul așteaptă până când părintele consumă unele mesaje și continuă.

Putem inspecta dimensiunile cozii cu ipcs -q și putem vedea că limita implicită de 10 mesaje pe coadă este atinsă ocazional, copilul se întrerupe și apoi vedem coada goală așa cum era de așteptat.

Credem că limitele cozii sunt specificate în fișierele în /proc/sys/fs/mqueue/ si de exemplu msg_max este considerat a fi cel așteptat 10.Aceste valori sunt identice la ambele mașini.

De asemenea, putem vizualiza limitele utilizatorilor legate de utilizarea cozii ulimit -q și vedeți o valoare care depășește 800.000 de octeți pe ambele mașini.

Puzzle-ul este că pe a doua noastră mașină vedem copilul scrie trei mesaje în coadă și încearcă să scrie al patrulea și așteptăm - nu am stabilit în mod deliberat niciun timeout. Este ca și cum scriitorul crede că coada este plină, chiar dacă ipcs -q arată doar 3 articole în coadă. În acest moment, părintele nu încearcă încă să citească mesajele.

------ Cozi de mesaje --------
key msqid owner perms used-bytes mesaje    
0x0000002a 1474560 dave 600 15020 3  

Întrebarea: ce, în afară de coada plină, ar face ca msgsnd() să intre în pauză? Pauza pare să continue la nesfârșit, copilul continuă atunci când părintele devine activ și citește unele mesaje.

Avem multe mașini care rulează acest cod fără probleme. Eșuează la trei mașini noi. Probabil că există o caracteristică specifică mediului care interacționează cu codul nostru?

Codul perl folosește o bibliotecă subțire deasupra apelurilor de sistem (detalii eliminate)

$mQueue = msgget(IPC_PRIVATE, IPC_CREAT | S_IRUSR | S_IWUSR);
msgsnd( $mQueue, pachet("l! a*", lungime($msg), $msg);
Puncte:2
drapel cn

Problema a fost că dimensiunea maximă implicită a cozii setarea nucleului a fost setată la o valoare scăzută.

Acest lucru poate fi vizualizat folosind opțiunea -l la ipcs.

ipcs -q -l

------ Limite mesaje --------
cozi maxime la nivel de sistem = 3671
dimensiunea maximă a mesajului (octeți) = 8192
dimensiunea maximă implicită a cozii (octeți) = 16384

Setarea de kernel în cauză este stocată în

/proc/sys/kernel/msgmnb

și poate fi schimbat (ca root) folosind comanda

 sysctl -w kernel.msgmnb=65536
 kernel.msgmnb = 65536

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.