Linux operatsioonisüsteemis töötab aeg

Allikas: Imre kasutab arvutit
Redaktsioon seisuga 9. juuli 2026, kell 20:00 kasutajalt Imre (arutelu | kaastöö) (→‎TSC)
Mine navigeerimisribaleMine otsikasti

Sissejuhatus

Linux operatsioonisüsteemis ajaga töötamisest tekkiv kasu seisneb selles, et arvutis toimuvad tegevused saavad juhtuda nö õigel ajal

  • mingi tegevus käivitatakse ettenäidatud ajal tulevikus (nö kalendriaja mõttes nt 8 juuni 2026 kell 13:54:55.002 UTC)
  • mingid tegevused käivitatakse ettenäidatud intervalliga (nt iga minuti järel kusjuures minut on pikk 60 sekundit ja * millisekundi täpsusega) - sekund on kusjuures see rahvusvaheliselt kokkulepitud sekund oma vältusega nagu ta on, tseesiumi isotoop jne (ehk SI mõõtühikute süsteemi sekund)
  • arvutis toimuvale ajaarvestusega seoses on olemas veahinnang (nt 1 ms, nt kui öeldakse et '8 juuni 2026 kell 13:54:55.002 UTC' siis kindlasti oli see vahemikus kell 13:54:55.001 kui 13:54:55.003)
  • logikirjetes on õige aeg
  • klastri komponendid ei eksi ära kuna saavad kellaajast erinevalt aru
  • saladused töötavad (nt sisselogimine, cookie, sertifikaat jms)

Üldiselt linux töötamisel ajaga on neli asjaolu, väljakutset, abivahendit jne

  • riistvaraline metronoom-loendur (nt clocksource väärtuseks on 'tsc') - loeb cpu siseseid tikseid alates süsteemi viimasest reboodist
  • metronoom-loenduri teisendamine kellaajaks (8 juuni 2026 kell 13:54:55.002 UTC moodi kujule)
  • välise kellaaja (8 juuni 2026 kell 13:54:55.002 UTC) abil süsteemi nö distsiplieerimine (korrigeerimine) - ntp, chrony, systemd-timesyncd
  • esitada süsteemile efektiivsed vahendid kellaaja küsimiseks (clock_gettime() üle vDSO)

Mõõtkavad

  • nanosekund - protsessori sees on füüsikalised võnked üksteisest ajaliselt eemal nanosekundites (nt registrite jms liitmistehe) - 'cpu cycle', cpu sisemise cache latentsus - tsc conter iseensest ei liigu SI moodi ühikutest, aga kui ajaliselt mõõte siis jäävad need liikumised nanosekunditesse
  • mikrosekund - cpu peale järgmise task saatmise otsuse tegemise aeg, arvuti tava-mälu latsentsus
  • millisekund - cpu plaanur annab cpu peal järjestikuliseks olekuks task'ile aega mõni millisekund, storage io latentsuses ok piiriks arvestatakse 4 ms tavaliselt, arvutis hoiatakse kellaaega õigena 1 ms täpsuse ümbruses tavaliselt
  • sekund - mitme node klastri õla ümberlülitus (nt keepalived abil)
  • minut - google authenticator lubab minuti sisestada koodi

Mõisted

  • loendur (ingl. k. counter)
  • clock - kasutatakse tihti counter tähenduses
  • time - kellaaeg (st mitte counter)
  • interval - ajavahemik
  • wall-clock time - rõhutab et tegeldakse kellaajaga kujul '8 juuni 2026 kell 13:54:55.002 UTC' vms
  • system time - praktiliselt sama tähendusega mis wall-clock-time (mida vastab 'date' käsk)
  • timer - seadme komponent, mille abil saab kindlaksmääratud ajahetkel tulevikus mingi tegevuse esile käivitada
  • tsc - time stamp counter
  • hpet - high precision event timer
  • ntp - network time protocol
  • nts - network time secure
  • ptp - precision time protocol

