Nahradili jsme LXCFS virtualizací v kernelu

Změnili jsme způsob virtualizace vybraných souborů v adresáři proc a místo LXCFS teď používáme virtualizaci na základě jmenných prostorů.

LXCFS je souborový systém založený na FUSE (Filesystem in Userspace), který jsme od počátku vpsAdminOS používali k virtualizaci vybraných souborů v /proc a /sys ve VPS jakožto kontejnerech.

Linux sice podporuje izolaci pomocí jmenných prostorů a limity přes cgroups, nicméně i tak by bez LXCFS ve VPS bylo možno vidět v utilitě top všechny CPU nodu, free by ukazoval využití paměti celého nodu, load average by byl vyšší než čekáte, atp. Postupem času jsme roli LXCFS zmenšovali a od kernelu 6.6.10 pro vpsAdminOS jsme ho kompletně odstranili, už není potřeba!

Náš kernel nyní obsahuje patche, které vybrané soubory v /proc virtualizují na základě jmenných prostorů a limitů z cgroups. LXCFS muselo tyto hodnoty zjišťovat z userspace čtením parametrů ze /sys/fs/cgroup a k počítání load average dokonce muselo procházet všechny procesy patřící VPS přes /proc. Čtení těchto souborů zabírá sdílené zámky, což pak zdržuje ostatní přístupy.

LXCFS taktéž fungovalo jen tam, kde je připojeno. Pokud sami uvnitř VPS pouštíte kontejnery, museli jste LXCFS dovnitř buď ručně bind-mountovat, a nebo uvnitř těchto kontejnerů hodnoty v /proc virtualizovány nebyly. Některé utility zjišťují stav systému pomocí systémového volání sysinfo a to pak LXCFS kompletně obešlo. sysinfo používá např. Busybox, nebo i samotná glibc. Na Alpine Linuxu, kde je ve výchozím stavu Busybox, tak příkaz uptime ukazoval load average celého nodu.

Na nodech se starším kernelem se můžeme podívat, jaké soubory LXCFS v poslední fázi provozu virtualizuje:

$ grep lxcfs /proc/mounts
lxcfs /proc/cpuinfo fuse.lxcfs rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other 0 0
lxcfs /proc/diskstats fuse.lxcfs rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other 0 0
lxcfs /proc/loadavg fuse.lxcfs rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other 0 0
lxcfs /proc/uptime fuse.lxcfs rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other 0 0

V minulosti zde bylo také /proc/stat, /proc/meminfo, /proc/swaps a /sys/devices/system/cpu/online. Virtualizaci využití CPU z pohledu VPS na základě CFS kvót jsme tehdy do LXCFS sami dodělávali.

Historicky jsme začínali s jednou instancí LXCFS pro všechny VPS v rámci jednoho nodu, to fungovalo v pohodě na nodech do 100 VPS. Když jsme přecházeli na nody se 300/600 VPS, jeden LXCFS proces už přestával stíhat. Krátce jsme spouštěli každému VPS vlastní instanci LXCFS, ale to se ukázalo jako velmi špatný nápad, neboť se pak 300/600 LXCFS procesů pralo o čtení z /proc a cgroups parametrů. Nakonec jsme přešli na model LXCFS worker procesů, kdy jedna instance obsluhovala max 50 VPS a poté se dle potřeby spouštěly další instance:

[root@node24.prg.vpsfree.cz]
 ~ # osctl lxcfs worker ls
NAME             ENABLED   SIZE   MAX_SIZE   CPU_PACKAGE   LOADAVG   CFS
worker.0.cpu1    true      49     50         1             true      true
worker.1.cpu1    true      50     50         1             true      true
worker.2.cpu1    true      50     50         1             true      true
worker.3.cpu1    true      50     50         1             true      true
worker.4.cpu1    true      50     50         1             true      true
worker.5.cpu1    true      48     50         1             true      true
worker.6.cpu1    true      18     50         1             true      true
worker.7.cpu0    true      50     50         0             true      true
worker.8.cpu0    true      50     50         0             true      true
worker.9.cpu0    true      50     50         0             true      true
worker.10.cpu0   true      49     50         0             true      true
worker.11.cpu0   true      50     50         0             true      true
worker.12.cpu0   true      36     50         0             true      true

node23/24.prg mají dva CPU sokety a tam ještě řešíme i to, aby VPS používalo LXCFS instanci na stejném soketu. Kanál na přenos dat mezi sokety má totiž omezenou propustnost, takže se snažíme VPS držet v rámci jednoho soketu.

Nyní tohle všechno odpadá a LXCFS jsme z vpsAdminOS kompletně odstranili. Z VPS tak vždy uvidíte virtualizované hodnoty. Pokud uvnitř VPS sami LXCFS používáte, nic se pro vás nemění a můžete jej nadále provozovat. Naše změny vás pouze abstrahují od toho, že VPS je taky jen kontejner.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *