Autor: Joel Barrios Dueñas
Correo electrónico: darkshram en gmail punto com
Sitio de Red: https://www.alcancelibre.org/

Licencia de este documento: Creative Commons Reconocimiento-NoComercial-CompartirIgual 2.1

© 1999-2024 Joel Barrios Dueñas. Usted es libre de copiar, distribuir y comunicar públicamente la obra y hacer obras derivadas bajo las condiciones siguientes: a) Debe reconocer y citar al autor original. b) No puede utilizar esta obra para fines comerciales (incluyendo su publicación, a través de cualquier medio, por entidades con fines de lucro). c) Si altera o transforma esta obra o genera una obra derivada, sólo puede distribuir la obra generada bajo una licencia idéntica a ésta. Al reutilizar o distribuir la obra, tiene que dejar bien claro los términos de la licencia de esta obra. Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los derechos de autor. Los derechos derivados de usos legítimos u otras limitaciones no se ven afectados por lo anterior. Licencia completa en castellano. La información contenida en este documento y los derivados de éste se proporcionan tal cual son y los autores no asumirán responsabilidad alguna si el usuario o lector hace mal uso de éstos.

Introducción.

Desde hace algunos años, la mayoría de las versiones recientes de distribuciones Linux han adoptado de modo predeterminado los planificadores de E/S con múltiples colas de procesos. Utilizar éstos ―en lugar de los antiguos planificadores de E/S de una única cola de procesos― hace que mejore considerablemente el rendimiento de las unidades de almacenamiento SATA, SAS, SSD y NVMe.

Hasta hace unos pocos años, los planificadores de E/S en Linux se limitaban a cbq, deadline y noop. Durante muchos años funcionaron muy bien para uso general, discos duros SATA (cfq en escritorios y deadline en servidores), unidades SAS (noop en casi todos los casos) y unidades NVMe y SDD (noop en todos los casos). Gestionaban una única cola de procesos dando prioridades de acuerdo al planificador de E/S seleccionado.

La complejidad de las aplicaciones y el actual uso de datos hicieron que los planificadores de una única cola de procesos se volvieran insuficientes. Fue partir de la versión 4.12 que el núcleo de Linux tuvo una mejora radical: los planificadores de entrada/salida (E/S) con múltiples colas: bfq, kyber, mq-deadline y none.

Los planificadores de E/S de una única cola tienen justamente éso: una única cola de solicitudes de E/S en espera por cada unidad de almacenamiento. Las unidades giratorias están limitadas físicamente para atender una sola solicitud a la vez, por lo que internamente slo tienen una cola. Para estos dispositivos en máquinas más antiguas, tenía sentido que los planificadores de E/S también tuvieran una única cola.

El hardware avanzado trajo consigo un mayor número de núcleos de CPU, así como unidades individuales que podían funcionar en varias solicitudes en paralelo. Los planificadores de múltiples colas ayudan con ambos aspectos.

Tener múltiples núcleos de CPU introdujo más contención de bloqueo al trabajar con las colas de E/S. La creación de una cola por núcleo permitió que la mayoría de las interacciones de bloqueo se retrasaran hasta enviar solicitudes a la unidad y eliminó la mayor parte de la contención de bloqueo. Si la unidad también admite múltiples colas, permite que se haga menos trabajo fusionando las colas del núcleo antes de enviar solicitudes a las unidades.

Los núcleos modernos ahora usan planificadores de múltiples colas de forma predeterminada, incluso para dispositivos que tienen una sola cola de hardware.

¿Qué planificadores de E/S se utilizan actualmente?

Los planificadores de E/S actuales son BFQ, Kyber, MQ-Dealine y None.

BFQ.

BFQ (Budget Fair Queueing o cola de espera de presupuesto justa) es un planificador de E/S de participación proporcional que asocia cada proceso con un peso. Basándose en el peso, éste decide después cuánto del ancho de banda de E/S asignar a un proceso. Ideal para discos duros SATA en sistemas de escritorio.

Kyber.

Kyber es un planificador de E/S desarrollado por Facebook. Fue diseñado para dispositivos rápidos de múltiples colas de procesos y es relativamente simple. Tiene dos colas de solicitudes:

  1. Solicitudes sincrónicas (por ejemplo, lecturas bloqueadas)
  2. Solicitudes asíncronas (por ejemplo, escrituras)

Kyber tiene límites estrictos en el número de operaciones de solicitud enviadas a las colas. En teoría, ésto limita el tiempo de espera para que se envíen las solicitudes y ―por lo tanto― debería proporcionar un tiempo de finalización rápido para las solicitudes que son de alta prioridad.

Mq-deadline.

Mq-deadline es una adaptación del antiguo planificador de E/S deadline, pero diseñada para dispositivos que permiten múltiples colas de procesos. Ofrece un buen rendimiento con carga de CPU bastante baja en dispositivos de almacenamiento en servidores.

None.

None es el planificador de E/S sin operaciones de múltiples colas. Omite re-ordenar las solicitudes, minimiza los gastos generales. Ideal para dispositivos de E/S aleatorios rápidos como NVMe.

Determinar si el sistema utiliza el antiguo esquema o el nuevo esquema de planificadores de E/S.

Cabe señalar que los planificadores de E/S de múltiples colas sólo tiene sentido utilizarlos en sistemas con CPUs de cuatro o más núcleos. Tiene poco sentido utilizarlos en sistemas con CPUs relativamente antiguos de uno o dos núcleos como AMD Athlon 64, Intel Atom o Pentium Dual Core. Tiene mucho sentido en CPUs modernos que tienen al menos 4 núcleos como Intel Core i5, Core i7 y AMD Rizen 5, Rizen 7, etc., que es lo que utiliza de los equipos modernos nuevos.

Para determinar si se utilizan los planificadores de legado o los nuevos, basta abrir una terminal y ejecutar lo siguiente:

cat /sys/block/sda/queue/scheduler

Si lo anterior devuelve algo como lo siguiente:

mq-deadline kyber [bfq] none

¡Felicidades! El sistema operativo ya utiliza el nuevo esquema de planificadores de E/S.

Si en cambio regresa algo como lo siguiente:

noop [deadline] cfq 

Significa que el sistema operativo utiliza los planificadores de E/S de legado.

Si el sistema utiliza la menos el núcleo de Linux versión 4.12 o superior, es relativamente sencillo configurar el sistema para utilizar el nuevo esquema planificadores de E/S con múltiples colas de procesos.

Lo primero es validar que el núcleo Linux usado en el sistema tenga los módulos para los planificadores de E/S con múltiples colas:

grep "CONFIG_MQ_IOSCHED|BFQ"  /boot/config-$(uname -r)

La salida debe ser similar al al siguiente:

CONFIG_BFQ_GROUP_IOSCHED=y
CONFIG_IOSCHED_BFQ=y
CONFIG_MQ_IOSCHED_DEADLINE=y
CONFIG_MQ_IOSCHED_KYBER=y

Configuración del sistema para utilizar planificadores de E/S con múltiples colas de procesos.

Requisito indispensable: Núcleo de Linux versión 4.12 o superior. Recomendado 4.18 en adelante.

Si el sistema incluye lo anterior en la configuración del núcleo de Linux, sólo es necesario establecer que el módulo scsi utilice la opción use_blk_mq=1. Edite el archivo /etc/default/grub:

vim /etc/default/grub

Encontrará un contenido similar al siguiente:

GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="ALDOS"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
#GRUB_TERMINAL_OUTPUT="console"
GRUB_THEME="/boot/grub2/themes/system/theme.txt"
GRUB_CMDLINE_LINUX="rd.vconsole.keymap=es rd.locale.LANG=es_MX.UTF-8 rd.vconsole.font=latarcyrheb-sun16 rhgb quiet"
GRUB_DISABLE_RECOVERY="true"

Añada al final de los parámetros de GRUB_CMDLINE_LINUX y justo antes de las dobles comillas scsi_mod.use_blk_mq=1, como se muestra en el siguiente ejemplo:

GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="ALDOS"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
#GRUB_TERMINAL_OUTPUT="console"
GRUB_THEME="/boot/grub2/themes/system/theme.txt"
GRUB_CMDLINE_LINUX="rd.vconsole.keymap=es rd.locale.LANG=es_MX.UTF-8 rd.vconsole.font=latarcyrheb-sun16 rhgb quiet scsi_mod.use_blk_mq=1"
GRUB_DISABLE_RECOVERY="true"

Guarde el archivo y salga del editor de texto.

Actualice la configuración de grub2 ejecutando lo siguiente:

grub2-mkconfig -o /boot/grub2/grub.cfg

Si en este momento reinicia el sistema, éste utilizará el nuevo esquema de planificadores de E/S. Seguramente se utilizará de modo predeterminado mq-dealine para todas las unidades de almacenamiento, lo cual sólo es apropiado y práctico sólo en servidores. A fin de utilizar el planificador de E/S bfq, que es el que proporciona el mejor rendimiento a los sistemas de escritorio, el método recomendado es configurar éstos desde el el gestor de dispositivos (udev).

Genere un nuevo archivo denominado /etc/udev/rules.d/60-scheduler.rules:

vim /etc/udev/rules.d/60-scheduler.rules

Añada el siguiente contenido que es adecuado para sistemas de escritorio:

# Establecer planificador de E/S para unidades NVMe
ACTION=="add|change", KERNEL=="nvme[0-9]*", ATTR{queue/scheduler}="none"
# Establecer planificador de E/S para unidades SSD y eMMC
ACTION=="add|change", KERNEL=="sd[a-z]|mmcblk[0-9]*", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="mq-deadline"
# Establecer planificador de E/S para discos con rotación
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="bfq"

Si se trata de un servidor, reemplace bfq por mq-deadline en la última línea.

Guarde el archivo y salga del editor de texto.

En este punto, si validó todo el procedimiento y éste está libre de errores tipográficos, puede reiniciar el sistema.

Una vez que el sistema haya reiniciado con los cambios, ejecute lo siguiente para validar el esquema de planificadores de E/S utilizado en el sistema:

cat /sys/block/sda/queue/scheduler

Si lo anterior devuelve algo como lo siguiente:

mq-deadline kyber [bfq] none

¡Felicidades! El sistema operativo ahora utiliza el nuevo esquema de planificadores de E/S y se notará una enorme diferencia en sistemas que disponen al menos de cuatro núcleos.

Bibliografía.

  1. devquant.com/articles/multi-queue-versus-single-queue
  2. phoronix.com/review/linux-412-io
  3. wiki.ubuntu.com/Kernel/Reference/IOSchedulers
  4. kernel.org/doc/html/latest/block/index.html