Tööpõhimõte

Üldised väited

  • füüsiline arvuti (ka vmware virtuaalne arvuti) iseenesest töötab loenduritega (counter) - counteri väärtuse suurenemisest järeldatakse aja kulgemist
  • arvuti riistvara ja süsteemi tarkvara (kernel jms) näevad omajagu vaeva counteritest wall-clock-time saamisega
  • arvuti kontekstis ajaga tegelemise puhul tekitab omajagu segadust, kas aja kulgemist käsitletakse counter või wall-clock-time põhiselt
  • arvuti kontekstis ajaga tegelemise puhul tekitab omajagu segadust, kas kõneldakse füüsilisest seadmest, millega midagi toimub või loogilise nähtusega (nö arvutustulemusega)
  • arvuti kontekstis ajaga tegelemise puhul tekitab omajagu segadust, kas suurus millega tegeldaks on loetav ja selle väärtust ei saa muuta (või ei ole kombeks muuta), või vastupidi
  • arvuti kontekstis ajaga tegelemise puhul tekitab omajagu segadust, kas suurus millega tegeldakse on millelegi sisendiks, või on millestki tuletatud

Arvuti kerneli jaoks on olemas kolm aja kulgemisega kaudsemalt ja otseselt seotud nähtust:

  • tsc (time stamp counter) - füüsiline nähtus, populaarne 'clocksource' lahendus, loendur, põhineb füüsilisel cpu registril, suureneb ühe võrra iga cpu 'clock cycle' toimimusel, väga olemas looduses st igasuguste tootjate igasugustel protsessoritel, ka paljudel virtuaalsetel
  • clock_realtime - loogiline nähtus , st kui arvutis töötav protsess tahab teada kellaaega, siis ta esitab function call'i ja vastuseks glibc ja user mode režiimis töötava cpu abil arvutatakse see üks väärtus kujul nt '8. juuli 2026 kell 15:57:04.004'
  • clock_monotonic - loogiline nähtus, st kui arvutis töötav protsess tahab teada mitte kellaaega, aga mingit sorti intervalli, siis ta esitab kaks function call'i ja vastuseks glibc ja user mode režiimis töötava cpu abil arvutatakse väärtused; kui küsida kaks korda järjestikuliselt clock_monotonic väärtust, siis nende arvude vahel ütleb mitu sekundit (või mikrosekundit vms) ajaliselt üksteisest kaugel pöördumised asuvad

20260709-linux-tootab-aeg-01.png

