헤더에서 요약 데이터를 가져오기 위해 S3에서 EC2 인스턴스로 일부 파일을 스트리밍하고 있습니다. 나는 (S3에 액세스하기 위한 Python 라이브러리) key.close(fast=True)
에서 얻은 모든 키에 사용 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에서 이러한 연결을 닫는 방법을 알아내기 위해 더 많은 조사가 필요하지만 이러한 연결을 닫고 싶습니까? 하나의 연결을 만들고 재사용하는 것이 더 스마트합니까, 아니면 실현 가능하지 않습니까? 무슨 일이 일어나고 있는지 더 많이 이해하면 파이썬 측면을 알아낼 것입니다. 이것은 대부분 무슨 일이 일어나고 있는지에 대한 질문입니다.
ulimit -a
열린 파일의 최대값은 1024이며 옵션은 단순히 이를 높이는 것입니다. 그러나 나는 내가 있어야 할 파일을 닫고 있는지 확인하고 싶습니다.
답변1
이게 웹서버인가요? [...] 이 연결을 닫고 싶나요?
이것은 실제로 사용자가 만든 연결이며 적어도 표시된 연결을 적절하게 닫아야 합니다 CLOSE_WAIT
(이 작업에는 한 가지 추가 단계가 필요합니다.HTTPS 연결). HTTPS 사이트와 관련된 많은 작업을 수행하는 경우 적절하게 정리하면 이 문제를 해결하기에 충분합니다. can't identify protocol
아직 완전히 설정되지 않은 연결일 수 있습니다(위에 링크된 SF 질문 참조 또는이 SO 질문).
하나의 연결을 만들고 재사용하는 것이 더 스마트합니까, 아니면 실현 가능하지 않습니까?
예, 가능해야 합니다. 하지만 그것은 프로그래밍 문제입니다.
소켓[?]을 통한 연결이란 정확히 무엇입니까?
소켓은 일반적으로 다음과 같이 정의됩니다 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
. 파일 설명자의 번호입니다. 는 fd의 번호가 339이고(에서 찾을 수 있음 ) 읽기 및 쓰기 액세스 권한이 모두 있음을 나타냅니다( ).USER
FD
399u
/proc/10573/fd/339
u
TYPE
IPv4
는 IPv4 소켓( sock
알 수 없는 도메인의 소켓) 임을 나타냅니다.
출력DEVICE
일반 파일의 경우:
DEVICE 열은 우리가 작업 중인 장치를 알려줍니다. 두 숫자를 메이저(major) 숫자와 마이너(minor) 숫자라고 합니다. 이 목록은 잘 알려져 있으며 문서화되어 있습니다. 예를 들어, 메이저 번호 8은 SCSI 블록 장치를 나타냅니다. 비교를 위해 IDE 디스크의 메이저 번호는 3입니다. 마이너 번호는 사용 가능한 15개의 파티션 중 하나를 나타냅니다. 따라서 (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, [...]