Hogyan van a rakomány átlaga, mentsearlharbor

A kérdés feltüntetése

Nemrégiben egy nagyvállalatnál készített interjú során megkérdeztem egy egyszerű kérdést, hogy mi a Load Average. Nem tudom, mennyire helyesen válaszoltam, de rájöttem, hogy nem igazán tudom a pontos választ.
A legtöbb ember valószínűleg tudja, mit átlagos terhelés - az átlagos értéke a terhelés egy ideig a rendszer (1,5 és 15 perc). A cikk részleteit is megtudhatja. arról, hogyan kell használni. A legtöbb esetben ez a tudás is elég, hogy értékes lenne, hogy értékelje a rendszer terhelését LA, de én fizikus vagyok, és amikor látom az „átlag az időre:” Én rögtön érdekes mintavételi frekvenciát egy adott intervallumban. És amikor látom a „vár források” válik érdekessé, hogy pontosan mit és mennyi ideig kell várni, valamint hány triviális folyamat kell futtatni, hogy egy rövid ideig magas LA. És a legfontosabb dolog az, hogy ezekre a kérdésekre adott válaszok nem adnak öt percet a Google-nak? Ha érdekli ezeket a finomságokat, üdvözöljük a macskát.

Valami nincs rendben ...

Először is, definiáljuk, amit tudunk. Általában a Load Average az erőforrásokra váró CPU erőforrások átlagos száma három időintervallum egyikében. Továbbá tudjuk, hogy ez az érték normál állapotban 0 és 1 között van, és az egység a túlterhelés nélküli egymagos rendszer 100% -os terhelésének felel meg. A jövőben a rendszert egységes magrendszerként fogom megvizsgálni, mivel egyszerűbb és jobban feltáró.
Mi a baj itt?
Először. mindannyian tudjuk, hogy a számtani átlag több értéket összegével egyenlő ezeket az értékeket elosztjuk a számuk. Azoktól az információktól, amiket teljesen feltárunk, az az összeg. Ha figyelembe vesszük, várva folyamatok az egész perc, az átlagos érték megegyezik az eljárások száma percenként osztva a készüléket. Ha feltételezzük, hogy minden második - és a szám a folyamatok minden egyes számlálási tartományba csökkenthetjük, és ossza el 60. Tehát minél nagyobb a mintavételi frekvencia az adathalmaz, annál kisebb az átlagos értéket megkapjuk.
Másodszor, mit jelent "várni az erőforrásokra"? Ha futunk nagyszámú gyors folyamatok egyszerre, mindegyikük állni a sorba, és a logika egy rövid ideig LA felnőni teljesen elfogadhatatlan értékeket és a folyamatos ellenőrzés kell jegyezni állandó verseny, ami egy normális helyzet, nem.
Harmadik. egy 100% -os terhelésű egysugaras rendszerrel a Load Average értéknek 1-nek kell lennie. A rendszermag paramétereihez azonban nincs függés, bár a folyamatok száma időnként eltérhet. Ezt a kérdést el lehet távolítani a "várakozó erőforrások a folyamat" pontos meghatározásával, vagy bizonyos normalizáció jelenlétével a mag nukleáris paraméterein.

irodalom

Egy kis magi mágia

Ezekből az anyagokból láthatjuk, hogy az egyes hívott folyamatok korlátozott ideig használják a CPU használatát, a standard intel architektúránál, ez az intervallum 10 ms. Ez egy teljes század egy másodperc, és a legtöbb esetben a folyamat nem igényel sok időt. Ha azonban valamilyen folyamatot használtak rá, akkor a hardveres megszakítást hívják, és a rendszer visszanyeri a processzor vezérlését. Ezenkívül 10 másodpercenként növeli a kullancsok számlálóját (jiffies counter). Ezeket a kullancsokat a rendszer indításának pillanatától számítjuk, és minden 500 kullancsot (5 másodpercenként) a Load Average (átlagos terhelés) alapján számolunk ki.
Kód közvetlenül a számítás a sejtmagban timer.c fájlt (a kód van megadva verzió 2.4 verzióra 2.6, mindez kissé szétszórt, de a logika nem változott, akkor, remélem, túl nincs jelentős változás, de hogy őszinte legyek, a legújabb kiadások már nincs tesztelve) :