kus

  • joonisel on kujutatud kaks tegevuste komplekti - 1. rakendus saab teada wall-clock-time väärtuse (clock_gettime funktiooni kutsega); 2. Chrony protsess distsiplineerib linux kernel timekeeping subsystem'it ehk 'Time keeping engine'it
  • vDSO on väga oluline element linux operatsioonisüsteemis, ta on üldine nähtus - ta on tehniliselt shared object nagu mingi tavaline teek xxx.so protsessi mälus, aga vdso sünteesib iga protsessi mällu kernel; antud juhul on vdso ülesandeks efektiivselt suhelda kerneliga (tema trikk seisneb selles, et kogu aeg püsitake user space'is)
  • Time keeping engine töötab kahe sisendiga: 1. rütm/counter/vms cpu tsc registrist, 2. absoluutne kellaaeg ntp serverist (st kujul 8 juuni 2026 kell 13:54:55.002)
  • nool joonisel näitab vastuse suunda (nt application esmalt küsib st esitab clock_gettime() funktsiooni väljakutse (mida joonisel ei ole kujutatud) ja saab siis vastuse (mida joonisel kujutatakse)
  • vdso koostab tänu oma tarkusele ja kontaktile time keeping engine'iga (ja vist kaudselt ka tsc'ga) libc jaoks wall-clock-time väärtusega vastuse
  • libc annab vastuse üle application protsessile
  • põhimõtteliselt võib linux-time-keeping-engine'it distsiplineerida ka nt systemd-timesyncd protsess
  • time keeping engine on väga dünaamiline ja tark - tema juures on muutuv komplekt igasuguseid offset, kalibreerimise jms andmeid, mida oskab vdso tarkvara kasutada, et sünteesida erinevaid kellaaegu (nt wall-clock-time ehk clock_realtime)
  • linuxis ei ole kuskil nö mäluaadressi, millelt käiakse lugemas mõne taustatöö poolt seal sees hoitavat mis-kell-on väärtust (mis pidevalt muutub) - mis-kell-on vastus genereeritakse alati käigult küsimusele

Misc väited

  • CLOCK_REALTIME - nn wall clock time (nt 8 juuni 2026 kell 13:54:55.002) - allub hüpetele, nt seoses suveajale minekuga
  • CLOCK_MONOTONIC - wall clock time ajaga samas tempos liikuv aeg, st sekund on nö õige sekund, väärtus ei hüppa vaid suureneb ühtlaselt - nt arvutis juhtuvate korduvtegevuste arvestuse pidamiseks
  • põhimõtteliselt on ajaga tegelemisega muu hulgas seotud sellised kvaliteedid: 1. clock - rütm, metronoom, intervall; 2. time - wall clock time
  • timer mõiste ei ole väga aja tegelemisega käesoleva teema raames seotud - timer võimaldab kindlaksmääratud hetkel käivitada mingi tegevuse
  • platvorm st esxi host ei juhi virtuaalse arvuti CLOCK_REALTIME ega CLOCK_MONOTONIC väärtust - seda saaks teha, aga see on virtuaalse arvuti seadistustest välja lülitatud - 'vmware-toolbox-cmd timesync status' → 'Disabled'
  • kui platvorm juhiks CLOCK_REALTIME ja CLOCK_MONOTONIC väärtusi, siis tekiks võistlus chrony/ntpd/systemd-timesyncd/jt lahendustega - on ettekujutus, et virtuaalse arvuti operatsioonisüsteemi vahenditega tekib parem tulemus
  • platvorm tekitab virtuaalsesse arvutisse clocksource ressursid - 'cat /sys/devices/system/clocksource/clocksource0/available_clocksource' - 'tsc hpet acpi_pm'
  • clocksource on nö rütm
  • tsc clocksource on põhimõtteliselt protsessori register - väga täpne, väga odav kasutada jne
  • vmware omad on palju vaeva näinud, et virtuaalse arvuti tsc toimiks kvaliteetselt (füüsilisel arvutil on samuti tsc kasutusel)
  • operatsioonisüsteemi madal kiht (mitte chrony) valib välja vmware puhul - 'cat /sys/devices/system/clocksource/clocksource0/current_clocksource' - 'tsc'
  • virtuaalses arvutis töötav ntp klient protsess kasutab kahte sisendit - 1. current_clocksource (tsc) ja 2. ntp time source
  • virtuaalses arvutis töötav ntp klient protsess tekitab ühe väljundi - korrigeerib adjtime() ja clock_adjtime() abil nn 'Linux timekeeping engine' osakonda
  • Linux timekeeping engine sisaldab muu hulgas - 1. freqency correction, 2. offset, 3. tick-time conversion
  • Linux timekeeping engine tegevusest tuletatakse CLOCK_REALTIME ja CLOCK_MONOTONIC väärtused
  • tsc jt clock source'id on 'immutable'd st operatsioonisüsteemi seest mitte muudetavad
  • tsc counter on 64 bit integer - kui protsessor on 4 GHz siis siis ta teeb 4 G tikset sekundis; 64 bit counter suudab lugeda kokku 2^64 sündmust, st 2^64 / (4* 10^9) = ... = 146 aastat on wraparound aeg

Kasutamine

clock_gettime(..) funktsioon

Operatsioonisüsteemis saab kellaaja (wall-clock-time) väärtust küsida

imre@arvuti-01:~$ ldd /bin/date
	linux-vdso.so.1 (0x00007ffe62d03000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x000079fc36000000)
	/lib64/ld-linux-x86-64.so.2 (0x000079fc362de000)

imre@arvtui-01:~$ date
Thu Jul  9 10:33:44 AM EEST 2026

imre@arvuti-01:~$ ltrace date 2>&1 | grep clock_
clock_gettime(0, 0x7ffc401ed470, 0, 0x5fe5bb239490) = 0

imre@arvuti-01:~$ strace date 2>&1 | grep clock_
imre@arvuti-01:~$

kus

  • ldd näitab, et /bin/date programm sisaldab linux-vdso.so.1 tehnoloogia kasutamist
  • ltrace ehk 'library trace' esitab clock_gettime funktsiooni väljakutse
  • strace ehk 'syscall trace' ei esita clock_gettime() - st antud juhul vDSO tegutseb ja nö intercept'ib enne kui see tegevus jõuab syscall seisusse

CLOCK_MONOTONIC

root@ubuntu-2604-01:~# cat clock_monotonic.py
#!/usr/bin/python3

import time

def main():
    # Retrieve the current value of the monotonic clock (in seconds)
    monotonic_time = time.monotonic()
    print(f"Current clock_monotonic value (seconds): {monotonic_time}")

    # If you need nanosecond precision, you can use time.monotonic_ns()
    monotonic_ns = time.monotonic_ns()
    print(f"Current clock_monotonic value (nanoseconds): {monotonic_ns}")

if __name__ == "__main__":
    main()


root@arvuti-01:~# ./clock_monotonic.py
Current clock_monotonic value (seconds): 594952.69380332
Current clock_monotonic value (nanoseconds): 594952693885526

root@arvuti-01:~# echo 594952/86400 | bc
6
root@arvuti-01:~# uptime
 10:49:15 up 6 days, 21:16,  2 users,  load average: 0.09, 0.06, 0.01

kus

  • python arvutab ja monotonic esitab sekundeid arvuti käivitamisest
  • kasutatakse nt postgresql wal failide aja-põhise salvestamise lubaduse pidamisel (nt salvestada kord minutis)
  • süsteem absoluutselt väldib monotonic puhul suuna muutmist, st järgmisel korral on kell rohkem (või samapalu) kui eelmisel (korrektsiooni rakendamisel natuke võidakse venitada või suruda kokku ajutiselt sekundi pikkust arvutis võrreldes SI sekundiga)

CLOCK_REALTIME

root@arvuti-01:~# cat clock_realtime.py

#!/usr/bin/python3
import time

def main():
    # Retrieve the current value of the realtime clock (in seconds, float)
    realtime = time.time()
    print(f"Current CLOCK_REALTIME value (seconds float): {realtime}")

    # Nanosecond precision version
    realtime_ns = time.time_ns()
    print(f"Current CLOCK_REALTIME value (nanoseconds):   {realtime_ns}")

if __name__ == "__main__":
    main()

root@arvuti-01:~# ./clock_realtime.py
Current CLOCK_REALTIME value (seconds float): 1783583224.8868232
Current CLOCK_REALTIME value (nanoseconds):   1783583224887013724

root@arvuti-01:~# date
Thu Jul  9 10:47:07 AM EEST 2026

root@arvuti-01:~# echo "1783583224/(86400*365)" | bc
56

kus

  • python arvutab ja realtime esitab sekundeid alates unix epoch alguesest (1. jaanuar 1070)
  • kasutatakse logikirjete juures
  • süsteem üldiselt väldib realtime puhul suuna muutmist st kell on järgmisel hetkel vähem kui eelmisel hetkel, aga see ei ole põhimõtteliselt välistatud

TSC

Osutub, et nö oneliner abil seda ei ole hästi võimalik teha.

Kasulikud lisamaterjalid

  • TODO