我正在將一些文件從 S3 串流傳輸到 EC2 實例,以從標頭獲取摘要資料。我使用key.close(fast=True)
從(用於存取 S3 的 python 庫)獲得的所有金鑰boto.s3.bucket.Bucket.list()
,但傳遞對金鑰的引用,以便我可以讀取其中的一部分,這是可行的。但是,我有時會收到 [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)
其中之一:
python 10573 ec2-user 91u sock 0,6 0t0 61105 can't identify protocol
這些是網頁伺服器嗎?各列的含義是什麼?我需要進行更多研究才能弄清楚如何在 python 中關閉這些連接,但是我想關閉這些連接嗎?建立並重複使用一個連接是否更明智,還是不可行?當我更多地了解正在發生的事情時,我會弄清楚 python 方面,這主要是關於正在發生的事情的問題。
ulimit -a
說開啟的檔案最大值為 1024,並且可以選擇提高它。但是,我想確保我關閉了應該關閉的文件。
答案1
這些是網頁伺服器嗎? [...] 我想關閉這些連線嗎?
這些確實是您已經建立的連接,您應該至少正確關閉標記的連接CLOSE_WAIT
(這需要一個額外的步驟,因為HTTPS 連線)。如果您正在做很多涉及 HTTPS 網站的事情,正確清理應該足以解決這個問題。這can't identify protocol
可能是尚未完全建立的連接(請參閱上面連結的 SF 問題或這個問題)。
建立並重複使用一個連接是否更明智,還是不可行?
是的,而且應該是可行的。不過,這是程式設計問題。
透過套接字建立連結到底是什麼?
套接字通常定義為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 欄位告訴我們正在使用什麼設備。這兩個數字稱為主數和次數。該列表眾所周知並有記錄。例如,主設備號 8 代表 SCSI 區塊設備。為了進行比較,IDE 磁碟的主編號為 3。因此 (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, [...]