Új patch-sorozat a Linux kernelhez: szemantika-alapú vCPU ütemezés túlfoglalt KVM-környezetekhez

Wanpeng Li, a Tencent munkatársa egy tíz részből álló patch-sorozatot küldött be a Linux kernel fejlesztői listára, amely a túlfoglalt virtualizációs környezetekben tapasztalható hatékonysági problémákat célozza meg. A javaslat két fő mechanizmust vezet be: egy vCPU-deboostert a schedulerben és egy IPI-tudatos irányított yield funkciót a KVM-ben. Ezek együttesen javítják a vCPUk közötti együttműködést, különösen akkor, amikor a virtuális processzorok gyakran várakoznak zárak feloldására, amelyeket más, éppen nem futó vCPUk tartanak. A jelenlegi yield_to() megvalósítás gyengeségei, mint a rövid távú preferencia és az IPI-kommunikáció hiányos kezelése, jelentős teljesítményveszteséget okoznak.

Új patch-sorozat a Linux kernelhez: szemantika-alapú vCPU ütemezés túlfoglalt KVM-környezetekhez

A probléma részletes elemzése és a megoldás alapelvei

Túlfoglalt virtualizációs környezetben a virtuális processzorok (vCPU-k) gyakran tétlenül várnak egy zárolt erőforrásra, miközben annak tulajdonosa sem fut, mert az ütemező nem adott neki CPU-időt. A Linux kernel ilyenkor paravirtualizált spinlockokat használ, amelyek a yield_to() függvényt hívják, hogy előnyben részesítsék a zár tulajdonosát, de ez a megoldás nem elég hatékony. Az ütemező oldalán a yield_to_task_fair() csak átmeneti előnyt biztosít, ami a hierarchikus cgroupok miatt gyorsan elveszik, így a vCPU-k gyakran egymástól veszik el a futásidőt, ami ping-pong hatást okoz. A KVM réteg kvm_vcpu_on_spin() függvénye sem kezeli megfelelően az inter-processor interruptokat (IPI-ket), így gyakran a rossz vCPU-t gyorsítja, miközben a valódi válaszvárás késik.

A javasolt fejlesztés két elemből áll: az ütemezőben egy úgynevezett „debooster” mechanizmus vruntime-büntetést ad a várakozó vCPU-knak, hogy a zár tulajdonosa hosszabb ideig előnyt élvezzen, cgroup- és EEVDF-kompatibilisen. A büntetés mértéke a sor hosszától függ, és egy debouncing trükk megakadályozza az oda-vissza váltogatást. A KVM-ben pedig bevezetik az IPI-követést, amely a legfrissebb üzenetek alapján priorizálja a címzett vCPU-t, hogy a valódi szinkronizáció gyorsabban megtörténjen.

Implementációs részletek

A teljesítménymérések Intel Xeon rendszeren, 16 fizikai mag és virtuális gépenként 16 vCPU mellett kimutatható javulást hoztak. A Dbench tesztnél két virtuális gép esetén 14,4, háromnál 9,8, négy esetén pedig 6,7 százalékos throughput-növekedés volt tapasztalható. A PARSEC Dedup esetében a gyorsulás még látványosabb, két VM-nél 47,1, háromnál 28,1 százalékos emelkedéssel, míg a VIPS teszt szintén jelentős nyereséget mutatott.

A legnagyobb előny mérsékelt túlfoglalás mellett jelentkezik, amikor csökkennek a záridők, gyorsul az IPI-válaszidő és hatékonyabbá válik a cache-használat, mindezt regresszió nélkül még nagyobb terhelésnél is. Az implementáció minimális többletterheléssel jár, meglévő zármechanizmusok alatt működik, egyszerű egész műveletekkel és futásidejű beállításokkal, például debugfs interfészen és modulparamétereken keresztül. Előnye a paravirtualizált megoldásokkal szemben, hogy nem függ a vendég operációs rendszertől, széles körben alkalmazható és könnyen telepíthető.

A patch-sorozat felépítése fokozatos: az első öt javítás az ütemező „debooster” mechanizmusát vezeti be, míg a hatodiktól a tizedikig a KVM IPI-tudatos yield logikáját. Minden lépés önállóan fordítható és tesztelhető. A jövőbeli tervek között szerepel az adaptív frissességi ablak, a többlépcsős IPI-követés és a NUMA-érzékeny büntetési rendszer, ám ezek későbbi fázisra maradnak a fejlesztés fókuszának megtartása érdekében. A megoldást Dbench, PARSEC és kernel build teszteken is validálták több konfigurációban, teljesítményromlás nélkül.