stats speed overloaded iowait linux performance io

speed - monitoring disk io linux



Determine la cantidad de bytes "lógicos" leídos/escritos en un sistema Linux (2)

Aquí hay un script SystemTap que rastrea el IO lógico. Se basa en el script en https://sourceware.org/systemtap/SystemTap_Beginners_Guide/traceiosect.html

#! /usr/bin/env stap # traceio.stp # Copyright (C) 2007 Red Hat, Inc., Eugene Teo <[email protected]> # Copyright (C) 2009 Kai Meyer <[email protected]> # Fixed a bug that allows this to run longer # And added the humanreadable function # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. # global reads, writes probe vfs.read.return { if ($return > 0) { reads += $return } } probe vfs.write.return { if ($return > 0) { writes += $return } } function humanreadable(bytes) { if (bytes > 1024*1024*1024) { return sprintf("%d GiB", bytes/1024/1024/1024) } else if (bytes > 1024*1024) { return sprintf("%d MiB", bytes/1024/1024) } else if (bytes > 1024) { return sprintf("%d KiB", bytes/1024) } else { return sprintf("%d B", bytes) } } probe timer.s(1) { printf("reads: %12s writes: %12s/n", humanreadable(reads), humanreadable(writes)) # Note we don''t zero out reads and writes, # so the values are cumulative since the script started. }

Me gustaría determinar el número de bytes lógicamente leídos / escritos por todos los procesos a través de llamadas de sistema como read() y write() . Esto es diferente de la cantidad de bytes realmente recuperados de la capa de almacenamiento (mostrada por herramientas como iotop) ya que incluye (por ejemplo) lecturas que tocan el caché de páginas, y también difiere cuando se reconocen las escrituras: el IO de escritura lógica ocurre inmediatamente cuando se emite la llamada de write , mientras que el IO físico real puede ocurrir un tiempo después dependiendo de varios factores (Linux generalmente almacena buffers y hace el IO físico algún tiempo después).

Sé cómo hacerlo por proceso (vea esta pregunta, por ejemplo), pero no cómo obtener el recuento de todo el sistema.


Si desea utilizar el sistema de archivos /proc para los recuentos totales (y no para recuentos por segundo), es bastante fácil.

Esto funciona también en núcleos bastante antiguos (probados en Debian Squeeze 2.6.32 kernel).

# cat /proc/1979/io rchar: 111195372883082 wchar: 10424431162257 syscr: 130902776102 syscw: 6236420365 read_bytes: 2839822376960 write_bytes: 803408183296 cancelled_write_bytes: 374812672

Para todo el sistema, simplemente sume los números de todos los procesos, que sin embargo serán lo suficientemente buenos solo a corto plazo, porque a medida que los procesos mueren, sus estadísticas se eliminan de la memoria. Necesitaría la contabilidad de proceso habilitada para guardarlos.

El significado de estos archivos está documentado en el archivo de fuentes del kernel Documentation/filesystems/proc.txt :

rchar - Contador de E / S: lectura de caracteres

La cantidad de bytes que esta tarea ha provocado que se lea desde el almacenamiento. Esta es simplemente la suma de bytes que este proceso pasó a read () y pread (). Incluye cosas como tty IO y no se ve afectado por la necesidad o no de IO de disco físico real (la lectura podría haberse satisfecho desde pagecache)

wchar - Contador de E / S: caracteres escritos

El número de bytes que esta tarea ha causado, o hará que se escriba en el disco. Se aplican advertencias similares aquí como con rchar.

syscr - Contador de E / S: leer syscalls

Intente contar el número de operaciones de E / S leídas, es decir, llamadas de sistema como leer () y pread ().

syscw - Contador de E / S: escribe syscalls

Intente contar el número de operaciones de escritura de E / S, es decir, llamadas de sistema como write () y pwrite ().

read_bytes - Contador de E / S: bytes leídos

Intente contar el número de bytes que realmente causó este proceso para que se obtenga de la capa de almacenamiento. Hecho en el nivel submit_bio (), por lo que es preciso para sistemas de archivos respaldados por bloques.

write_bytes - Contador de E / S: bytes escritos

Intente contar la cantidad de bytes que este proceso causó para enviar a la capa de almacenamiento. Esto se hace al momento de ensuciar la página.

cancelled_write_bytes

La gran inexactitud aquí es truncada. Si un proceso escribe 1MB en un archivo y luego elimina el archivo, de hecho no realizará ninguna operación de escritura. Pero se habrá contabilizado como causante de 1MB de escritura. En otras palabras: el número de bytes que este proceso no ocasionó al truncar el caché de páginas. Una tarea puede causar IO "negativo" también.