Linux operatsioonisüsteemis töötab aeg

Allikas: Imre kasutab arvutit
Redaktsioon seisuga 9. juuli 2026, kell 19:44 kasutajalt Imre (arutelu | kaastöö)
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

TODO