¿Cómo interoperan pdflush, kjournald, swapd, etc.?

17

Recientemente vi una pregunta que despertó este pensamiento. Realmente no pude encontrar una respuesta aquí o a través de la máquina de Google. Básicamente, estoy interesado en saber cómo se estratifica la arquitectura de E / S del kernel. Por ejemplo, ¿se kjournalddespacha a pdflushla inversa? Mi suposición es que pdflush(al ser más genérico para la E / S de almacenamiento masivo) se ubicaría en un nivel inferior y activaría el SCSI / ATA / cualquier comando necesario para realizar las escrituras y kjournaldmanejaría las estructuras de datos del sistema de archivos de nivel superior antes de escribir. Sin embargo, también podía verlo al revés, kjournaldinteractuando directamente con las estructuras de datos del sistema de archivos y pdflushdespertando de vez en cuando para escribir páginas sucias de caché de páginas en el dispositivo a través dekjournald. También es posible que los dos no interactúen en absoluto por alguna otra razón.

Básicamente: necesito alguna forma de visualizar (gráfico o simplemente una explicación) la arquitectura básica utilizada para enviar E / S al almacenamiento masivo dentro del kernel de Linux.

Bratchley
fuente
1
¿Es esto lo que estás buscando? oss.org.cn/ossdocs/linux/kernel/a1/index.html
slm
1
También hay esta presentación: séptima diapositiva en: slideshare.net/LukCzerner/local-file-systems-update
slm
1
También hay este diagrama que encontré: thomas-krenn.com/en/oss/linux-io-stack-diagram/…
slm
1
Encontré este mapa interactivo del núcleo que ayuda a mostrar cómo se combinan los diversos componentes del núcleo: makelinux.net/kernel_map
slm
1
Un recurso más, páginas 19-24: Pautas de ajuste y rendimiento de Linux . Este se ve exactamente como lo que estás buscando.
slm

Respuestas:

21

Antes de discutir los detalles con respecto a pdflush, kjournald, andkswapd`, revisemos primero un poco de historia en el contexto de qué es exactamente lo que estamos hablando en términos del núcleo de Linux.

La arquitectura GNU / Linux

La arquitectura de GNU / Linux puede considerarse como 2 espacios:

  • Usuario
  • Núcleo

Entre User Space y Kernel Space se encuentra la Biblioteca GNU C ( glibc). Esto proporciona la interfaz de llamada del sistema que conecta el kernel a las aplicaciones de espacio de usuario.

El Kernel Space se puede subdividir en 3 niveles:

  • Interfaz de llamada del sistema
  • Código de kernel independiente arquitectónico
  • Código de arquitectura dependiente

La interfaz de llamada del sistema, como su nombre lo indica, proporciona una interfaz entre glibcel núcleo y el núcleo. El Código de Kernel Independiente Arquitectónico se compone de las unidades lógicas como el VFS (Sistema de archivos virtuales) y el VMM (Administración de memoria virtual). El código dependiente arquitectónico son los componentes que son código específico de procesador y plataforma para una arquitectura de hardware dada.

Diagrama de la arquitectura GNU / Linux

                                 ss de gnu / linux arch.

Para el resto de este artículo, centraremos nuestra atención en las unidades lógicas VFS y VMM dentro del Kernel Space.

Subsistemas del kernel GNU / Linux

                                    ss de kernel com

Subsistema VFS

Con un concepto de alto nivel de cómo está estructurado el kernel GNU / Linux, podemos profundizar un poco más en el subsistema VFS. Este componente es responsable de proporcionar acceso a los diversos dispositivos de almacenamiento en bloque que finalmente se asignan a un sistema de archivos (ext3 / ext4 / etc.) en un dispositivo físico (HDD / etc.).

Diagrama de VFS

ss de vfs

Este diagrama muestra cómo un proceso write()de un usuario atraviesa el VFS y, en última instancia, desciende al controlador del dispositivo donde está escrito en el medio de almacenamiento físico. Este es el primer lugar donde nos encontramos pdflush. Este es un demonio que es responsable de enjuagar los bloques de datos y metadatos sucios al medio de almacenamiento en segundo plano. El diagrama no muestra esto, pero hay otro demonio, kjournaldque se encuentra al lado pdflush, realizando una tarea similar escribiendo bloques de diario sucios en el disco. NOTA: Bloques de diario es cómo los sistemas de archivos como ext4 y JFS realizan un seguimiento de los cambios en el disco en un archivo, antes de que esos cambios tengan lugar.

Los detalles anteriores se analizan más adelante en este documento .

Resumen de write()pasos

Para proporcionar una descripción general simple de las operaciones del sistema de E / S, utilizaremos un ejemplo en el que write()una aplicación llama a la función Space.

  1. Un proceso solicita escribir un archivo a través de la write()llamada al sistema.
  2. El núcleo actualiza la caché de la página asignada al archivo.
  3. Un subproceso de kernel pdflush se encarga de vaciar el caché de la página al disco.
  4. La capa del sistema de archivos reúne cada búfer de bloque en un bio struct( consulte 1.4.3, “Capa de bloque” en la página 23 ) y envía una solicitud de escritura a la capa de dispositivo de bloque.
  5. La capa del dispositivo de bloque recibe solicitudes de las capas superiores y realiza una operación de elevador de E / S y coloca las solicitudes en la cola de solicitudes de E / S.
  6. Un controlador de dispositivo como SCSI u otros controladores específicos del dispositivo se encargarán de la operación de escritura.
  7. El firmware de un dispositivo de disco realiza operaciones de hardware como cabeza de búsqueda, rotación y transferencia de datos al sector en el plato.

Subsistema VMM

Continuando con nuestra inmersión más profunda, ahora podemos mirar en el subsistema VMM. Este componente es responsable de mantener la coherencia entre la memoria principal (RAM), el intercambio y el medio de almacenamiento físico. El mecanismo principal para mantener la consistencia es bdflush. Como las páginas de memoria se consideran sucias, deben sincronizarse con los datos que están en el medio de almacenamiento. bdflushcoordinará con pdflushdemonios para sincronizar estos datos con el medio de almacenamiento.

Diagrama de VMM

                ss de VMM

Intercambiar

Cuando la memoria del sistema se vuelve escasa o el temporizador de intercambio del núcleo caduca, el kswapddemonio intentará liberar páginas. Mientras el número de páginas gratuitas permanezca arriba free_pages_high, kswapdno hará nada. Sin embargo, si el número de páginas gratuitas cae a continuación, kswapdcomenzará el proceso de recuperación de la página. Después de kswapdhaber marcado las páginas para la reubicación, bdflushse encargará de sincronizar cualquier cambio pendiente en el medio de almacenamiento, a través de los pdflushdemonios.

Referencias y lecturas adicionales

slm
fuente
1
Esperaré un día antes de aceptar esto como respuesta y otorgar la recompensa para que permanezca en la página de "recompensa". De esa manera, cualquiera que lo haya visto antes tiene la oportunidad de notar que ahora tiene una respuesta.
Bratchley
1
Gracias de nuevo, por cierto. Realmente hiciste todo lo posible en investigar esto.
Bratchley