[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);