Als je Linux als server gebruikt, is het van belang dat hij het ook een beetje lekker doet. Om die reden zou elke beheerder aandacht moeten besteden aan de prestaties van die server. In dit artikel lees je wat de rol is van de I/O scheduler op de performance van Linux. 

Voordat we kijken wat de beste wijze is om de I/O scheduler in te stellen voor optimale prestaties van Linux, is het de moeite waard om te bespreken hoe de opslag van gegevens op Linux normaliter plaatsvindt. Ooit, lang geleden, had elke server zijn eigen disks, al dan niet door middel van RAID geconfigureerd. De I/O schedulers die door de Linux kernel worden aangeboden, zijn ontworpen in die tijd. Tegenwoordig is de manier waarop gegevens naar storage geschreven worden behoorlijk veranderd. Vaak zit er eerst een hypervisor tussen, zoals VMware. Daarnaast wordt doorgaans ook gebruik gemaakt van een SAN dat zorgt dat gegevens centraal opgeslagen worden. Dit verandert ook de manier waarop Linux de opslag aan moet spreken. 

De I/O scheduler is het Linux kernel onderdeel dat I/O requests afhandelt. Hierbij kan gebruik gemaakt worden van optimalisatie-instellingen, maar I/O requests kunnen ook rechtstreeks worden doorgestuurd. Waar het in het verleden de moeite waard was om de datastroom te optimaliseren, is dat op moderne Linux distributies veel minder het geval.

Op huidige Linux kernels zijn drie instellingen die gebruikt worden voor de I/O scheduler. De standaard instelling is CFS, wat staat voor ‘Complete Fair Queuing’. Hierbij probeert de I/O scheduler de aandacht voor read requests evenredig te verdelen met de aandacht voor write requests, zodat beiden gelijkwaardig afgehandeld worden. Omdat CFQ een zeer veilige optie is, is het ook de standaard oplossing op vrijwel elke nieuw geïnstalleerde Linux machine. 

Voor specifieke workload werkt CFQ echter minder goed. Dit geldt vooral voor servers. Waar een webserver wellicht veel meer leest dan schrijft, doet een database server vaak het tegenovergestelde. Als dat voor een server het geval is, zie je op die server vaak een hoge wait state zoals weergegeven in bijvoorbeeld de top utility. We hebben het dan over de wa parameter die je in de derde regel van de top output ziet, de regel waar CPU belasting wordt weergegeven. Als je ziet dat je server onder belasting ver boven 20% uit komt voor deze parameter, verbetert I/O scheduler tuning de prestaties van de server significant. 

 

Rechtstreeks naar de hardware

De instelling die je op moderne configuraties als eerste zou moeten proberen, is noop (no operation). Wanneer deze scheduler wordt gekozen, worden alle I/O requests rechtstreeks doorgestuurd naar de storage zonder dat enige vorm van optimalisatie plaatsvindt. Dit is een nuttige instelling en de gedachte hierachter is dat de storage zelf zorgdraagt voor het optimaal afhandelen van I/O requests. Deze instelling zou het in theorie beter moeten doen als je server gevirtualiseerd in VMware draait, rechtstreeks wegschrijft naar een SAN of gebruik maakt van interne SSD schijven. In de praktijk blijkt dat deze instelling echter niet onder alle omstandigheden het best presteert. 

Een derde instelling die soms tot goede resultaten leidt, is deadline. Deze instelling zorgt dat het schrijven van data naar de storage zo lang mogelijk uitgesteld wordt, zodat de hoeveelheid data die op de storage aankomt groter is. Hierdoor worden de schrijfacties meer effectief uitgevoerd. Deze instelling moet absoluut niet gebruikt worden op servers waar veel gelezen wordt, want door meer resources te reserveren voor write requests, is minder aandacht voor read requests en wordt de read performance dus minder. Als je server echter aantoonbaar lijdt onder een hoge wait status, dan zou deze instelling absoluut uitgeprobeerd moeten worden. 

 

Instellen van de scheduler

Als je hebt bepaald welke I/O scheduler het beste past bij de werklast op jouw server, dan kan deze toegepast worden voor het volledige systeem of voor specifieke devices. Soms zijn servers ingericht met meerdere schijven. Soms is er bij het inrichten van deze server rekening gehouden het met feit dat sommige van die schijven vooral leesverzoeken afhandelen, terwijl andere schijven juist gebruikt worden voor het schrijven van data. 

Of dit voor jouw server het geval is, achterhaal je met de opdracht iostat. Deze opdracht geeft een overzicht van alle storage devices: harde schijven, partities en LVM volumes en geeft per device aan hoeveel KB per seconde gelezen wordt en hoeveel per seconde geschreven wordt. Op basis van deze informatie kan je wellicht achterhalen dat de I/O eigenschappen van de verschillende devices heel anders zijn. Als resultaat worden dan verschillende parameters per device toegepast. 

Om per device de I/O scheduler in te stellen, schrijf je met echo de te gebruiken instelling weg naar het bestand /sys/block/<devicenaam>/queue/scheduler. Gebruik bijvoorbeeld echo noop > /sys/block/sda/queue/scheduler om de noop instelling weg te schrijven naar de primaire storage van je server. 

 

De instellingen persistent maken

Helaas is er geen standaard oplossing om de I/O scheduler instelling per device weg te schrijven naar configuratiebestanden. Gelukkig is het niet al te moeilijk om de instelling te automatiseren, bijvoorbeeld door gebruik te maken van een systemd unit file. Listing 1 toont aan hoe de inhoud van zo’n bestand eruit kan zien: 

 

[Unit]

Description=Set IOscheduler setting

 

[Service]

Type=oneshot

ExecStart=/usr/bin/echo noop > /sys/block/sda/queue/scheduler

ExecStart=/usr/bin/echo deadline > /sys/block/sda/queue/scheduler

 

[Install]

WantedBy=basic.target

 

Om een systemd gestandaardiseerd configuratiebestand te gebruiken, neem je bijvoorbeeld de bovenstaande tekst op in een bestand met de naam /etc/systemd/system/iosched.service. Gebruik vervolgens systemctl start iosched om de instellingen actief te maken en systemctl enable iosched om de instellingen automatisch bij het opstarten te laten activeren. 

Als de server in kwestie maar over één schijf beschikt, of als de I/O belasting consistent is over alle devices, kan de standaard instelling in GRUB gezet worden door gebruik te maken van de elevator instelling. Op een systeem dat opstart met GRUB2 en geen UEFI gebruikt, doe je dit door middel van de volgende procedure:

 

1.Open het bestand /etc/grub2/default en zoek hierin de regel die begint met linux16. Dit is de regel waarop kernel boot argumenten gespecificeerd worden.

2.Neem aan het eind van deze regel de tekst elevator=<setting> op, bijvoorbeeld elevator=noop als je de noop scheduler voor alle I/O requests in wilt stellen. 

3.Schrijf de nieuwe instellingen weg met de opdracht grub2-mkconfig -o /boot/grub2/grub.cfg en start je server opnieuw op. Na de herstart zijn de nieuwe instellingen direct actief. 

 

Tot slot [

In dit artikel hebben we gekeken naar de I/O scheduler instellingen. Hoewel dit een belangrijke instelling is, is het niet de enige instelling die te maken heeft met efficiënt afhandelen van I/O requests. Zo is er bijvoorbeeld ook het file system journal dat een significante impact heeft op de I/O afhandeling op een server. We komen hier in een later artikel op terug. Vergeet daarnaast ook de instellingen op de onderliggende lagen niet. Als VMware niet goed is ingericht, slaag je er niet in een betere I/O performance op Linux te krijgen.