Was genau ist eine Verbindung über Socket bzw. was sagt uns die Ausgabe von lsof?

Was genau ist eine Verbindung über Socket bzw. was sagt uns die Ausgabe von lsof?

Ich streame einige Dateien von S3 zu einer EC2-Instanz, um Zusammenfassungsdaten aus den Headern zu erhalten. Ich verwende key.close(fast=True)für alle Schlüssel, die ich bekomme boto.s3.bucket.Bucket.list()(Python-Bibliothek für den Zugriff auf S3), gebe aber einen Verweis auf die Schlüssel weiter, damit ich Teile davon lesen kann, und das funktioniert. Allerdings erhalte ich manchmal [Errno 24]: Zu viele offene Dateien.

Beim Laufen lsof | grep pythonüberkommt mich eine Vielzahl dieser Dinge:

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)

und eines davon:

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

Sind das Webserver? Was bedeuten die Spalten? Ich muss noch mehr recherchieren, um herauszufinden, wie man diese Verbindungen in Python schließt, aber will ich diese Verbindungen schließen? Ist es klüger, eine Verbindung herzustellen und wiederzuverwenden, oder ist das nicht machbar? Ich werde die Python-Seite herausfinden, wenn ich besser verstehe, was passiert. Dies ist hauptsächlich eine Frage, was vor sich geht.

ulimit -asagt, dass die maximale Anzahl geöffneter Dateien 1024 beträgt und dass man sie einfach erhöhen kann. Ich möchte jedoch sicherstellen, dass ich die Dateien schließe, die ich schließen soll.

Antwort1

Sind das Webserver? [...] möchte ich diese Verbindungen schließen?

Dies sind tatsächlich Verbindungen, die Sie hergestellt haben, und Sie sollten mindestens die markierten ordnungsgemäß schließen CLOSE_WAIT(dies erfordert einen zusätzlichen Schritt, dadie HTTPS-Verbindung). Wenn Sie viele Dinge mit HTTPS-Sites tun, sollte eine gründliche Bereinigung ausreichen, um dieses Problem zu lösen. Es can't identify protocolhandelt sich wahrscheinlich um eine Verbindung, die noch nicht vollständig eingerichtet wurde (siehe die oben verlinkte SF-Frage oderdiese SO-Frage).

Ist es klüger, eine Verbindung herzustellen und wiederzuverwenden, oder ist das nicht machbar?

Ja, und es sollte machbar sein. Das ist allerdings eine Programmierfrage.

Was genau ist eine Verbindung über Socket[?]

Ein Socket wird typischerweise wie folgt definiert an endpoint for communication(inman 2 socketUndman 3 socket. Es hängt davon ab, welches Protokoll Sie verwenden.


Was bedeuten die Spalten?

Entsprechendman 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.

Die Standardspaltenliste lautet lsof:

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

Ihnen scheint die TIDSpalte (oder Thread-ID) zu fehlen. COMMAND, PIDund USERsind selbsterklärend. FDist die Nummer des Datei-Deskriptors. 399uzeigt an, dass der FD die Nummer 339 hat (er ist unter zu finden /proc/10573/fd/339) und sowohl Lese- als auch Schreibzugriff hat ( u).

Das TYPE IPv4zeigt an, dass es sich um einen IPv4-Socket handelt ( sockfür einen Socket mit unbekannter Domäne).

Die DEVICEAusgabefür normale Dateien:

Die Spalte DEVICE gibt an, an welchem ​​Gerät wir arbeiten. Die beiden Nummern heißen Major- und Minor-Nummern. Die Liste ist bekannt und dokumentiert. Beispielsweise steht Major-Nummer 8 für SCSI-Blockgerät. Zum Vergleich: IDE-Festplatten haben Major-Nummer 3. Die Minor-Nummer gibt eine der 15 verfügbaren Partitionen an. Somit sagt uns (8,1), dass wir an sda1 arbeiten.

(0,16) Das andere aufgeführte interessante Gerät bezieht sich auf unbenannte, nicht gerätebezogene Halterungen.

Eine detaillierte Liste finden Sie unter:

http://www.kernel.org/pub/linux/docs/device-list/devices.txt

Und die Liste (eigentlich beihttps://www.kernel.org/pub/linux/docs/lanana/device-list/devices-2.6.txt) ist für Geräte mit Hauptnummern nicht sehr nützlich 0.

Das NAMEFeld für solche Sockel ist:

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

verwandte Informationen