ソケット経由の接続とは正確には何ですか、または lsof の出力は何を伝えますか?

ソケット経由の接続とは正確には何ですか、または lsof の出力は何を伝えますか?

ヘッダーから概要データを取得するために、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 communicationman 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) 列が欠落しているようです。 COMMANDPIDおよび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, [...]

関連情報