tagger tag puddletag mp3tag mac kid3 editar easytag linux scripting operating-system limit file-descriptor

tag - Verifique el límite de FD abierto para un proceso dado en Linux



puddletag (7)

Hace poco tuve un proceso de Linux que "filtró" los descriptores de archivos: los abrió y no cerró correctamente algunos de ellos.

Si hubiera monitoreado esto, podría decir, por adelantado, que el proceso estaba llegando a su límite.

¿Existe una forma agradable, Bash / Python para verificar la relación de uso de FD para un proceso dado en un sistema Ubuntu Linux?

EDITAR:

Ahora sé cómo verificar cuántos descriptores de archivos abiertos hay; Solo necesito saber cuántos descriptores de archivos están permitidos para un proceso . Algunos sistemas (como Amazon EC2) no tienen el archivo /proc/pid/limits .

Gracias,

Udi


Cuente las entradas en /proc/<pid>/fd/ . Los límites rígidos y flexibles que se aplican al proceso se pueden encontrar en /proc/<pid>/limits .


En CentOS 6 e inferior (cualquier cosa que use GCC 3), puede encontrar que ajustar los límites del kernel no resuelve el problema. Esto se debe a que hay un valor FD_SETSIZE que se establece en el momento de la compilación en uso por GCC. Para esto, deberá aumentar el valor y luego volver a compilar el proceso.

Además, es posible que esté perdiendo descriptores de archivos debido a problemas conocidos en libpthread si está utilizando esa biblioteca. Esta llamada se integró en GCC en GCC 4 / CentOS7 / RHEL 7 y esto parece haber solucionado los problemas de subprocesos.


Envoltura Python usando el excelente paquete psutil:

import psutil for p in psutil.process_iter(attrs=[''pid'', ''name'', ''username'', ''num_fds'']): try: soft, hard = p.rlimit(psutil.RLIMIT_NOFILE) cur = p.info[''num_fds''] usage = int(cur / soft * 100) print(''{:>2d}% {}/{}/{}''.format( usage, p.info[''pid''], p.info[''username''], p.info[''name''], )) except psutil.NoSuchProcess: pass


Las únicas interfaces proporcionadas por el kernel de Linux para obtener límites de recursos son getrlimit() y /proc/pid/limits . getrlimit() solo puede obtener límites de recursos del proceso de llamada. /proc/ pid /limits permite obtener los límites de recursos de cualquier proceso con el mismo ID de usuario, y está disponible en RHEL 5.2, RHEL 4.7, Ubuntu 9.04 y cualquier distribución con un kernel 2.6.24 o posterior.

Si necesita admitir sistemas Linux más antiguos, deberá obtener el proceso para llamar a getrlimit() . Por supuesto, la forma más fácil de hacerlo es modificando el programa o una biblioteca que utiliza. Si está ejecutando el programa, entonces podría usar LD_PRELOAD para cargar su propio código en el programa. Si nada de eso es posible, puede adjuntar al proceso con gdb y hacer que ejecute la llamada dentro del proceso. También puede hacer lo mismo utilizando ptrace() para adjuntar al proceso, insertar la llamada en su memoria, etc., sin embargo, esto es muy complicado de resolver y no se recomienda.

Con los privilegios apropiados, las otras formas de hacerlo implicarían mirar a través de la memoria del kernel, cargar un módulo del kernel o modificar el kernel, pero supongo que están fuera de discusión.


Puede intentar escribir una secuencia de comandos que periódicamente llame a lsof -p {PID} en un pid dado.


Usted pidió los métodos de bash / python. ulimit sería el mejor enfoque de bash (a excepción de munging a través de /proc/$pid/fd y similares a mano). Para python, podrías usar el módulo de recursos.

import resource print(resource.getrlimit(resource.RLIMIT_NOFILE))

$ python test.py (1024, 65536)

resource.getrlimit corresponde a la llamada getrlimit en un programa en C. Los resultados representan los valores actuales y máximos para el recurso solicitado. En el ejemplo anterior, el límite actual (flexible) es 1024. Los valores son valores predeterminados típicos en los sistemas Linux en estos días.


para ver los 20 primeros manejadores de archivos usando procesos:

for x in `ps -eF| awk ''{ print $2 }''`;do echo `ls /proc/$x/fd 2> /dev/null | wc -l` $x `cat /proc/$x/cmdline 2> /dev/null`;done | sort -n -r | head -n 20

la salida está en el archivo de formato, identificador de manejador, pid, cmndline para proceso

salida de ejemplo

701 1216 /sbin/rsyslogd-n-c5 169 11835 postgres: spaceuser spaceschema [local] idle 164 13621 postgres: spaceuser spaceschema [local] idle 161 13622 postgres: spaceuser spaceschema [local] idle 161 13618 postgres: spaceuser spaceschema [local] idle