Command Completion Coalescing

2009.08.30. 19:56

A nagyon terhelt szerverek (egyik) ősellensége mindig is a gépre aggatott mindenféle periféria volt. Nem elég, hogy lassúak, sosem hagyják dolgozni a kernelt, mindig akarnak valamit, megszakításokat (interrupt) generálnak.

Az egyik ilyen kritikus pont a hálózati vezérlő (pld. ethernet NIC), amely a sok apró kerett miatt tonnaszám próbálja a kernel figyelmét magára vonni és a kereteket a pufferéből továbbadni, ha nagy a forgalom. Így hiába gyors amúgy a gép, hiába tud nagy keretekkel bámulatos teljesítményt elérni, kisebb csomagokkal jelentősen visszaesik a teljesítmény.
Ezért is a PPS (Packet Per Sec) a legfontosabb egy routernél, vagy tűzfalnál, nem pedig a nyers átviteli sebesség (amivel könnyű trükközni, hiszen maximális keret/csomagméreteknél könnyen összejön a wirespeed).

A problémára az első (általam ismert) megoldás a FreeBSD ethernet pollingja volt (Luigi Rizzo által), amely lényegében lekapcsolta a NIC interrupt küldését, és néha ránézett, hogy van-e új keret, ha pedig volt, elhozta azokat.
Ez nyilvánvalóan rengeteget segített olyan esetekben, amikor már annyi interrupt volt, hogy a kernel szóhoz sem jutott (ismerős állapot volt régebben az egy processzoros, nagy hálózati forgalmat kapó gépeknél), viszont a megoldás hátránya is szembetűnő: mivel a keretek akkor kerülnek feldolgozásra, amikor egy nagyobb adagot elhozott belőlük a kernel, nem pedig akkor, amikor beérkeznek (IRQ), a feldolgozás ideje nő (késleltetés).

Később hasonló funkció került a gyorsabb (jellemzően gigabites) NIC-ekre, interrupt coalescing néven, amely ugyanezt csinálja, de a NIC firmware-ében, azaz nem keretenként próbálja célba juttatni a csomagot, hanem bizonyos feltételek szerint várva (feltorlódott csomagszám, és időzítés) többet, egy csomagban.

Korábban volt szó róla, hogy az ethernet NIC-ekhez hasonlóan a CAM-ban (a FreeBSD SCSI alrendszere) is implementálásra kerül hasonló funkció, amely a diszk IO nyomása alatt küzködő rendszereken segíthetett volna, de (úgy tudom) ebből semmi sem lett.
Jó kérdés persze, hogy mekkora létjogosultsága lett volna ennek, hiszen jó ideig úgy tűnt, hogy a diszkek egyeduralma egyhamar nem fog megdőlni, és a tárolórendszerekben az egy kontroller, egy (kevés) virtuális diszk, mögötte sok valódi diszk (RAID) elv valósul meg, legalábbis a szerverekben. Ezeknél pedig azért ritka a sok tíz-, százezer, vagy esetleg milliós nagyságrendű mozgolódás, hiszen a diszkek tranzakcionális sebessége a terhelt állapotban tipikus random IO-nál ennél jóval kevesebb.

Változott azonban némileg a helyzet, hiszen az SSD-k megjelenésével sokkal pörgősebb tranzakciók várhatók, amelyek ráadásul egyre nagyob párhuzamossággal történhetnek.

Az AHCI 1.1-es verziójában (nem ma volt) meg is jelent a fenti technológia, amit az Intel Command Completion Coalescingnek hív. A működése ugyanaz, mint az Ethernet világban: a bekapcsolt portokon egy timer számol, ha van forgalom, és ha nullára ér, megszakítást kezdeményez.

Ezt implementálta most Alexander Motin a FreeBSD-ben, aki Søren Schmidt helyett pátyolgatja mostanában a FreeBSD (S)ATA részét.

A legfontosabb paraméter, a timer a hint.ahci.X.ccc sysctl-lel szabályozható.

Érdekes lenne megnézni pár gyors SSD-vel, hogy milyen hatása van...

A bejegyzés trackback címe:

https://suckit.blog.hu/api/trackback/id/tr931349125

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.