소켓을 통한 연결이란 정확히 무엇이며, lsof의 출력은 무엇을 알려줍니까?

소켓을 통한 연결이란 정확히 무엇이며, lsof의 출력은 무엇을 알려줍니까?

헤더에서 요약 데이터를 가져오기 위해 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이고(에서 찾을 수 있음 ) 읽기 및 쓰기 액세스 권한이 모두 있음을 나타냅니다( ).USERFD399u/proc/10573/fd/339u

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, [...]

관련 정보