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 -a
sagt, 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 protocol
handelt 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 socket
Undman 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 TID
Spalte (oder Thread-ID) zu fehlen. COMMAND
, PID
und USER
sind selbsterklärend. FD
ist die Nummer des Datei-Deskriptors. 399u
zeigt 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
IPv4
zeigt an, dass es sich um einen IPv4-Socket handelt ( sock
für einen Socket mit unbekannter Domäne).
Die DEVICE
Ausgabefü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 NAME
Feld 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, [...]