Estou transmitindo alguns arquivos do S3 para uma instância do EC2 para obter dados resumidos dos cabeçalhos. Eu uso key.close(fast=True)
para todas as chaves que recebo boto.s3.bucket.Bucket.list()
(biblioteca python para acessar o S3), mas passo uma referência às chaves para que eu possa ler partes delas, e isso funciona. No entanto, às vezes recebo [Errno 24]: Muitos arquivos abertos.
Quando corro, lsof | grep python
recebo uma variedade destes:
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)
e um destes:
python 10573 ec2-user 91u sock 0,6 0t0 61105 can't identify protocol
Esses são servidores da web? O que significam as colunas? Precisarei pesquisar mais para descobrir como fechar essas conexões em python, mas quero fechar essas conexões? É mais inteligente fazer e reutilizar uma conexão ou isso não é viável? Vou descobrir o lado do python quando entender mais o que está acontecendo, isso é principalmente uma questão sobre o que está acontecendo.
ulimit -a
diz que o máximo de arquivos abertos é 1024 e uma opção é simplesmente aumentá-lo. No entanto, quero ter certeza de que estou fechando os arquivos que deveria.
Responder1
Esses são servidores da web? [...] quero fechar essas conexões?
Estas são de fato conexões que você fez, e você deve fechar adequadamente pelo menos aquelas marcadas CLOSE_WAIT
(isso precisa de uma etapa extra, por causa dea conexão HTTPS). Se você estiver fazendo muitas coisas envolvendo sites HTTPS, uma limpeza adequada deve ser suficiente para resolver esse problema. Provavelmente é can't identify protocol
uma conexão que ainda não foi totalmente configurada (veja a pergunta SF no link acima ouesta pergunta SO).
É mais inteligente fazer e reutilizar uma conexão ou isso não é viável?
Sim, e deve ser viável. Essa é uma questão de programação, no entanto.
O que exatamente é uma conexão através de socket[?]
Um soquete é normalmente definido como an endpoint for communication
(emman 2 socket
eman 3 socket
. Depende de qual protocolo específico você está usando.
O que significam as colunas?
De acordo comman 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.
A lista padrão de colunas lsof
é:
$ lsof | head -1
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
Parece que está faltando a TID
coluna (ou ID do thread). COMMAND
e PID
são USER
autoexplicativos. FD
é o número do descritor de arquivo. 399u
indica que o fd é numerado 339 (pode ser encontrado em /proc/10573/fd/339
) e tem acesso de leitura e gravação ( u
).
Indica TYPE
IPv4
que é um soquete IPv4 ( sock
para um soquete de domínio desconhecido).
A DEVICE
saídapara arquivos normais:
A coluna DEVICE nos informa em qual dispositivo estamos trabalhando. Os dois números são chamados de números maiores e menores. A lista é bem conhecida e documentada. Por exemplo, o número principal 8 significa dispositivo de bloco SCSI. Para efeito de comparação, os discos IDE têm um número maior 3. O número menor indica uma das 15 partições disponíveis. Assim (8,1) nos diz que estamos trabalhando em sda1.
(0,16), o outro dispositivo interessante listado refere-se a montagens sem nome e sem dispositivo.
Para lista detalhada, consulte:
http://www.kernel.org/pub/linux/docs/device-list/devices.txt
E a lista (na verdade emhttps://www.kernel.org/pub/linux/docs/lanana/device-list/devices-2.6.txt) não é muito útil para dispositivos com maior número 0
.
O NAME
campo, para tais soquetes, é:
[...] 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, [...]