GNU/Linux >> Tutoriales Linux >  >> Linux

¿Hay alguna manera de obtener proporciones de aciertos/fallos de caché para dispositivos de bloque en Linux?

Solución 1:

Puede desarrollar su propio script SystemTap. Debe tener en cuenta los siguientes dos subsistemas:

  • VFS:esto representa todas las solicitudes de E/S antes de la memoria caché del búfer (es decir, absolutamente todas las solicitudes de E/S); revise las sondas "vfs.read", "vfs.write" y "kernel.function("vfs_*")"; debe filtrar los dispositivos de bloque que desea monitorear por sus respectivos números mayores y menores.
  • Bloque:esto representa todas las solicitudes de E/S enviadas a los dispositivos de bloque antes del programador de E/S (que también fusiona y reordena las solicitudes de E/S); aquí sabemos qué solicitudes se perdieron en el caché del búfer; revise la sonda "ioblock.request".

El desarrollo de SystemTap toma algún tiempo para aprender. Si es un desarrollador moderado y tiene buenos conocimientos de Linux, debería terminarlo en 3 o 4 días. Sí, se necesita tiempo para aprender, pero estará muy contento con los resultados:SystemTap le brinda la oportunidad (de manera segura) de colocar sondas en casi cualquier lugar del kernel de Linux.

Tenga en cuenta que su kernel debe tener soporte para cargar y descargar módulos del kernel. La mayoría de los núcleos estándar hoy en día admiten esto. También deberá instalar los símbolos de depuración para su kernel. Para mi sistema Ubuntu, esto fue tan fácil como descargar un archivo .deb de varios cientos de MB, que el equipo de desarrollo del kernel de Ubuntu compiló para mí. Esto se explica en la página Wiki de SystemtapOnUbuntu, por ejemplo.

PD Adopte el enfoque de SystemTap solo si no tiene otra solución, porque es un marco totalmente nuevo que debe aprender, y eso cuesta tiempo/dinero y, a veces, frustración.

Solución 2:

Seguí adelante y escribí un guión básico para esto. Hay uno en el wiki de systemtap, pero no parece ser correcto. En las pruebas básicas, esto parece bastante preciso pero YMMV.

#! /usr/bin/env stap
global total_bytes, disk_bytes, counter

probe vfs.read.return {
  if (bytes_read>0) {
    if (devname=="N/A") {
    } else {
      total_bytes += bytes_read
    }
  }
}
probe ioblock.request
{
    if (rw == 0 && size > 0)
    {
        if (devname=="N/A") { 
        } else {
          disk_bytes += size
        }
    }

}

# print VFS hits and misses every 5 second, plus the hit rate in %
probe timer.s(5) {
    if (counter%15 == 0) {
        printf ("\n%18s %18s %10s %10s\n", 
            "Cache Reads (KB)", "Disk Reads (KB)", "Miss Rate", "Hit Rate")
    }
    cache_bytes = total_bytes - disk_bytes
    if (cache_bytes < 0)
      cache_bytes = 0
    counter++
    hitrate =  10000 * cache_bytes / (cache_bytes+disk_bytes)
    missrate = 10000 * disk_bytes / (cache_bytes+disk_bytes)
    printf ("%18d %18d %6d.%02d%% %6d.%02d%%\n",
        cache_bytes/1024, disk_bytes/1024,
        missrate/100, missrate%100, hitrate/100, hitrate%100)
    total_bytes = 0
    disk_bytes = 0
}

Solución 3:

/proc/slabinfo es un buen comienzo, pero no le brinda la información que está buscando (no se deje engañar por los porcentajes de aciertos/fallos en sistemas con múltiples núcleos y estadísticas habilitadas; eso es otra cosa). Hasta donde yo sé, no hay forma de sacar esa información en particular del núcleo, aunque no debería ser terriblemente difícil escribir un poco de código para hacerlo.

Editar:http://www.kernel.org/doc/man-pages/online/pages/man5/slabinfo.5.html

Solución 4:

Ahora está la utilidad cachestat del paquete perf-tools.

El autor también enumera algunas alternativas (posiblemente más crudas) que la gente usa:

A) Estudie la tasa de errores de caché de la página usando iostat(1) para monitorear las lecturas de disco y asuma que estos son errores de caché y no, por ejemplo, O_DIRECT. De todos modos, la tasa de fallas suele ser una métrica más importante que la proporción, ya que las fallas son proporcionales al dolor de la aplicación. También use free(1) para ver los tamaños de caché.

B) Suelte el caché de la página (echo 1> /proc/sys/vm/drop_caches) y mida cuánto empeora el rendimiento. Me encanta el uso de un experimento negativo, pero esta es, por supuesto, una forma dolorosa de arrojar algo de luz sobre el uso de caché.

C) Usar sar(1) y estudiar fallas menores y mayores. No creo que esto funcione (p. ej., E/S normal).

D) Use el script SystemTap cache-hit-rate.stp, que es el número dos en una búsqueda en Internet de índice de aciertos de caché de páginas de Linux. Instrumenta el acceso a la memoria caché en lo alto de la pila, en la interfaz VFS, de modo que se puedan ver las lecturas en cualquier sistema de archivos o dispositivo de almacenamiento. Los errores de caché se miden a través de su E/S de disco. Esto también pasa por alto algunos tipos de carga de trabajo (algunos se mencionan en "Lecciones" en esa página) y llama a las proporciones "tasas".


Linux
  1. Linux:¿herramienta para medir la calidad de la entropía?

  2. ¿Hay alguna manera de inspeccionar el rpath actual en Linux?

  3. ¿Por qué no hay una API de DirectX para Linux?

  4. ¿Hay alguna forma de obtener time_t de 64 bits en programas de 32 bits en Linux?

  5. ¿Hay alguna forma de bloquear LD_PRELOAD y LD_LIBRARY_PATH en Linux?

Una nueva forma de crear interfaces de usuario multiplataforma para dispositivos Linux ARM

Comando Lsblk en Linux (Lista de dispositivos de bloque)

¿Existe un cliente de OneDrive para Linux?

¿Hay alguna manera de obtener emoji de colores en cualquier emulador de terminal en Linux?

¿Hay alguna manera de hacer que los sistemas de archivos ext usen menos espacio para ellos mismos en Linux?

¿Hay alguna manera de dejar de escribir 'sudo' para cada pequeña cosa en Linux?