Implementar proceso de monitoreo de ancho de banda de red bajo linux

  
        

Bueno, he estado haciendo pasantías en los juegos de Netease últimamente, así que parece que no he venido a escribir algo por un tiempo. . . El objetivo principal de venir a la pasantía de NetEase es saber qué está funcionando en la compañía de juegos. Después de todo, nunca antes había tocado a la compañía de juegos. . Todavía curioso. . .

Solía ​​pensar que las compañías de juegos son muy altas, y el trabajo que hacen es interesante. . Parece que no debería ser así ahora, después de todo, la mayor parte del tiempo todavía debería estar escribiendo el código lógico del juego. . .

Muy extraño. . . Siento que aunque soy un interno en una compañía de juegos, sigo haciendo mis propias cosas. . . Porque desea desarrollar un sistema de monitoreo de servidor en Python, y hay casos en los que desea monitorear el ancho de banda de la red ocupado por un proceso específico. . . Um . Buscar Python no tiene cosas preparadas para hacer esto. . Y hay menos cosas que puedes usar. . .

Pero encontré algo similar. . . Nethogs. . . Un programa específicamente diseñado para monitorear el ancho de banda de cada proceso en Linux. . .

Así que miré directamente a la implementación de su código. . . El código no es mucho. . . Escrito en c ++. . . Y es muy simple. . . Esta parte del código no se menciona específicamente aquí. . . Vamos a hablar sobre el principio de implementación de funciones. . . .

Bueno, un directorio más importante: /proc

Bueno, de hecho, es un pseudo directorio, porque no existe en el sistema de archivos real, sino una ejecución El directorio creado en ese momento, y la información guardada también es información de tiempo de ejecución, como información de proceso, información de conexión de red o algo así. . .

Ok, ahora supongamos que tenemos un proceso cuyo PID es 7140, luego podemos ir al siguiente directorio:

/proc /7140 /fd

En realidad, mire el nombre aquí Es posible adivinar qué datos se almacenan en este directorio: el descriptor de archivo abierto por el proceso actual. . . Como se muestra a continuación:


Bueno, esto debería ser muy familiar. . . Un poco de comprensión de la programación de Linux a continuación debe saber que en el programa, nuestro socket o archivo abierto corresponde a un descriptor de archivo, luego el directorio anterior guardará los descriptores de archivo en nuestro programa. . Entonces estos son en realidad enlaces, y finalmente conectados a un inodo. . . Aquí podemos ver que nuestros dos zócalos corresponden a los dos inodos de 23045 y 23046. . . .

Entonces, ¿cómo encontramos la información específica de estos dos sockets? . . ?

Bueno, ingrese el siguiente comando en el terminal: cat /proc /net /tcp

La salida que podemos obtener es la siguiente:

Aquí está toda la máquina local actual construida. Información de la Tcp. . . Dirección IP, puerto 啥. . . Finalmente también podemos ver un proyecto: inodo. . . Ese es el enlace al que está asociado el inodo. . .

Debería poder asignar el descriptor de archivo del proceso que vio anteriormente con su información de enlace específica. . .

Está bien. . . A través del proceso anterior. . Podemos obtener información sobre todas las conexiones que un proceso ha establecido. . .

Entonces el siguiente paso es cómo calcular el tráfico de su red. . .

Bueno, el método utilizado por nethogs aquí es usar libcap para capturar paquetes y luego analizar los paquetes de red para calcular el tráfico de red de cada conexión. . .
(Bueno, el código fuente de nethogs utiliza directamente una gran cantidad de código)

Bueno, aquí no es específico para enumerar el código de implementación. .

Uso de c ++ y libcap para escribir una biblioteca de extensiones de linux para python. . . El código pasó a github. . . La dirección es la siguiente:

https://github.com/2225377fjs/processNet

Copyright © Conocimiento de Windows All Rights Reserved