Antiguo y abandonado blog de Ricardo Galli :-(

Saturday 25/12/2004

CFQ: nuevo planificador de disco del kernel Linux

Filed under: Trucos, Linux, Hackerdom — gallir @ 2:23

Seguramente los frikis ya se han dado cuenta, pero por las dudas: muy cerca de las 12 de la noche (hora mallorquina, una menos en Canarias) Linus liberó el 2.6.10.

La novedad más importante es que ya incluye al planificador de disco de Jens Axboe llamado CFQ, Complete Fair Queue. En total el 2.6.10 trae tres planificadores de E/S, el tradicional Anticipatory que es todavía el por defecto, el Deadline y el CFQ. Según las pruebas parece funcionar muy bien, especialmente cuando hay muchos procesos y se necesitan buenos tiempos de respuesta. Por ejemplo en un sistema de escritorio.

Algunas distros, como la SUSE 9 Profesional y Fedora ya traen el CFQ por defecto, pero si tenéis un kernel “vanilla” lo podéis cambiar de dos modos:

  1. Seleccionando el CFQ durante la compilación.

  2. Cambiarlo en el /sys.

En el primer caso es tan simple como seleccionar el CFQ (y no los otros) en las opciones de *Device Drivers -> Block Devices -> I/O Schedulers *.

En el segundo caso, primero podéis verificar si lo tenéis disponibles. Por ejemplo para el disco sda (se hace por cada disco, el del ejemplo es un Serial ATA):

# cat /sys/block/sda/queue/scheduler
noop [anticipatory] deadline cfq

Aquí indica que están los tres disponibles y el activo es el anticipatory. Para cambiarlo, simplemente:

# echo cfq > /sys/block/sda/queue/scheduler

Y ya lo podéis verificar:

# cat /sys/block/sda/queue/scheduler
noop anticipatory deadline [cfq]

Yo lo estoy probando desde hace un par de horas en mi ordenador de escritorio, en un portátil y también en este servidor:

gallir@mnm:~$ cat /sys/block/hda/queue/scheduler
noop anticipatory deadline [cfq]

Parece funcionar mucho mejor. Al menos es la impresión que da, sobre todo con programas que leen muchos ficheros al arranque, como el kmail o hasta el mismo make menuconfig.

Fundamentos: Cuando hay varios procesos accediendo al mismo dispositivo, asigna un intervalo de tiempo máximo a cada uno (time slice). Durante ese intervalo, cada proceso tiene acceso exclusivo a ese dispositivo. Muy similar al sistema round robin usado para planificación de procesadores.

10 Comments

  1. ¿Cómo lo podemos dejar por defecto en el arranque?

    Comment by Paco Ros — Sunday 26/12/2004 @ 15:53

  2. O quitas los otros schedulers del kernel, o haces un script que haga el echo, lo guardas en /etc/init.d y pones un enlace en /etc/rcS.d.

    Script:
    #! /bin/bash

    scheduler=cfq

    echo -n “Configurando $schedule to disks… ”
    for disk in /sys/block/*
    do
    echo -n `basename $disk` ” ”
    echo $scheduler > $disk/queue/scheduler
    done
    echo

    Comment by ricardo — Sunday 26/12/2004 @ 17:32

  3. Me olvidaba… después puedes hacer (asumiendo que el script anterior lo tienes en /etc/init.d/ioscheduler):

    update-rc.d ioscheduler start 10 S .

    Comment by ricardo — Sunday 26/12/2004 @ 17:39

  4. ¡Hola!

    ¿Que hace el “basename” de la linea

    echo -n basename $disk ” ”

    ???

    Comment by Saiyine — Monday 27/12/2004 @ 1:55

  5. Nada importante, sólo recortar el string para que en el mensaje de arranque te salga “hda hdb …” en vez de “/sys/block/hda /sys/block/hdb …”

    Comment by ricardo — Monday 27/12/2004 @ 3:51

  6. Para configurar el scheduler que queremos tan solo hay que pasar el parametro adecuado al kernel. Sacado de la documentacion del kernel, fichero Documentation/kernel-parameters.txt :

    elevator= [IOSCHED]
    Format: {”as”|”cfq”|”deadline”|”noop”}
    See Documentation/block/as-iosched.txt
    and Documentation/block/deadline-iosched.txt for details.

    Así, por ejemplo si apsamos el parámetro “elevator=cfq” ya nos utilizará ese algoritmo desde el principio.

    un saludo

    Comment by Nacx — Friday 31/12/2004 @ 3:20

  7. ¿Y no es más fácil y cómodo ponerlo en un script que puedes modificarlo cuando quieras y no estás forzado a cambiar la configuración del lilo o grub y reiniciar el sistema?

    Teniendo la posibilidad de hacerlo “on line”, me parece una tontería especificarlo en el arranque. En cosas que sólo se pueden hacer en el arranque, como el framebuffer o configuración vga, pero no es el caso.

    Comment by ricardo — Friday 31/12/2004 @ 3:26

  8. Estoy de acuerdo, aunque de este modo ya utilizas el scheduler que deseas durante el proceso de arranque. De todos modos, especificarlo en el arranque y tener un script para modificarlo en el momento que lo necesites no es incompatible.

    saludos

    Comment by Nacx — Friday 31/12/2004 @ 3:35

  9. Es verdad.

    Comment by ricardo — Friday 31/12/2004 @ 3:39

  10. tengo 2.6.9 de kernel.org, pero no tengo el archivo
    /sys/block/hda/queue/scheduler
    cuando hago un
    # make menuconfig
    y voy a *Device Drivers -> Block Devices* no encuentro la parte del IO Schedulers…
    tengo que poner 2.6.10 o me falta algun patch?
    cordiales saludos

    Comment by maxi — Thursday 13/1/2005 @ 22:50

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.

Powered by WordPress