it-swarm-korea.com

파일 디스크립터 수 제한

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에 저장된 숫자와 어떤 관련이 있습니까?

34
Rafael Adel

커널 문서 에 따르면, /proc/sys/file-max은 커널이 질식하기 전에 할당 할 파일 디스크립터의 최대 총 개수입니다. 이것은 현재 사용자가 아닌 커널 한계입니다. 따라서 유휴 시스템 (단일 사용자 모드, 데몬이 실행되지 않음)에서만 혼자있는 경우 can 590432를 엽니 다.

문서가 오래되었습니다. 파일이 오랫동안 proc/sys/fs/file-max입니다. 이것을 지적 해준 Martin Jambon에게 감사합니다.

여기서 소프트 한계와 하드 한계의 차이는 여기에서 대답합니다 . 하드 한계를 초과하지 않으면 일반 사용자로서 소프트 한계를 높이거나 낮출 수 있습니다. 하드 한계를 낮출 수도 있습니다 (그러나 해당 프로세스에 대해 다시 올릴 수는 없습니다). 수퍼 유저로서 하드 한계와 소프트 한계를 모두 높이거나 낮출 수 있습니다. 이중 제한 체계는 시스템 정책을 시행하는 데 사용되지만 일반 사용자는 자신에 대한 임시 제한을 설정하고 나중에 변경할 수 있습니다.

하드 한도를 소프트 한도 아래로 낮추려고하면 (그리고 수퍼 유저가 아닌 경우) EINVAL을 돌려받습니다 (잘못된 인수).

따라서, 특정한 경우에 ulimit (ulimit -Sf과 동일)는 쉘이 작성한 파일의 크기에 대한 소프트 제한이 없다고 말합니다. 하위 프로세스. (아마도 대부분의 경우 좋은 생각입니다)

다른 호출 ulimit -Hn-n 한계 (최대 열린 파일 디스크립터 수)에 대해보고합니다. not ​​-f 한계 소프트 한계가 하드 한계보다 높은 것 같습니다. ulimit -Hf을 입력하면 '무제한'도 표시됩니다.

39
Alexios

"select"시스템 호출은 유닉스에 대한 많은 끔찍한 두뇌 데드 디자인 결정 중 하나입니다.

그것은 20 년 전에 금지되어 왔으며 이제는 문제없이 파일 핸들러를 무제한으로 제한 할 수 있습니다.

커널 구성으로 파일 디스크립터 수를 쉽게 늘릴 수 있지만 ulimit 그러나 "select"시스템 호출을 사용하는 라이브러리가 있으면 프로그램이 불안정 해지고 (메모리 손상) 실패합니다.

Select는 0에서 1023까지의 파일 디스크립터 만 처리 할 수 ​​있으며 더 높은 값을 가진 파일 디스크립터를 공급하면 메모리에 임의로 찌르기 때문에 디스크립터는 디스크립터가 작동하는 것처럼 반복되지 않습니다. 불행히도 많은 라이브러리가 select를 사용합니다.

0
Lothar