O que exatamente é uma conexão através de socket ou o que a saída de lsof nos diz?

0

Estou transmitindo alguns arquivos do S3 para uma instância do EC2 para obter dados de resumo dos cabeçalhos. Eu uso key.close(fast=True) para todas as chaves que obtenho de 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 executo lsof | grep python , obtenho uma variedade deles:

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 deles:

python    10573 ec2-user   91u     sock    0,6       0t0  61105 can't identify protocol

Esses servidores são? O que as colunas significam? Vou precisar pesquisar mais para descobrir como fechar essas conexões em python, mas eu quero fechar essas conexões? É mais inteligente fazer e reutilizar uma conexão ou isso não é viável? Eu vou descobrir o lado do python quando eu entendo mais do que está acontecendo, isso é principalmente uma questão para 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 estar.

    
por ehacinom 23.09.2014 / 23:08

1 resposta

1
% bl0ck_qu0te%

Estas são de fato as conexões que você fez, e você deve fechar corretamente pelo menos as marcadas com CLOSE_WAIT (isso precisa de uma etapa extra, por causa de a conexão HTTPS ). Se você estiver fazendo muitas coisas envolvendo sites HTTPS, a limpeza adequada deve ser suficiente para resolver esse problema. Provavelmente, o can't identify protocol é uma conexão que ainda não foi totalmente configurada (veja a pergunta do SF vinculada acima ou essa pergunta sobre SO ) .

% bl0ck_qu0te%

Sim, e isso deve ser viável. Essa é uma questão de programação, no entanto.

% bl0ck_qu0te%

Um soquete é normalmente definido como an endpoint for communication (em man 2 socket e man 3 socket Depende de qual protocolo específico você está usando.

% bl0ck_qu0te%

De acordo com man 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 para lsof é:

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

Parece que você está sem a coluna TID (ou thread ID). COMMAND , PID e USER são auto-explicativos. FD é o número do descritor de arquivos. 399u indica que o fd é numerado como 339 (ele pode ser encontrado em /proc/10573/fd/339 ) e tem acesso de leitura e gravação ( u ).

O TYPE IPv4 indica que é um soquete IPv4 ( sock para um soquete de domínio desconhecido).

A DEVICE output para arquivos normais:

% bl0ck_qu0te%

E a lista (na verdade, em link ) é de pouco uso para dispositivos com maior número 0 .

O campo NAME , para esses 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, [...]
    
por muru 24.09.2014 / 00:48