Runtime változtatható I/O ütemező a 2.6-os kernelben

Címkék

A 2.5-ös (pontosabban a 2.6.0-testX) fejlesztői kernelben számos erőfeszítés történt az I/O alrendszer jobbátételére. Ennek a munkának az egyik iránya az I/O ütemező - más néven "elevator" - működésének csiszolása volt. Az I/O ütemező feladata az, hogy megkísérelje a blokk I/O műveleti kéréseket olyan sorrendbe állítani, hogy az a legjobb teljesítményt adja. Mivel az operációs rendszerek felhasználása széleskörű (kezdve a PDA-któl, a desktop gépeken keresztül egészen a több processzoros kiszolgálókig), nyilvánvaló, hogy egy univerzális ütemező nem adhat maximális teljesítményt a legkisebb géptől a legnagyobbig. Ezért aztán nem is meglepő, hogy több fejlesztő több irányban indult el, és ennek eredményeképpen több "elevator" kód is született.

Ilyen elevator az ún. "deadline", amely megpróbálja minimalizálni a "seek"-eket, miközben gondoskodik arról, hogy ne várakozzon kérés tovább, mint egy megadott időperiódus. Az "anticipatory" scheduler megáll azután, hogy befejezte az olvasási műveletet, feltételezve, hogy egy másik közeli olvasási kérés felbukkan hamarosan. Aztán itt CFQ ("completely fair queueing") ütemező, amelyik megpróbálja egyenlő részre felosztani a rendelkezésre álló I/O sávszélességet a processzek között. Vagy a "noop" ütemező, amely elsősorban olyan eszközökhöz készült (memória-alapú eszközök) amelyek nem igazán profitálnak az előzőekben felsorolt ütemező logikákból.Ez szép, csak egyetlen gond volt eddig. Az adminisztrátornak nem volt lehetősége könnyen váltogatni az I/O ütemezők között. A rendszer I/O ütemező úgy lett tervezve, hogy boot időben az "elevator=X" paraméterrel meg lehet "kérni" a kernelt, hogy melyik schedulert használja. Ezzel egy baj van, hogy a választás az összes meghajtóra vonatkozik, és a későbbiekben nem lehet megváltoztatni (csak újraindítással). Ez a megkötés nehézkessé teszi a különböző ütemezők különböző terhelések alatti vizsgálatát, és nem teszi lehetővé, hogy különböző meghajtókhoz különböző ütemezőt használjunk.

Ezért Nick Piggin kiadott egy patchet, amely lehetővé teszi az I/O scheduler futásidőben történő módosítását. A patch segítségével a /sys/block/*/queue alatt található új "io_scheduler" sysfs attribútumon keresztül lehet az ütemezőt változtatni. A változtatáshoz egyszerűen bele kell írni az ütemező nevét az atrribútumba. Például, ha a CFQ-t akarjuk beállítani az első SCSI meghajtóra, akkor az így néz ki:

  • echo cfq >/sys/block/sda/queue/io_scheduler

A használható értékek: as, deadline, noop, cfq. Az ütemező váltáshoz időre van szükség (meg kell állítani és ki kell üríteni az I/O várakozási sort), így nem egészséges dolog mondjuk CD írás közepén I/O ütemezőt váltani. Viszont hasznos lehet mondjuk a rendszer tesztelésére különböző terhelések alatt, vagy különböző meghajtók különböző logika szerinti vezérléséhez.

Nick levele itt.