지금은 방법을 알고 있습니다.
- 프로세스 당 열린 파일 제한 찾기 :
ulimit -n
- 모든 프로세스별로 열린 파일을 모두 계산하십시오.
lsof | wc -l
- 열린 파일의 최대 허용 개수를 얻습니다.
cat /proc/sys/fs/file-max
내 질문은 : 왜 리눅스에서 열린 파일의 한계가 있습니까?
지금은 방법을 알고 있습니다.
ulimit -n
lsof | wc -l
cat /proc/sys/fs/file-max
내 질문은 : 왜 리눅스에서 열린 파일의 한계가 있습니까?
답변:
그 이유는 운영 체제에 열려있는 각 파일을 관리하기 위해 메모리가 필요하고 메모리는 특히 임베디드 시스템에서 제한된 리소스이기 때문입니다.
루트 사용자는 프로세스 당 ( ulimit -n
) 및 시스템 당 (예 :) 최대 열린 파일 수를 변경할 수 있습니다 echo 800000 > /proc/sys/fs/file-max
.
/.../file-max
메모리가 사용되지 않는 한 상당히 큰 값으로 설정할 수 있습니까?
file-max
RAM 크기를 10k로 나눈 것 같습니다. 파일 핸들러 당 사용 된 실제 메모리는 훨씬 작아야하고 ( struct file
드라이버 종속 메모리 크기 와 크기 ) 상당히 보수적 인 한계로 보입니다.
lsof | wc -l
많은 중복 항목 을 요약합니다 (포크 된 프로세스는 파일 핸들 등을 공유 할 수 있음). 이 수는에 설정된 제한보다 훨씬 높을 수 있습니다 /proc/sys/fs/file-max
.
Linux 커널의 관점에서 현재 열린 파일 수를 얻으려면 다음을 수행하십시오.
cat /proc/sys/fs/file-nr
예 :이 서버는 열린 파일 수가 최대 65536 개 중 40096 개이지만 lsof는 훨씬 더 많은 수를보고합니다.
# cat /proc/sys/fs/file-max
65536
# cat /proc/sys/fs/file-nr
40096 0 65536
# lsof | wc -l
521504
lsof
많은 파일을 두 번 이상보고 /dev/null
할 수 있으므로 다음 과 같이 최선의 추측을 시도 할 수 있습니다.lsof|awk '{print $9}'|sort|uniq|wc -l
lsof|awk '!a[$NF]++{c++}END{print c}'
중복되지 않은 열린 파일 수를 얻는 데 사용할 수 있습니다 .
나는 그것이 역사적 이유로 크게 생각합니다.
유닉스 파일 디스크립터는 작은, int
같은 함수에 의해 리턴 된 값 open
과 creat
, 그리고 통과에 read
, write
, close
, 등.
적어도 유닉스 초기 버전에서 파일 디스크립터는 단순히 고정 크기 프로세스 단위의 구조 배열에 대한 색인 일 뿐이며, 각 구조에는 열린 파일에 대한 정보가 들어 있습니다. 올바르게 기억한다면 일부 초기 시스템은이 테이블의 크기를 20 정도로 제한했습니다.
더 현대적인 시스템에는 더 높은 한계가 있지만 동일한 일반 체계를 크게 관성에서 벗어났습니다.
fileno
및 fdopen
기능을 감안할 때 거의 상호 교환 가능할 것으로 기대합니다.
int
디스크립터 또는를 통해 액세스되는지 여부에 관계없이 저장되어야 합니다 FILE*
. 당신은을 통해 열린 20 개 이상의 파일이있는 경우 open()
, 것입니다 fdopen()
실패?