Estoy transmitiendo algunos archivos desde S3 a una instancia EC2 para obtener datos resumidos de los encabezados. Utilizo key.close(fast=True)
todas las claves que obtengo boto.s3.bucket.Bucket.list()
(biblioteca Python para acceder a S3), pero paso una referencia a las claves para poder leer partes de ellas, y esto funciona. Sin embargo, a veces aparece [Errno 24]: Demasiados archivos abiertos.
Cuando corro lsof | grep python
obtengo una variedad de estos:
python 10573 ec2-user 399u IPv4 59221 0t0 TCP ip-10-0-0-113.ec2.internal:59293->s3-1-w.amazonaws.com:https (CLOSE_WAIT)
python 10573 ec2-user 72u IPv4 60910 0t0 TCP ip-10-0-0-113.ec2.internal:37952->s3-1-w.amazonaws.com:https (ESTABLISHED)
y uno de este:
python 10573 ec2-user 91u sock 0,6 0t0 61105 can't identify protocol
¿Son estos servidores web? ¿Qué significan las columnas? Necesitaré investigar más para descubrir cómo cerrar estas conexiones en Python, pero ¿quiero cerrar estas conexiones? ¿Es más inteligente crear y reutilizar una conexión o no es factible? Descubriré el lado de Python cuando entienda más de lo que está sucediendo; esto es principalmente una pregunta sobre lo que está sucediendo.
ulimit -a
dice que el máximo de archivos abiertos es 1024 y una opción es simplemente aumentarlo. Sin embargo, quiero asegurarme de cerrar los archivos que debería.
Respuesta1
¿Son estos servidores web? [...] ¿quiero cerrar estas conexiones?
De hecho, estas son conexiones que ha realizado y debe cerrar correctamente al menos las marcadas CLOSE_WAIT
(esto necesita un paso adicional, debido ala conexión HTTPS). Si está haciendo muchas cosas relacionadas con sitios HTTPS, una limpieza adecuada debería ser suficiente para resolver este problema. Probablemente se trate can't identify protocol
de una conexión que aún no se ha configurado completamente (consulte la pregunta SF vinculada más arriba oesta pregunta SO).
¿Es más inteligente crear y reutilizar una conexión o no es factible?
Sí, y debería ser factible. Sin embargo, esa es una cuestión de programación.
¿Qué es exactamente una conexión a través de socket[?]
Un enchufe generalmente se define como an endpoint for communication
(enman 2 socket
yman 3 socket
. Depende del protocolo particular que esté utilizando.
¿Qué significan las columnas?
De acuerdo aman lsof
:
An open file may be a regular file, a directory, a block special file,
a character special file, an executing text reference, a library, a
stream or a network file (Internet socket, NFS file or UNIX domain
socket.) A specific file or all the files in a file system may be
selected by path.
La lista predeterminada de columnas lsof
es:
$ lsof | head -1
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
Parece que te falta la TID
columna (o el ID del hilo). COMMAND
y se explican por sí solos PID
. es el número del descriptor del archivo. indica que el fd tiene el número 339 (se puede encontrar en ) y tiene acceso de lectura y escritura ( ).USER
FD
399u
/proc/10573/fd/339
u
Indica TYPE
IPv4
que es un socket IPv4 ( sock
para un socket de dominio desconocido).
La DEVICE
salidapara archivos normales:
La columna DISPOSITIVO nos indica en qué dispositivo estamos trabajando. Los dos números se llaman números mayores y menores. La lista es bien conocida y documentada. Por ejemplo, el número principal 8 significa dispositivo de bloque SCSI. A modo de comparación, los discos IDE tienen un número mayor 3. El número menor indica una de las 15 particiones disponibles. Por tanto (8,1) nos dice que estamos trabajando en sda1.
(0,16), el otro dispositivo interesante enumerado se refiere a soportes sin nombre que no son dispositivos.
Para obtener una lista detallada, consulte:
http://www.kernel.org/pub/linux/docs/device-list/devices.txt
Y la lista (en realidad enhttps://www.kernel.org/pub/linux/docs/lanana/device-list/devices-2.6.txt) no es de mucha utilidad para dispositivos con un número mayor 0
.
El NAME
campo, para tales enchufes, es:
[...] the local and remote Internet addresses of a network
file; the local host name or IP number is followed by a
colon (':'), the port, ``->'', and the two-part remote
address; IP addresses may be reported as numbers or names, [...]