Red de conocimiento informático - Material del sitio web - Cómo verificar el estado de actividad de IO de un proceso en Linux 00 Hola, Linux

Cómo verificar el estado de actividad de IO de un proceso en Linux 00 Hola, Linux

Probé varios servidores hace algún tiempo. El tiempo de respuesta de la aplicación web fue muy lento y la carga del sistema fue relativamente alta,> 10, pero la CPU y la memoria estaban muy inactivas, por lo que sospeché que era un cuello de botella en el rendimiento. disco Vi la lectura de IO a través de vmstat e iostat. Hay mucha escritura, especialmente usando el comando iostat -x 1, puede ver intuitivamente que la utilización de IO siempre es del 100%.

Entonces, ¿qué proceso causa una IO alta? Dado que JBoss y MySQL existen en cada servidor, JBoss genera constantemente una gran cantidad de archivos de datos pequeños y genera datos para la base de datos de texto, mientras que MySQL sincroniza constantemente nuevos datos desde el Maestro. Por lo tanto, sospechamos que estos dos procesos estaban causando el alto IO, e inmediatamente después de detener JBoss y MySQL, el IO cayó al 0%. Pero todavía no podíamos determinar quién era la causa principal, por lo que buscamos una manera de ver el IO de un proceso específico.

Finalmente, encontramos dos formas de ver la actividad IO del proceso.

1. El primer método es mediante script en Python.

El método específico es guardar el siguiente contenido como un archivo de script llamado io.py y luego ejecutar el script directamente como usuario root. Verá la información que se muestra en la siguiente figura (ya que tenemos. pasado La actualización al disco duro SSD resuelve el problema de IO de MySQL, por lo que no se pueden proporcionar capturas de pantalla de MySQL. Entre ellos, el proceso con más ocurrencias y la mayor cantidad de datos es la causa principal de IO alto. Desafortunadamente, el script no puede mostrar las lecturas y escrituras de IO exactas por segundo para el proceso.

# vim io.py

# chmod +x io.py

# ./io.py

# ! /usr/bin/python

# Monitoreo de la actividad de E/S del disco por proceso

# escrito por

import sys, os, time, signal, re

clase DiskIO:

def __init__(self, pname=Ninguno, pid=Ninguno, lecturas=0, escrituras=0):

self.pname = pname

self.pid = pid

self.reads = 0

self.writes = 0

def principal ():

argc = len(sys.argv)

if argc = 1:

imprime "uso: ./iotop"

sys.exit(0)

Si os.getuid() ! = 0:

print "debe ejecutarse como root"

sys.exit(0)

signal.signal(signal.SIGINT, signal_handler)

os.system('echo 1 > / proc/sys/vm/block_dump')

imprime "TASK PID LEER ESCRITURA"

mientras es Verdadero:

os.system('dmesg -c > /tmp/diskio.log')

l = []

f = open('/tmp/diskio.log ', 'r')

línea = f.readline()

mientras que línea:

m = re.match(\

'^(\S+)\((\d+)\): (LEER|ESCRIBIR) bloque (\d+) en (\S+)', línea)

si m = Ninguno:

si no l:

l.append(DiskIO(m.group(1), m.group(2)))

línea = f.readline( )

continuar

encontrado = False

para el elemento en l:

if item.pid == m.group(2) :

encontrado = Verdadero

if m.group(3) == "LEER":

item.reads = item.reads + 1

elif m.group(3) == "WRITE":

item.writes = item.writes + 1

si no se encuentra:

l.append(DiskIO(m.group(1), m.group(2)))

línea = f.readline()

tiempo.sleep(1)

para el artículo en l:

imprime "%-10

s %10s %10d %10d" %\

(item.pname, item.pid, item.reads, item.writes)

def signal_handler(señal, marco):

os.system('echo 0 > /proc/sys/vm/block_dump')

sys.exit(0)

if __ nombre__==" __main__":

main()

2. Otro método es actualizar el kernel de Linux a >=2.6.20 e instalar el software iotop.

Aunque Este cambio no funcionará en entornos de producción, ya que RHEL 5.6 y 5.7 tienen kernels más antiguos que 2.6.20, pero los resultados que muestra son muy precisos, por lo que vale la pena intentarlo específicamente para las nuevas máquinas y entornos de prueba que están en línea. De la siguiente manera:

Descargue y actualice el nuevo kernel (>=2.6.20) y active las opciones TASK_DELAY_ACCT y TASK_IO_ACCOUNTING al compilar

Descomprima el kernel e ingrese a la interfaz de configuración:

# wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.39.tar.gz

# tar jxvf linux- 2.6.39 .tar.gz

# mv linux-2.6.39 /usr/src/

# cd /usr/src/linux-2.6.39

# make oldconfig // Usando make oldconfig, puedes heredar la configuración del kernel antiguo, ahorrándote muchos problemas

# make menuconfig

Selecciona la opción "Configuración general" - habilitar el almacenamiento por tarea /O contabilidad

# vim .config

Eliminar el comentario #CONFIG_SYSFS_DEPRECATED_V2 no está configurado en y, es decir,

Guardar el. kernel, luego compilar el kernel:

# make

# make module

# make module_install

# make install

Modificar el valor predeterminado para su uso Inicio del nuevo kernel:

# vi /boot/grub/grub.conf:

default=0

Copiar el nuevo archivo de configuración del kernel en el directorio /boot:

# cp /usr/src/linux-2.6.39/.config /boot/config-2.6.39

Reinicie el servidor :

# reboot

# uname -r

2.6.39

Una vez completado el reinicio, verifique si la versión del kernel es correcto.

La instalación del código fuente de iotop requiere Python 2.7.2 (>= 2.5):

# wget http://www.python.org/ftp/python/2.7.2 / Python-2.7.2.tgz

# tar xzvf Python- 2.7.2.tgz

# cd Python-2.7.2

# ./configure

# make; make install

Descarga e instala iotop:

# wget http://guichaz.free.fr/iotop/files/iotop-0.4 4.tar.bz2

# tar - xjvf iotop-0.4.4.tar.bz2

# cd iotop-0.4.4

# configuración de python. .py build

# python setup.py install

Luego puedes usar iotop para ver la información que se muestra a continuación: