¿Qué es exactamente una conexión a través de socket o qué nos dice la salida de lsof?

¿Qué es exactamente una conexión a través de socket o qué nos dice la salida de lsof?

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 pythonobtengo 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 -adice 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 protocolde 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 socketyman 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 lsofes:

$ lsof | head -1
COMMAND     PID   TID    USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME

Parece que te falta la TIDcolumna (o el ID del hilo). COMMANDy 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 ( ).USERFD399u/proc/10573/fd/339u

Indica TYPE IPv4que es un socket IPv4 ( sockpara un socket de dominio desconocido).

La DEVICEsalidapara 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 NAMEcampo, 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, [...]

información relacionada