1000개의 파티션이 있는 주제를 사용하여 Kafka 인스턴스를 실행하는 데 문제가 있어서 java.io.IOException: Too many open files
ec2 VM의 파일 설명자 제한을 조사하기 시작했습니다. 다음 명령은 모두 다른 결과를 생성하므로 Centos 7 시스템에서 파일을 열 때의 정확한 제한 사항을 이해하는 데 어려움을 겪고 있습니다. 명령은 다음과 같습니다:
ulimit -a
: 파일 1024 열기lsof | wc -l
:298280cat /proc/sys/fs/file-max
:758881 (와 일치/proc/sys/fs/file-nr
)
실제 제한이 마지막 명령에 의해 생성된 제한이라면 그보다 훨씬 낮습니다( lsof | wc -l
:298280). 그러나 이 경우 ulimit
열려 있는 파일이 1024개보다 훨씬 많기 때문에 명령의 출력이 매우 불분명합니다.
공식 문서에 따르면 Centos에서 파일 설명자를 확인하는 가장 좋은 방법은 /proc/sys/fs/file-max
file그러나 이 명령들 사이에 "불일치"처럼 보이는 것이 모두 있습니까?
답변1
file-max
전체 시스템에서 열 수 있는 최대 파일 수입니다. 이는 커널 수준에서 시행됩니다.매뉴얼 페이지에는 다음과 같이 명시되어 있습니다
lsof
.
옵션이 없으면 lsof는 모든 활성 프로세스에 속하는 모든 열린 파일을 나열합니다.
보고된 파일 수가 설정 lsof
보다 훨씬 적기 때문에 이는 관찰 내용과 일치합니다.file-max
- 마지막으로
ulimit
사용자 수준에서 리소스 제한을 적용하는 데 사용됩니다. "열린 파일 수" 매개변수는 사용자 수준에서 설정되지만 해당 사용자가 시작한 모든 프로세스에 적용됩니다. 이 경우 단일 Kafka 프로세스는 최대 1024개의 파일 핸들을 열 수 있습니다(소프트 제한).
이 제한을 4096이라는 하드 제한으로 직접 늘릴 수 있습니다. 하드 제한을 늘리려면 루트 액세스가 필요합니다.
Kafka가 단일 프로세스로 실행 중인 경우 lsof -p [PID]
.
문제가 해결되기를 바랍니다.
답변2
이는 일반적인 실수입니다. lsof
원래 호출의 결과를 가정된 제한과 비교하는 것입니다.
전역 제한( /proc/sys/fs/file-max
) 의 경우 /proc/sys/fs/file-nr
첫 번째 값은 사용된 값을 나타내고 마지막 값은 제한을 나타냅니다.
OpenFile 제한은 프로세스별로 적용되지만 사용자에 대해 정의할 수 있습니다. 사용자 제한은 ulimit -Hn
명령 및 정의를 참조하세요 . /etc/security/limits.conf
일반적으로 "app user"와 함께 적용됩니다. 예: "tomcat": 사용자 tomcat에 대해 제한을 65000으로 설정하면 이 제한은 실행되는 Java 프로세스에 적용됩니다.
프로세스에 적용되는 제한을 확인하려면 해당 PID를 얻은 후 다음을 수행하십시오.
cat /proc/${PID}/limits
특정 프로세스에서 열려 있는 파일 수를 확인하려면 해당 PID를 가져온 다음 다음을 수행하세요.
ls -1 /proc/${PID}/fd | wc -l
(ls는 "minus 1"을 의미하므로 "minus el"과 혼동하지 마십시오.)
lsof의 세부 사항을 알고 싶지만 제한에 포함되는 파일 핸들만 알고 싶다면 다음을 시도하십시오.
lsof -p ${PID} | grep -P "^(\w+\s+){3}\d+\D+"
lsof -p ${PID} -d '^cwd,^err,^ltx,^mem,^mmap,^pd,^rtd,^txt' -a
참고: "파일"은 파일/파이프/tcp 연결/등입니다.
때로는 권한 없이 명령에서 올바른 결과를 얻기 위해 루트이거나 sudo를 사용해야 할 수도 있으며, 때로는 오류가 표시되지 않고 더 적은 결과만 얻을 수도 있습니다.
마지막으로, 프로세스가 액세스하는 파일 시스템의 파일을 알고 싶다면 다음을 살펴보세요.
lsof -p ${PID} | grep / | awk '{print $9}' | sort | uniq