Geom sched

De Diablotins.org.


Geom Scheduler
Image:brush.png
Ce document décrit l'utilisation du module geom scheduler(8) sous FreeBSD 8.X.

Geom sched (par la suite gsched) est un module de geom(8) qui ordonnance les entrées sorties disques.



Sommaire

geom sched

Sous forte charge en entrées sorties du disque, vous aurez certainement remarqué un manque de réactivité de la machine.
Non pas en raison d'un manque de CPU, mais parce que les applications sont en attente du disque.


Gsched(8) répartit la charge sur un tourniquet ( round robin) pour gérer les queues d'entrées sorties et fournir une part équitable pour chacun de leurs clients.


Pour plus d'info là dessus, voir GEOM based disk schedulers for FreeBSD.

Mise en œuvre


gsched(8) est un service d’ordonnancement de geom(8), au niveau du disque; il s'insère dans la chaîne des fournisseurs de service (provider) de geom(8).
Gsched(8) est un module du noyau qui peut-être chargé et libéré à la volée.
Il ajoute les variables kern.geom.sched au système ( en fait à geom):

david:~>sysctl -N kern.geom.sched
kern.geom.sched.expire_secs
kern.geom.sched.debug
kern.geom.sched.alg_count
kern.geom.sched.algorithms
kern.geom.sched.requests
kern.geom.sched.done
kern.geom.sched.in_flight
kern.geom.sched.in_flight_w
kern.geom.sched.in_flight_b
kern.geom.sched.in_flight_wb
kern.geom.sched.rr.wait_miss
kern.geom.sched.rr.wait_hit
kern.geom.sched.rr.queue_depth
kern.geom.sched.rr.quantum_kb
kern.geom.sched.rr.w_anticipate
kern.geom.sched.rr.bypass
kern.geom.sched.rr.quantum_ms
kern.geom.sched.rr.wait_ms
kern.geom.sched.rr.queues
kern.geom.sched.rr.units

Pout l'utiliser, il suffit simplement de suivre la page d'aide de gsched(8).

Note : l'algorithme «as» mentionné dans la page de man n'existe plus.

exemple

Mon disque est attaché au périphérique /dev/ada0:

# kldload geom_sched
# kldload gsched_rr
# geom sched insert -a rr ada0

C'est tout!

Gsched crée un provider nommé ada0.sched comme le signalent les messages de la console:

GEOM_SCHED: Initializing global data.
GEOM_SCHED: Loading: mp = 0xc8c540e0, g_sched_class = 0xc8c540e0.
GEOM_SCHED: Modevent 0.
GEOM_SCHED: Loaded module rr error 0.
GEOM_SCHED: Device ada0.sched. created.

Ce que l'on peut vérifier avec gsched(8) list

$ gsched list
Geom name: ada0.sched.
Providers:
1. Name: ada0
   Mediasize: 1000204886016 (932G)
   Sectorsize: 512
   Mode: r5w5e13
Consumers:
1. Name: ada0.sched.
   Mediasize: 1000204886016 (932G)
   Sectorsize: 512
   Mode: r5w5e13

Et dans gstat(8):

#gstat -f ada0.sched -b
dT: 1.000s  w: 1.000s  filter: ada0.sched
 L(q)  ops/s    r/s   kBps   ms/r    w/s   kBps   ms/w   %busy Name
    0     83     82    416    4.1      1    128    1.5   33.6  ada0.sched.

rc.conf

Il n'existe pas de script de démarrage pour gsched(8), vous devez donc en créer un vous même.
Je suggère celui ci dessous (que j'ai pompé), à placer dans /usr/local/etc/rc.d/gsched.

 
#!/bin/sh
 
# PROVIDE: gsched
# REQUIRE LOGIN
# KEYWORD: nojail shutdown
 
. /etc/rc.subr
 
name="gsched"
rcvar=${name}_enable
 
load_rc_config $name
 
: ${gsched_enable:="NO"}
start_cmd=${name}_start
stop_cmd=${name}_stop
 
gsched_start()
{
for device in ${gsched_devices} ; do
        gsched insert -a ${gsched_policy} /dev/${device}
done
}
 
gsched_stop()
{
for device in ${gsched_devices} ; do
        gsched destroy ${device}.sched.
done
}
 
load_rc_config $name
run_rc_command "$1"

Puis, rendez ce fichier exécutable:

chmod +x /usr/local/etc/rc.d/gsched

Ajoutez les entrées suivantes dans /etc/rc.conf:

gsched_enable="YES"
gsched_devices="ada0" #liste des disques exemple : "ada0 ada1"
gsched_policy="rr"

Résultat

Il y a une réelle amélioration de la réactivité sous forte charge en entrées sorties. C'est agréable sur une machine en desktop.

Mon cas de test :

# cd /usr/ports/editor/libreoffice
# make extract

Pendant l'extraction, lancement d'appli (firefox/claws-mail/libreoffice). Y'a pas photo c'est bien plus réactif.

Outils personnels
Projets :