ulimit, lsof, cat /proc/sys/fs/file-max의 차이점

ulimit, lsof, cat /proc/sys/fs/file-max의 차이점

1000개의 파티션이 있는 주제를 사용하여 Kafka 인스턴스를 실행하는 데 문제가 있어서 java.io.IOException: Too many open filesec2 VM의 파일 설명자 제한을 조사하기 시작했습니다. 다음 명령은 모두 다른 결과를 생성하므로 Centos 7 시스템에서 파일을 열 때의 정확한 제한 사항을 이해하는 데 어려움을 겪고 있습니다. 명령은 다음과 같습니다:

  • ulimit -a: 파일 1024 열기
  • lsof | wc -l:298280
  • cat /proc/sys/fs/file-max:758881 (와 일치 /proc/sys/fs/file-nr)

실제 제한이 마지막 명령에 의해 생성된 제한이라면 그보다 훨씬 낮습니다( lsof | wc -l:298280). 그러나 이 경우 ulimit열려 있는 파일이 1024개보다 훨씬 많기 때문에 명령의 출력이 매우 불분명합니다.

공식 문서에 따르면 Centos에서 파일 설명자를 확인하는 가장 좋은 방법은 /proc/sys/fs/file-maxfile그러나 이 명령들 사이에 "불일치"처럼 보이는 것이 모두 있습니까?

답변1

  1. file-max전체 시스템에서 열 수 있는 최대 파일 수입니다. 이는 커널 수준에서 시행됩니다.

  2. 매뉴얼 페이지에는 다음과 같이 명시되어 있습니다 lsof.

옵션이 없으면 lsof는 모든 활성 프로세스에 속하는 모든 열린 파일을 나열합니다.

보고된 파일 수가 설정 lsof보다 훨씬 적기 때문에 이는 관찰 내용과 일치합니다.file-max

  1. 마지막으로 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

관련 정보