¿Es posible ver en Linux cuántas solicitudes de lectura y escritura desde el espacio de usuario terminan causando aciertos y errores de caché para dispositivos de bloque?
Puede desarrollar su propio script SystemTap . Debe tener en cuenta los siguientes dos subsistemas:
El desarrollo de SystemTap lleva algo de tiempo para aprender. Si es un desarrollador moderado y tiene un buen conocimiento de Linux, debería hacerlo en 3-4 días. Sí, lleva tiempo aprender, pero estará muy contento con los resultados: SystemTap le brinda la oportunidad de colocar (de forma segura) las sondas en casi cualquier lugar del kernel de Linux.
Tenga en cuenta que su núcleo debe tener soporte para cargar y descargar módulos del núcleo. La mayoría de los núcleos en existencia hoy en día lo admiten. También necesitará instalar los símbolos de depuración para su núcleo. Para mi sistema Ubuntu, esto fue tan fácil como descargar varios cientos de MB .deb, que el equipo de desarrollo del kernel de Ubuntu compiló para mí. Esto se explica en la página Wiki SystemtapOnUbuntu , por ejemplo.
PD Tome el enfoque de SystemTap solo si no tiene otra solución, porque es un marco totalmente nuevo que debe aprender, y que cuesta tiempo / dinero y, a veces, frustración.
Seguí adelante y escribí un script stap 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.
fuente
semantic error: unable to find member 'bi_size' for struct bio (alternatives: bi_next bi_bdev bi_flags bi_rw bi_iter bi_phys_segments bi_seg_front_size bi_seg_back_size bi_remaining bi_end_io bi_private bi_ioc bi_css bi_integrity bi_vcnt bi_max_vecs bi_cnt bi_io_vec bi_pool bi_inline_vecs): operator '->' at /usr/share/systemtap/tapset/linux/ioblock.stp:113:20 source: size = $bio->bi_size ^ Pass 2: analysis failed. [man error::pass2]
pueden ayudarme?/ proc / slabinfo es un buen comienzo, pero no le brinda toda la información que está buscando (no se deje engañar por los porcentajes de aciertos / errores en sistemas con múltiples núcleos y estadísticas habilitados; eso es otra cosa). Hasta donde sé, no hay una manera de extraer esa información en particular del núcleo, aunque no debería ser terriblemente difícil escribir un poco de código.
Editar: http://www.kernel.org/doc/man-pages/online/pages/man5/slabinfo.5.html
fuente
Ahora está la utilidad cachestat del paquete perf-tools .
El autor también enumera algunas alternativas (posiblemente más crudas) que las personas usan:
fuente
Si está interesado en la relación IO hit / miss de un proceso específico, un enfoque simple pero muy efectivo es leer el
/proc/<pid>/io
archivo.Aquí encontrará 4 valores clave:
rchar
: el número total de bytes de lectura desde el punto de vista de la aplicación (es decir, sin diferencia entre la lectura satisfecha desde el almacenamiento físico en lugar de la memoria caché)wchar
: como arriba, pero sobre bytes escritosread_bytes
: los bytes realmente leen del subsistema de almacenamientowrite_bytes
: los bytes realmente escritos en el subsistema de almacenamientoDigamos que un proceso tiene los siguientes valores:
El índice de pérdida de caché de lectura (en bytes) es
100*200000/1000000 = 20%
, y el índice de aciertos es100-20 = 80%
Sin embargo, hay un problema: el
rchar
valor incluye algo como tty IO, por lo que para los procesos que leen / escriben mucho desde / hacia una tubería, el cálculo anterior será sesgado, informando una relación de aciertos más alta que la efectiva.fuente