Cómo verificar el estado de actividad de IO de un proceso en Linux 00 Hola, Linux
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) p>
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: p>
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: p>
# 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: