Como se documenta en /usr/src/linux/Documentation/block/switching-sched.txt
, el programador de E / S en cualquier dispositivo de bloque en particular se puede cambiar en tiempo de ejecución. Puede haber algo de latencia ya que todas las solicitudes del programador anterior se vacían antes de poner en uso el nuevo programador, pero se puede cambiar sin problemas incluso cuando el dispositivo está sometido a un uso intensivo.
# cat /sys/block/hda/queue/scheduler
noop deadline [cfq]
# echo anticipatory > /sys/block/hda/queue/scheduler
# cat /sys/block/hda/queue/scheduler
noop [deadline] cfq
Idealmente, habría un solo programador para satisfacer todas las necesidades. No parece existir todavía. El kernel a menudo no tiene el conocimiento suficiente para elegir el mejor programador para su carga de trabajo:
noop
es a menudo la mejor opción para dispositivos de bloque con respaldo de memoria (por ejemplo, discos RAM) y otros medios no rotacionales (flash) donde intentar reprogramar E / S es una pérdida de recursos
deadline
es un programador ligero que intenta poner un límite estricto a la latencia
cfq
intenta mantener la equidad en todo el sistema del ancho de banda de E / S
El valor predeterminado fue anticipatory
durante mucho tiempo, y recibió muchos ajustes, pero se eliminó en 2.6.33 (principios de 2010). cfq
se convirtió en el predeterminado hace algún tiempo, ya que su rendimiento es razonable y la equidad es un buen objetivo para los sistemas multiusuario (e incluso los escritorios de un solo usuario). Para algunos escenarios, las bases de datos se utilizan a menudo como ejemplos, ya que tienden a tener sus propios patrones de acceso y programación peculiares, y a menudo son el servicio más importante (entonces, ¿a quién le importa la equidad?), anticipatory
Tiene una larga historia de ser sintonizable. para obtener el mejor rendimiento en estas cargas de trabajo y deadline
pasa muy rápidamente todas las solicitudes al dispositivo subyacente.
noop
en medios no rotacionales, pero el kernel no tiene esa funcionalidad. De alguna manera tiene detección de medios no rotacionales, pero no es confiable ya que algunos discos informan erróneamente de sí mismos y aún no está conectado al código del programador de E / S de todos modos.Es posible usar una regla udev para permitir que el sistema decida sobre el programador en función de algunas características del hw.
Un ejemplo de regla udev para SSD y otras unidades no rotacionales podría verse como
dentro de un nuevo archivo de reglas udev (por ejemplo,
/etc/udev/rules.d/60-ssd-scheduler.rules
). Esta respuesta se basa en la wiki de Debian.Para verificar si los discos ssd usarían la regla, es posible verificar el atributo de activación por adelantado:
fuente
El objetivo de que el kernel admita otros diferentes es que pueda probarlos sin reiniciar; Luego, puede ejecutar cargas de trabajo de prueba a través del sistema, medir el rendimiento y luego convertirlo en el estándar para su aplicación.
En el hardware moderno de nivel de servidor, solo el noop uno parece ser útil. Los demás parecen más lentos en mis pruebas.
fuente
Puede configurar esto en el arranque agregando el parámetro "ascensor" a la línea cmd del kernel (como en grub.cfg)
Ejemplo:
Esto hará que "deadline" sea el programador de E / S predeterminado para todos los dispositivos de bloque.
Si desea consultar o cambiar el programador después de que el sistema se haya iniciado, o si desea usar un programador diferente para un dispositivo de bloque específico, le recomiendo instalar y usar la herramienta ioschedset para facilitar esta tarea.
https://github.com/kata198/ioschedset
Si está en Archlinux, está disponible en aur:
https://aur.archlinux.org/packages/ioschedset
Algunos ejemplos de uso:
El uso debe ser autoexplicativo. Las herramientas son independientes y solo requieren bash.
¡Espero que esto ayude!
EDITAR: Descargo de responsabilidad, estos son los guiones que escribí.
fuente
El kernel de Linux no cambia automáticamente el programador de E / S en tiempo de ejecución. Con esto quiero decir, el kernel de Linux, a día de hoy, no es capaz de elegir automáticamente un programador "óptimo" dependiendo del tipo de dispositivo de almacenamiento secundario. Durante el inicio o durante el tiempo de ejecución, es posible cambiar el planificador de E / S manualmente .
El planificador predeterminado se elige al inicio en función del contenido del archivo ubicado en /linux-2.6 /block/Kconfig.iosched . Sin embargo, es posible cambiar el planificador de E / S durante el tiempo de ejecución al
echo
introducir un nombre de planificador válido en el archivo ubicado en / sys / block / [DEV] / queue / planificador. Por ejemplo,echo deadline > /sys/block/hda/queue/scheduler
fuente