En Alibaba Cloud Linux 2 (versión del kernel 4.19.36-12.al7 y posteriores) y en Alibaba Cloud Linux 3, la función cgroup writeback está disponible para la interfaz del kernel cgroup v1. Esta función le permite limitar la tasa de E/S almacenada en búfer.
Contexto
Los grupos de control, denominados cgroups en este tema, son una función del kernel de Linux que permite asignar recursos. Existen dos versiones: cgroup v1 y cgroup v2. Para obtener más información, consulte la sección What are Control Groups de la guía Resource Management Guide. Este tema describe cómo habilitar la función cgroup writeback en cgroup v1 para limitar la tasa de E/S almacenada en búfer de los procesos.
Límites
Después de habilitar la función cgroup writeback, asegúrese de que la asignación entre el subsistema de memoria (memcg) y el subsistema de E/S (blkcg) cumpla las reglas descritas en esta sección. Este requisito es necesario para limitar la tasa de E/S almacenada en búfer de los procesos.
La función cgroup writeback requiere que memcg y blkcg trabajen en conjunto para limitar dicha tasa. De forma predeterminada, los subsistemas de control de cgroup v1 no operan juntos. Por lo tanto, debe vincular memcg y blkcg con base en una regla específica: cada memcg debe asignarse a un único blkcg. La asignación puede ser de uno a uno o de muchos a uno, pero nunca de uno a muchos ni de muchos a muchos.
Por ejemplo, para limitar la tasa de E/S almacenada en búfer de los procesos A y B, aplique a continuación las siguientes restricciones.
Si A y B pertenecen a distintos memcg, pueden asignarse a diferentes blkcg mediante una relación de uno a uno. Por ejemplo, A pertenece a
memcg1yblkcg1, mientras que B pertenece amemcg2yblkcg0.Si A y B pertenecen a distintos memcg, también pueden asignarse al mismo blkcg. Por ejemplo, A pertenece a
memcg1y B amemcg2, pero ambos se asignan ablkcg2.Si A y B pertenecen al mismo memcg, deben asignarse al mismo blkcg. Por ejemplo, ambos pueden pertenecer a
memcg0yblkcg3.
Para evitar problemas inesperados tras habilitar cgroup writeback, configure la interfaz cgroup.procs del blkcg antes de limitar la tasa de E/S almacenada en búfer. Escriba un identificador de proceso en esta interfaz para garantizar una asignación única de blkcg. También puede usar herramientas para consultar la asignación entre memcg y blkcg. Para obtener más información, consulte Confirm the mapping between memcg and blkcg.
Durante las operaciones de administración y mantenimiento (O&M), un proceso podría moverse a otro cgroup. Según la regla de asignación, no ocurren problemas si un proceso se mueve entre memcg. Sin embargo, si se mueve entre blkcg, se genera un error. Para evitarlo, el código de la función incluye una regla: si un proceso de un blkcg activo se traslada a otro blkcg, la asignación se restablece al blkcg raíz. En ese momento, la limitación de tasa deja de funcionar, ya que normalmente no se establece un umbral de límite de tasa en el blkcg raíz.
Aunque el código del kernel incluye una regla para prevenir problemas inesperados, evite mover procesos entre blkcg durante las operaciones.
Habilitar la función cgroup writeback
La función cgroup writeback está deshabilitada de forma predeterminada en la interfaz cgroup v1. Siga estos pasos para habilitarla.
-
Agregue el campo
cgwb_v1mediante el comandogrubbypara habilitar la función.En este ejemplo, la versión del kernel es
4.19.36-12.al7.x86_64. Sustitúyala por su versión real. Ejecute el comandouname -rpara comprobar su versión del kernel.sudo grubby --update-kernel="/boot/vmlinuz-4.19.36-12.al7.x86_64" --args="cgwb_v1" -
Reinicie el sistema para que los cambios surtan efecto.
sudo reboot -
Ejecute el siguiente comando para leer el archivo del kernel
/proc/cmdliney confirme que los parámetros de línea de comandos del kernel incluyen el campocgwb_v1. Esto habilita las interfacesblkio.throttle.write_bps_deviceyblkio.throttle.write_iops_devicedel blkcg para limitar la tasa de E/S almacenada en búfer.cat /proc/cmdline | grep cgwb_v1
En un entorno de Kubernetes (k8s), después de habilitar la función cgroup writeback, también debe fusionar los subsistemas cgroup de memoria y blkio. Así se evita que la limitación de tasa falle si se mueve un proceso.
-
Fusione los subsistemas cgroup de memoria y blkio.
-
Edite el archivo system.conf.
sudo vim /etc/systemd/system.conf -
Modifique la configuración de JoinControllers. Por ejemplo:
JoinControllers=cpu,cpuacct net_cls,net_prio memory,blkio Presione la tecla Esc para salir del modo de edición. Luego, introduzca :wq para guardar y salir.
-
-
Ejecute el siguiente comando para reconstruir la imagen de disco RAM inicial. Con esto se asegura de que los cambios de configuración de systemd surtan efecto.
sudo dracut /boot/initramfs-4.19.36-12.al7.x86_64.img 4.19.36-12.al7.x86_64 --force -
Ejecute el siguiente comando para reiniciar el sistema.
sudo reboot -
Ejecute el siguiente comando para comprobar que los subsistemas de memoria y blkio se fusionaron correctamente.
ls /sys/fs/cgroup
Comprobar que cgroup writeback funciona correctamente
Este ejemplo simula dos procesos que generan E/S para comprobar que la función cgroup writeback opera correctamente.
El comando
ddproporciona retroalimentación rápida. Utilice el comandoiostatpara consultar los resultados.El comando
ddescribe datos de forma secuencial. Durante una actualización de E/S secuencial, el sistema escribe los datos en bloques de 1 MB. Por lo tanto, establezca el umbralblkio.throttle.write_bps_devicecon un valor de como mínimo 1 MB (1048576). Si define un valor inferior a 1 MB, el proceso de E/S podría bloquearse.
-
Simule dos procesos que generen E/S. Tal como lo exigen los límites, configure primero la interfaz
cgroup.procsdel blkcg.sudo mkdir /sys/fs/cgroup/blkio/blkcg1 sudo mkdir /sys/fs/cgroup/memory/memcg1 sudo bash -c "echo $$ > /sys/fs/cgroup/blkio/blkcg1/cgroup.procs" # $$ is your process ID sudo bash -c "echo $$ > /sys/fs/cgroup/memory/memcg1/cgroup.procs" # $$ is your process ID -
Utilice la interfaz
blkio.throttle.write_bps_devicedel blkcg para limitar la tasa de E/S almacenada en búfer.sudo bash -c "echo 254:48 10485760 > /sys/fs/cgroup/blkio/blkcg1/blkio.throttle.write_bps_device" # Set the disk write-back rate limit to 10 MB/s based on the device number. -
Utilice el comando
ddsin el parámetrooflag=syncpara generar E/S asíncrona almacenada en caché.sudo dd if=/dev/zero of=/mnt/vdd/testfile bs=4k count=10000 -
Utilice la herramienta iostat para consultar los resultados. Revise la columna
wMB/sen la salida. Si la tasa se limita a aproximadamente 10 MB/s, la función cgroup writeback opera correctamente.iostat -xdm 1 vdd
Confirmar la asignación entre memcg y blkcg
Utilice uno de los siguientes métodos para confirmar que la asignación entre memcg y blkcg es de uno a uno o de muchos a uno.
-
Consulte la asignación entre memcg y blkcg.
sudo cat /sys/kernel/debug/bdi/bdi_wb_linkA continuación se muestra un ejemplo de salida que indica una asignación de uno a uno entre memcg y blkcg.
memory <---> blkio memcg1: 35 <---> blkcg1: 48 -
Utilice la herramienta de monitoreo del kernel ftrace.
-
Habilite la herramienta ftrace.
sudo bash -c "echo 1 > /sys/kernel/debug/tracing/events/writeback/insert_memcg_blkcg_link/enable" -
Consulte la información de salida.
sudo cat /sys/kernel/debug/tracing/trace_pipeEl siguiente ejemplo de salida muestra
memcg_ino=35 blkcg_ino=48. Esto indica que memcg y blkcg tienen una asignación de uno a uno.<...>-1537 [006] .... 99.511327: insert_memcg_blkcg_link: memcg_ino=35 blkcg_ino=48 old_blkcg_ino=0
-