6.4. Configuración
Una de las primeras decisiones que deberá tomar, será decidir qué programador de E/S va a utilizar. Esta sección proporciona una visión general de cada uno de los programadores principales para ayudarle a decidir cuál es el mejor para su carga de trabajo.
6.4.1. Cola de reparto justo (CFQ)
CFQ intenta ser algo justa al programar las decisiones de E/S con base en el proceso que inició la E/S. Hay tres clases diferentes de programación provistas: tiempo-real (RT), mejor-esfuerzo (BE), e inactiva. Una clase de programación puede ser asignada de forma manual a un proceso con el comando
ionice
o asignada de forma programática con la llamada del sistema ioprio_set
. Los procesos se sitúan de forma predeterminada en la clase de programación de mejor-esfuerzo. Las clases de programación de tiempo-real y el mejor-esfuerzo se subdividen en ocho prioridades de E/S dentro de cada clase, la prioridad superior es 0 y la prioridad inferior es 7. Los procesos en la clase de programación del tiempo se programan de una forma más agresiva que los procesos de mejor-esfuerzo e inactivos, por lo tanto cualquier E/S en tiempo-real programada siempre se realizará antes de E/S de mejor-esfuerzo o inactiva. Esto significa que la prioridad de E/S de tiempo-real no otorgará recursos a las clases de mejor-esfuerzo e inactivas. El mejor-esfuerzo de programación es la clase de programación predeterminada y 4 es la prioridad predeterminada dentro de esta clase. Los estados en clase de programación inactiva solo se sirven cuando no hay otra E/S pendiente en el sistema. Por lo tanto, es muy importante establecer a inactiva únicamente la clase de programación de E/S de un proceso, si E/S del proceso no se requiere de ninguna manera para continuar.
CFQ es justa al asignar una porción del tiempo a cada uno de los procesos de E/S. Durante su porción de tiempo, un proceso puede tener (de forma predeterminada) hasta 8 solicitudes al aire. El programador trata de anticipar, con base en los datos históricos, si una aplicación entregará más E/S en un futuro cercano. Si se espera que un proceso entregue más E/S, entonces CFQ estará inactiva, esperando dicha E/S, incluso si hay otros procesos de E/S que esperan ser entregados.
Debido a la inactivación realizada por CFQ, no suele ser un buen ajuste para hardware que no sufre una multa de larga búsqueda, tal como matrices de almacenamiento externo rápidas o discos en estado sólido. Si se requiere usar CFQ en dicho almacenamiento (por ejemplo, si desea usar el programador de E/S de peso proporcional de cgroup), deberá ajustar algunos parámetros para mejorar el rendimiento de CFQ. Establezca los siguientes parámetros en los archivos del mismo nombre localizados en
/sys/block/dispositivo/queue/iosched/
:
slice_idle = 0 quantum = 64 group_idle = 1
Cuando se establece
group_idle
a 1, aún existe el potencial para paradas de E/S (donde el almacenamiento de back-end no esté ocupado debido a inactividad). Sin embargo, estas paradas serán menos frecuentes que inactivas en cada cola en el sistema.
CFQ no es un programador de E/S de conservación de no-trabajo, lo cual significa que puede estar inactivo incluso cuando hay solicitudes pendientes. El apilamiento de programadores de conservación de no-trabajo puede introducir varias latencias de ruta de E/S. Un ejemplo de cada pila es el uso de CFQ por encima de un RAID de hardware de host. El controlador de RAID puede implementar su propio controlador de conservación de no-trabajo, causando así demoras en dos niveles de la pila. Los programadores de conservación de no-trabajo operan mejor cuando tienen tantos datos como sea posible para fundamentar sus decisiones. En el caso de apilamiento de dichos algoritmos de programación, el programador que está más al fondo, solamente verá lo que el programador superior envía abajo. Por lo tanto, la capa inferior verá un patrón de E/S que no representa del todo la carga de trabajo real.
Ajustables
back_seek_max
- Las búsquedas en retroceso no suelen tener un buen rendimiento, ya que incurren en mayor demora que las búsquedas anticipadas al reubicar las cabezas. Sin embargo, CFQ las realizará, si son lo suficientemente pequeñas. Este ajustable controla la distancia máxima en KB que el programador de E/S permitirá en búsquedas en retroceso. La predeterminada es
16
KB. back_seek_penalty
- Debido a la ineficacia de búsquedas en retroceso, la multa se asocia con cada una de ellas. La multa es un multiplicador; por ejemplo, considere una cabeza de disco en una posición de 1024KB. Asuma que hay dos solicitudes en la cola, una a 1008KB y otra a 1040KB. Las dos solicitudes son equidistantes a la posición de la cabeza actual. Sin embargo, después de aplicar la multa de búsqueda en retroceso (predeterminada: 2), la solicitud a una posición posterior en disco estará dos veces más cerca de la solicitud anterior. Por lo tanto, la cabeza avanzará.
fifo_expire_async
- Este ajustable controla el tiempo que lleva una solicitud async sin servicio. Después del tiempo de expiración, (en milisegundos), una solicitud async sin servicio será trasladada a la lista de envío. El predeterminado es
250
ms. fifo_expire_sync
- Es el mismo ajustable fifo_expire_async, para solicitudes en sincronía (lectura y escritura O_DIRECT). El predeterminado es
125
ms. group_idle
- Si está configurado, CFQ se inactiva en el último proceso entregando E/S en un cgroup. Se debe configurar a
1
cuando se usan cgroups de E/S de peso proporcional y se estableceslice_idle
a0
(típicamente se realiza en almacenamiento rápido). group_isolation
- Si el aislamiento de grupo se activa (establece a
1
), proporciona un aislamiento mayor entre grupos en gasto de rendimiento. Por lo general, si el aislamiento del grupo se desactiva, se hace justicia para las cargas de trabajo secuenciales únicamente. Al habilitar el aislamiento de grupos se hace justicia tanto a las cargas de trabajo secuenciales como a las aleatorias. El valor predeterminado es0
(inhabilitado). ConsulteDocumentation/cgroups/blkio-controller.txt
para obtener mayor información. low_latency
- Cuando la latencia baja está habilitada (
1
), CFQ intenta proporcionar un tiempo máximo de espera de 300 ms para cada proceso que emite E/S en un dispositivo. Esto favorece la justicia en el rendimiento. Al inhabilitar la latencia baja (0
) se ignora la latencia de destino, lo cual permite que cada proceso en el sistema obtenga una porción de tiempo completo. La latencia baja es la predeterminada. quantum
- El quantum controla la cantidad de E/S que CFQ enviará al almacenaje al mismo tiempo, esencialmente la profundidad de cola de dispositivo que se predetermina a
8
. El almacenamiento puede soportar mucha más profundidad de cola, pero el aumento dequantum
también tendrá un impacto negativo en la latencia, sobre todo en la presencia de grandes cargas de trabajo de escritura secuenciales. slice_async
- Este ajustable controla el tiempo asignado a cada proceso que se realiza E/S asíncrona (escritura en búfer). Por defecto, se predetermina a
40
ms. slice_idle
- Especifica el tiempo que CFQ debe estar inactivo mientras espera las siguientes solicitudes. El valor predeterminado en Red Hat Enterprise Linux 6.1 y anterior es
8
ms. En Red Hat Enterprise Linux 6.2 y posterior, el valor predeterminado es0
. El valor de cero mejora el rendimiento de almacenaje de RAID externo al retirar todo lo inactivo a nivel de cola y árbol de servicios. Sin embargo, un valor de cero puede degradar el rendimiento en almacenamiento interno non-RAID, puesto que aumenta el número total de búsquedas. Para almacenaje non-RAID, recomendamos que el valor deslice_idle
sea mayor que 0. slice_sync
- Este ajustable dicta la porción del tiempo asignado al proceso que se emite E/S en sincronía (lectura o escritura directa). La predeterminada es
100
ms.