설치하려고 하는데 389-ds
다음 경고가 표시됩니다.
WARNING: There are only 1024 file descriptors (hard limit) available, which limit the number of simultaneous connections.
파일 설명자를 이해하지만 소프트 및 하드 제한은 이해하지 못합니다.
달리면 cat /proc/sys/fs/file-max
다시 돌아온다 590432
. 이는 최대 590432개의 파일을 열 수 있음을 의미합니다(예: 최대 590432개의 파일 설명자가 있음).
하지만 실행하면 ulimit
다른 결과가 나타납니다.
$ ulimit
unlimited
$ ulimit -Hn # Hard limit
4096
$ ulimit -Sn # Soft limit
1024
그러나 하드/소프트 제한은 어디에서 왔으며 ulimit
저장된 숫자와 어떤 관련이 있습니까 /proc/sys/fs/file-max
?
답변1
~에 따르면커널 문서, /proc/sys/fs/file-max
는 최대 총 파일 수, 전역 수핸들커널은 차단하기 전에 할당합니다. 이는 현재 사용자의 제한 사항이 아닌 커널의 제한 사항입니다. 그래서 당신은할 수 있는유휴 시스템(단일 사용자 모드, 실행 중인 데몬 없음)에 혼자 있는 경우 590432를 엽니다. struct file
커널의 파일 핸들은 파일 설명자와 다릅니다. 여러 파일 설명자가 동일한 파일 핸들을 가리킬 수 있으며 파일 핸들도 존재할 수 있습니다.아니요내부적으로 연결된 설명자입니다. 시스템 전체에 대한 파일 설명자 제한은 없습니다. 이는 프로세스별로만 적용할 수 있습니다.
이 문서는 오래된 것이므로 /proc/sys/fs/file-max
오랫동안 사용되었습니다. 이 점을 지적한 Martin Jambon에게 감사드립니다.
SE에서 응답되는 소프트 제한과 하드 제한의 차이점. 하드 제한을 초과하지 않는 한 일반 사용자로서 소프트 제한을 늘리거나 줄일 수 있습니다. 하드 한도를 낮출 수도 있습니다(그러나 프로세스 중에 다시 높일 수는 없습니다). 수퍼유저로서 하드 및 소프트 제한을 높이거나 낮출 수 있습니다. 이중 제한 체계는 시스템 정책을 시행하는 데 사용되지만 일반 사용자가 스스로 임시 제한을 설정하고 나중에 변경할 수도 있습니다.
하드 제한을 소프트 제한 아래로 낮추려고 하면(수퍼유저가 아닌 경우) EINVAL
(잘못된 인수)가 반환됩니다.
따라서 귀하의 특정 경우에 ulimit
(와 동일 ulimit -Sf
)은 귀하가 다음에 관심이 있음을 의미합니다.셸 및 해당 하위 프로세스에서 작성된 파일 크기. (대부분의 경우 이는 좋은 생각일 것입니다)
다른 통화 ulimit -Hn
보고서 제한 -n
(열린 파일 설명자의 최대 수),아니요제한이 있기 -f
때문에 소프트 제한이 하드 제한보다 높은 것 같습니다. 입력하시면 ulimit -Hf
도 받으실 수 있습니다 unlimited
.
답변2
"select" 시스템 호출은 Windows 95를 비교했을 때 여전히 훌륭해 보이는 Unix의 수많은 끔찍한 설계 결정 중 하나입니다.
20년 전에 금지되었어야 했습니다. 그렇다면 지금은 파일 처리기를 제한하는 데 아무런 문제가 없을 것입니다.
커널 구성 및 ulimit를 사용하여 파일 설명자 수를 쉽게 늘릴 수 있지만, 라이브러리가 "select" 시스템 호출을 사용하는 경우 프로그램이 불안정해지고 실패하게 된다는 점을 명심하십시오(저작자가 전달된 파일 설명자를 알고 테스트하지 않는 한). 문자 수가 FD_SET_MAX보다 큰 경우)이 경우 poll 또는 epoll을 사용하도록 전환됩니다(이 경우 처음부터 이를 고려하지 않은 이유는 확실하지 않습니다).
select는 0에서 1023까지(또는 FD_SET 하드코딩된 상수에 설정된 모든 것)의 파일 설명자만 처리할 수 있습니다. 파일 설명자에 더 높은 값을 지정하면 메모리에 무작위로 삽입되며 선택은 이 설명자 작업을 절대 복제하지 않습니다. 불행하게도 많은 라이브러리에서는 여전히 select를 사용하고 있으며 모든 샘플 코드와 튜토리얼에서 이 선택이 사용되는 것을 볼 수 있습니다.
끔찍하기 때문에 이 댓글은 폭언이자 답변입니다. 화를 내지 않고는 대답할 수 없었다.