Todos los productos
Search
Centro de documentos

Alibaba Cloud Linux:Habilitar la función cgroup writeback

Última actualización: Sep 06, 2026

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 memcg1 y blkcg1, mientras que B pertenece a memcg2 y blkcg0.

  • Si A y B pertenecen a distintos memcg, también pueden asignarse al mismo blkcg. Por ejemplo, A pertenece a memcg1 y B a memcg2, pero ambos se asignan a blkcg2.

  • Si A y B pertenecen al mismo memcg, deben asignarse al mismo blkcg. Por ejemplo, ambos pueden pertenecer a memcg0 y blkcg3.

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.

Importante

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.

  1. Agregue el campo cgwb_v1 mediante el comando grubby para 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 comando uname -r para comprobar su versión del kernel.

    sudo grubby --update-kernel="/boot/vmlinuz-4.19.36-12.al7.x86_64" --args="cgwb_v1"
  2. Reinicie el sistema para que los cambios surtan efecto.

    sudo reboot
  3. Ejecute el siguiente comando para leer el archivo del kernel /proc/cmdline y confirme que los parámetros de línea de comandos del kernel incluyen el campo cgwb_v1. Esto habilita las interfaces blkio.throttle.write_bps_device y blkio.throttle.write_iops_device del blkcg para limitar la tasa de E/S almacenada en búfer.

    cat /proc/cmdline | grep cgwb_v1
Nota

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.

  1. Fusione los subsistemas cgroup de memoria y blkio.

    1. Edite el archivo system.conf.

      sudo vim /etc/systemd/system.conf
    2. Modifique la configuración de JoinControllers. Por ejemplo:

      JoinControllers=cpu,cpuacct net_cls,net_prio memory,blkio
    3. Presione la tecla Esc para salir del modo de edición. Luego, introduzca :wq para guardar y salir.

  2. 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
  3. Ejecute el siguiente comando para reiniciar el sistema.

    sudo reboot
  4. 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.

Nota
  • El comando dd proporciona retroalimentación rápida. Utilice el comando iostat para consultar los resultados.

  • El comando dd escribe 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 umbral blkio.throttle.write_bps_device con 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.

  1. Simule dos procesos que generen E/S. Tal como lo exigen los límites, configure primero la interfaz cgroup.procs del 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
  2. Utilice la interfaz blkio.throttle.write_bps_device del 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.
  3. Utilice el comando dd sin el parámetro oflag=sync para generar E/S asíncrona almacenada en caché.

    sudo dd if=/dev/zero of=/mnt/vdd/testfile bs=4k count=10000
  4. Utilice la herramienta iostat para consultar los resultados. Revise la columna wMB/s en 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_link

    A 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.

    1. Habilite la herramienta ftrace.

      sudo bash -c "echo 1 > /sys/kernel/debug/tracing/events/writeback/insert_memcg_blkcg_link/enable"
    2. Consulte la información de salida.

      sudo cat /sys/kernel/debug/tracing/trace_pipe

      El 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