POSIX (și Linux în general) nu a avut niciodată cronometre garantate, în sensul că dacă adormiți ceva, vă puteți aștepta să se trezească la o oră exactă. Puteți garanta vreodată că trezirea a avut loc DUPĂ ora menționată, nu tocmai pe ea și nu înainte de*.
Linux nu este menit să fie în timp real și face tot posibilul.
Din om 2 nanosomn
care este compatibil POSIX:
nanosleep() suspendă execuția firului de apel până la oricare
macar a trecut timpul specificat în *req sau livrarea unui
semnal care declanșează invocarea unui handler în firul apelant
sau care încheie procesul.
Dacă vă așteptați ca căpușele să fie de încredere, atunci problema acolo este mai probabil să nu aveți o euristică pentru a gestiona un diapozitiv în interiorul unei anumite ferestre.
Sugestia mea aici ar fi să vă regândiți designul aplicației pentru a fi mai puțin de încredere pentru trezirile exacte sau să aveți un sistem de siguranță în cazul unei întârzieri neașteptate.
IE
- Software-ul se întrerupe din cauza unei anomalii de întârziere.
- Software-ul de trezire observă o diferență în comparație cu o altă sursă de timp autorizată și își „pasează” ideea următoarei treziri pentru a compensa.
- Imprimați un avertisment sau furnizați o altă notificare.
Nu este cu adevărat plauzibil să ne gândim la timp ca fiind de încredere într-un sistem preemptibil. Chiar și pe metalul gol.
- Întreruperile nemascabile nu pot fi blocate.
- Încărcare mare înseamnă că ești doar programat pentru o lungă perioadă de timp.
- Întreruperile la CPU invocate de hardware pot cauza întârzieri.
- Defecțiunile minore și majore ale paginii pot produce întârzieri foarte mari între trezirile temporizatorului.
- Alocarea memoriei pe băncile de memorie nedeținute de către CPU adaugă întârzieri.
Aceasta este într-adevăr doar o funcție a computerului x86 modern.
Cel puțin pe KVM, există o sursă de ceas numită „kvm-clock” care ar trebui să reprezinte tick-uri de la hypervisorul de bază, indiferent de orice întârzieri necunoscute într-un VM. Puteți găsi acel fișier și ceea ce ați setat în această cale: /sys/devices/system/clocksource/clocksource*/current_clocksource
și vezi care sunt opțiunile tale /sys/devices/system/clocksource/clocksource*/available_clocksource
.
Dar din nou, gazda de bază poate avea propriile întârzieri. Deci sunt doar țestoase până jos...
Nu vă bazați pe garanții în timp real acolo unde nu există. Construiți software-ul fie pentru a face față întârzierilor neașteptate, fie cel puțin să știți despre ele.
NTP, în general, este un întreg protocol menit să rezolve problema timpului, ce oră este „corectă” și ce trebuie făcut pentru gestionarea modificărilor timpului. Este o problemă destul de complicată.
Cea mai bună practică este că doriți să configurați sistemul pentru a face problema improbabilă din punct de vedere statistic, gândiți-vă la ceea ce (dacă există) ar constitui o autoritate de încredere pentru timp în aplicația dvs. și apoi cum doriți să faceți față evenimentelor improbabile în care timpul se schimbă. .
Poate ați configurat un SLA spunând că ora va fi incorectă. 1 verificați 1000000 de mostre. Adică este posibil, deși puțin probabil din punct de vedere statistic, ca căpușele să fie oprite.
Modul în care iau în considerare timpul când lucrez cu grupuri de sisteme diferite, care toate sunt legate, este că este mai important ca localitatea lor de timp* să fie într-o fereastră mică de diferență. În această măsură, aș avea o configurație de server de oră locală care în sine folosește o sursă autorizată, apoi aș avea toate computerele din acel grup să se sincronizeze cu acel sistem local. Latența foarte scăzută la serverul de timp local servește la reducerea fluctuației locale și toate gazdele ar trebui să rămână foarte strâns sincronizate.
Unele implementări de temporizator folosesc un handler de semnal pentru a capta evenimentele. Adică SIGALRM, dacă trimiteți unui proces un semnal ALRM în afara temporizatorului, acesta se va trezi înaintea acestuia.
Localitatea aici ar fi toate computerele legate logic între ele, toate se află în, poate, câteva milisecunde de timp unul în celălalt. Dar ele ar putea diferi foarte mult între o altă localitate, adică un grup de sisteme care este latența la 500 ms distanță.