저는 가끔 Redis 데이터베이스에 연결하는 C 프로그램을 실행하고 있습니다. 몇 시간 동안 프로그램을 실행한 후 "소켓을 만들 수 없습니다: 열려 있는 파일이 너무 많습니다"라는 메시지가 나타납니다. 나는 데이터베이스의 논리적 부분을 완료할 때마다 연결을 닫을 것이라고 확신합니다. 그렇다면 C 프로그램이 실행되는 동안 몇 개의 소켓을 생성했는지 알 수 있는 방법이 있는지 궁금합니다. 우분투 16.04를 사용하고 있습니다.
답변1
운영 체제를 지정하지 않았으며 /proc/*/fd/
모든 운영 체제에 존재하지 않습니다.
실제로 프로세스에서 현재 열려 있는 모든 파일 설명자를 나열해야 하며, 이를 통해 실제로 누출되는 내용을 확인할 수 있습니다. 누출되는 소켓 파일 설명자가 반드시 필요한 것은 아닙니다.
FreeBSD, NetBSD, OpenBSD에서…
...그리고 다양한 파생 제품(예: TrueOS, DragonFly BSD).
옵션 및 관련 프로세스 ID와 fstat
함께 명령을 사용하십시오 .-p
fstat -p 718
fstat
.NetBSD 공통 명령 매뉴얼. 2013년 12월 15일.
AIX에서
이름을 인쇄하는 옵션 procfiles
과 함께 이 명령을 유사하게 사용하십시오 .-n
프로필-n 6679
procfiles
.운영 체제 7.2. IBM 지식 센터.
오픈솔라리스에서...
...따라서 Illumos에 관해 Schilix et al.
사용 pfiles
명령:
pfiles13253
pfiles
. 사용자 명령. SunOS 10.5 매뉴얼. 2008년 12월 10일.
리눅스에서
비슷하게 명령을 사용하십시오 lsof
.
lsof -p 41467
또한
내 C++ 프로그램에서 파일 설명자를 소유하고 해당 소멸자에서 이를 닫는 간단한 클래스는 놀라운 효과를 발휘합니다. 불행하게도 __attribute__(__cleanup__)
C 프로그램에서 이를 달성하려면 GNU 특정 언어 확장(예: )에 의존해야 합니다 .
물론 다른 도구를 사용하여 한 단계 더 발전시킬 수도 있습니다. DTrace와 적절한 스크립트를 사용하면 파일 설명자를 열고 닫을 때 프로세스를 모니터링할 수 있습니다. ( truss
또는 ktrace
또는 를 사용하여 이 작업을 수행할 수도 있습니다 strace
. 만들 시스템 호출의 하위 집합을 선택하는 메커니즘은 매우 기본적이거나 존재하지 않지만 디버거 및 일부 적절한 중단점을 사용하여 이 작업을 수행할 수도 있습니다.)
답변2
시스템 수준에서는 프로그램이 어떤 언어로 작성되었는지가 더 좋지 않습니다.
이를 살펴보면 /proc/«pid»/fd
프로세스가 열려 있는 파일 설명자의 총 수(소켓뿐만 아니라)를 알 수 있지만 이는 대략적인 수치입니다. 어쩌면 다른 사람이 소켓에 대해 말해 줄 수도 있습니다.
strace
또한 이를 사용하여 프로세스에서 수행된 시스템 호출을 추적할 수도 있습니다 .strace «my-program» «program args…»
프로그램에서
소켓을 열고 닫을 때 일부 로깅을 로그 파일에 printf 추가합니다.