Amint láthatjuk, a három LA-értéket egymás után kiszámítjuk, de nem határozzák meg, hogy pontosan mit gondolnak és hogyan tekintik. Ez szintén nem jelent problémát, a függvénykód count_active_tasks () ugyanabban a fájlban van,

A CALC_LOAD a sched.h-ban szerepel, és számos érdekes állandót tartalmaz:

Valamennyi fent azt mondhatjuk, hogy minden 5 másodpercben mag néz ki, sok az egész folyamat egy üzemi állapotban és megszakíthatatlan (mellesleg más UNIX rendszerekben ez nem), és minden egyes folyamat növeli a számlálót FIXED_1, ami egyenlő 1<

Egy kis nukleáris bomlás

Nem, a rendszer magja nem szakad itt fel, csak a CALC_LOAD képlet, amely szerint a Load Average a radioaktív bomlás törvénye alapján készült. vagy egyszerűen exponenciális bomlás. Ez a törvény nem hasonlít egy differenciálegyenlet megoldására, vagyis minden új érték kiszámításra kerül az előzőtől, és az elemek számának csökkentése közvetlenül függ az elemek számától.
E differenciálegyenlet megoldása az exponenciális törvény:

Valójában a Load Average nem átlagérték a szokásos értelemben az aritmetikai átlagban. Ez egy diszkrét függvény, amelyet a rendszer indításakor rendszeresen kiszámítanak. Ebben az esetben a függvény értéke olyan folyamatok száma, amelyek a rendszerben exponenciális csillapítási körülmények között zajlanak.
Az ilyen konstrukciót a CALC_LOAD számítási partjának matematikai nyelvben történő újraírása révén látjuk:

2 ^ 11 számunkra ebben az esetben az egységnek felel meg, kezdetben rögzítettük, és mindenütt hozzáadtuk, az új folyamatok számát is kiszámítjuk. A, ahol T a mérési intervallum (1,5 vagy 15 perc).
Meg kell jegyeznünk, hogy egy meghatározott időintervallum és egy rögzített idő a mérések között az exponens értékeit előre lehet kiszámítani, és konstansként kell használni, amit a kódban végzünk. Az utolsó művelet - jobbra történő áthelyezés 11 bitgel megadja a Load Average szükséges értékét az alacsonyabb megrendelések eldobásával.

Most, hogy megértjük, hogyan számítjuk ki az LA-t, megpróbálhatjuk megválaszolni a cikk elején feltett kérdéseket:
1) Az átlag nem a számtani átlag átlaga, hanem a függvény átlagos értéke, amelyet a rendszer kezdetétől számított 5 másodpercen belül kell kiszámítani.
2) "A CPU erőforrásokra való várakozás" minden folyamatban van az RUNNING és UNINTERRUPTIBLE állapotban. Jelentős ugrik átlagos terhelés nem látjuk hosszan tartó nyomon követése, a pusztuló exponenciális függvény szerepet játszik (bár figyelembe véve a 1 perc alatt látható).
3) És itt az egyik legérdekesebb következtetés. A lényeg az, hogy a fenti függvény Load Average minden n értéke esetén monoton módon növekszik, ha n

Azonban az eredetileg rendelkezésre álló kérdésekre adott válaszokon felül a kód elemzése újakat is bevezet. Például egy csillapított exponens, amely a várakozási folyamatok számának csökkentésére alkalmazható? Ha figyelembe vesszük a radioaktív bomlást, akkor a sebességét csak a magok száma korlátozza, esetünkben nagyszámú folyamattal, minden lesz a CPU sávszélességében. Hasonlóképpen, ha összehasonlítjuk a kapott képletet az exponenciális törvénygel, világossá válik, hogy ahol T az adatrekord intervalluma (1,5 vagy 15 perc). Így a rendszermag-fejlesztők úgy vélik, hogy a Load Average csökkenési sebessége fordítottan arányos a mérések időtartamával, amely valamennyire értetlen, legalábbis számomra. Nos, nem nehéz szimulálni a helyzeteket, amikor a hatalmas LA értékek valójában nem jelzik a rendszer terhelését, vagy fordítva.
Végül, úgy tűnik, hogy az átlagos terhelés számítás választották simasága gyorsan csökkenti az értékét, mint egész logikus, hogy a végső számok, de nem jeleníti meg a tényleges folyamat. És ha valaki magyarázni, hogy miért a kiállító és miért ebben a formában, akkor nagyon méltányol.

Kapcsolódó cikkek