ヘッダーから概要データを取得するために、S3 から EC2 インスタンスにいくつかのファイルをストリーミングしています。key.close(fast=True)
取得するすべてのキーにboto.s3.bucket.Bucket.list()
(S3 にアクセスするための Python ライブラリ) を使用しますが、キーへの参照を渡すことでキーの一部を読み取ることができ、これは機能します。ただし、[Errno 24]: 開いているファイルが多すぎます。というエラーが発生することがあります。
走ると、lsof | grep python
次のようなさまざまなものが得られます。
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)
そして、これの1つ:
python 10573 ec2-user 91u sock 0,6 0t0 61105 can't identify protocol
これらは Web サーバーですか? 列は何を意味しますか? Python でこれらの接続を閉じる方法を理解するには、さらに調査する必要がありますが、これらの接続を閉じたいですか? 1 つの接続を作成して再利用する方が賢明ですか、それともそれは実現可能ではありませんか? 何が起こっているのかをより理解したら、Python 側を理解します。これは主に、何が起こっているのかという質問です。
ulimit -a
開いているファイルの最大数は 1024 と表示されており、オプションとしてそれを増やすこともできます。ただし、閉じるべきファイルを確実に閉じるようにしたいです。
答え1
これらは Web サーバーですか? [...] これらの接続を閉じますか?
これらは確かにあなたが作成した接続であり、少なくともマークされたものは適切に閉じる必要がありますCLOSE_WAIT
(これには1つの追加手順が必要です。HTTPS接続)。HTTPSサイトに関連する多くのことを行っている場合は、適切にクリーンアップするだけでこの問題を解決できるはずです。これは、can't identify protocol
おそらくまだ完全にセットアップされていない接続です(上記のSFの質問を参照するか、このSOの質問)。
1 つの接続を作成して再利用する方が賢明でしょうか、それともそれは実現不可能でしょうか?
はい、実現可能であるはずです。ただし、それはプログラミングの問題です。
ソケット経由の接続とは正確には何ですか?
ソケットは通常、次のように定義されますan endpoint for communication
(man 2 socket
そしてman 3 socket
使用している特定のプロトコルによって異なります。
列は何を意味していますか?
によると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.
のデフォルトの列リストは次のとおりlsof
です。
$ lsof | head -1
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
TID
(またはスレッド ID) 列が欠落しているようです。 COMMAND
、PID
およびUSER
は説明不要です。FD
はファイル記述子の番号です。399u
は、fd の番号が 339 (にあります/proc/10573/fd/339
) であり、読み取りアクセスと書き込みアクセスの両方があることを示します ( u
)。
はTYPE
IPv4
、IPv4 ソケットであることを示します (sock
不明なドメインのソケットの場合)。
出力DEVICE
通常のファイルの場合:
DEVICE 列は、どのデバイスで作業しているかを示します。2 つの番号は、メジャー番号とマイナー番号と呼ばれます。リストはよく知られており、文書化されています。たとえば、メジャー番号 8 は SCSI ブロック デバイスを表します。比較すると、IDE ディスクのメジャー番号は 3 です。マイナー番号は、使用可能な 15 個のパーティションの 1 つを示します。したがって、(8,1) は、sda1 で作業していることを示します。
(0,16) リストされている他の興味深いデバイスは、名前のない非デバイスマウントを指します。
詳細なリストについては以下を参照してください。
http://www.kernel.org/pub/linux/docs/device-list/devices.txt
そしてリスト(実際にはhttps://www.kernel.org/pub/linux/docs/lanana/device-list/devices-2.6.txt) はメジャー番号 のデバイスにはあまり役に立ちません0
。
NAME
このようなソケットのフィールドは次のとおりです。
[...] 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, [...]