열린 파일 제한을 제어하는 ​​명령은 무엇입니까? user processes

어떤 명령 / 구성 파일이 OS X에서 열린 파일 제한을 제어합니까? OS X 10.5 / 10.6 / 10.7에 다른 명령이 있습니까? 나는 아래 탐색 옵션은 ulimit, sysctllaunchctl

“너무 많은 열린 파일”은 Leopard, 아마도 다른 버전의 OS X에서 흔히 발생하는 오류입니다.

열린 파일 제한을 보는 방법에는 여러 가지가 있습니다.

$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 2048
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 512
virtual memory          (kbytes, -v) unlimited


$ launchctl limit
cpu         unlimited      unlimited
filesize    unlimited      unlimited
data        unlimited      unlimited
stack       8388608        67104768
core        0              unlimited
rss         unlimited      unlimited
memlock     unlimited      unlimited
maxproc     1024           2048
maxfiles    2048           4096

$ sysctl -a | grep files
kern.maxfiles = 32768
kern.maxfilesperproc = 16384
kern.maxfiles: 32768
kern.maxfilesperproc: 16384
kern.num_files: 2049

위의 게시물 중 일부에서 다음 명령으로이를 수정할 수 있다고 주장했습니다.

sudo launchctl limit maxfiles 16384 32768
sudo ulimit -n 32768
sudo sysctl -w kern.maxfilesperproc=16384
sudo sysctl -w kern.maxfiles=32768

그러나, 위의 명령에서, 단지 sysctl명령은 분명히 효과가있다 (예를 ulimit -n하고 launchctl limit있는 동안, 입력 한 위의 명령 후 변화를 보여주지 sysctl -a요청 된 변화를 보여 않음).

OS에 대한 이러한 매개 변수를 변경하는 해당 위치는 다음과 같습니다.

/etc/sysctl.conf
/etc/launchd.conf

또한 현재 쉘만 제어하는 한 가지 답변 을 발견했습니다 ulimit.

macOS 에서 최대 파일 / 최대 열린 파일 제한을 어떻게 상향 조정할 수 있습니까?



답변

예전에는 여러 한계가 있었으며 특정 인스턴스에서 도달하는 최저 한계가 오류를 생성한다는 간단한 대답이었습니다. 이제 10.12 launchctl limit maxfiles도 혼합되어 있습니다. 구현에 대한 자세한 내용은 이 훌륭한 답변이 현상금을 받고 있으며 내가 줄 수있는 것보다 더 많은 투표를받을 자격이 있습니다.

다른 관련 스레드는 다음과 같습니다.

ulimit수준은 열려있는 파일과 커널을 홍수에서 한 가난한 쉘 스크립트를 방지하기 위해 낮게 설정되어 있습니다.

kern.maxfilesperproc하나 개의 프로세스는 대부분의 전부는 아니지만 커널에서 열린 파일 핸들러 공간을 사용할 수 있도록 계산 최대 파일에 약간의 공간을 거기에두고있다.

정상적인 상황에서는 kern.maxfiles이것이 최종 제한 요소입니다.

Sierra에서-제한은 256 개의 열린 파일과 무제한의 최대 값이므로 소프트 제한에 대해 3 ~ 4 천개의 파일을 설정하면 거의 모든 하드웨어에서 작동하며 런 어웨이 프로세스가 너무 많이 열릴 때 시스템의 응답 성을 유지합니다. 파일. 우리는 개발 서버를 256 한계로 유지하여 프로덕션에서 소프트웨어를 찾는 것이 아니라 개발 / 준비 및 테스트에서 새롭고 문제가있는 소프트웨어를 포착하는 것을 좋아합니다.

저는 10k 파일을 좋아하지 않습니다. 아마도 APFS 및 NVMe 스토리지를 사용하면 상상할 수없는 날을 보게 될 것입니다. 그러나 파일 한도를 위해 수백 또는 수천을 고수하려고 노력하십시오. 특히 Mac에 프로세스 제한낮은 경우 프로세스적은 파일을 너무 많이 열면 문제가 발생할 수 있습니다.


답변

OS X의 각 버전에 대해 열린 파일 제한을 변경하는 방법이 완전히 다른 것 같습니다.

OS X Sierra (10.12.X)의 경우 다음을 수행해야합니다.

1.
에서 Library/LaunchDaemons라는 파일을 생성 limit.maxfiles.plist하고에 다음을 (각각, 소프트 및 하드 한계가있는 두 개의 숫자를 (변경 주시기 바랍니다) 붙여 넣기 :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
        "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>limit.maxfiles</string>
    <key>ProgramArguments</key>
    <array>
      <string>launchctl</string>
      <string>limit</string>
      <string>maxfiles</string>
      <string>64000</string>
      <string>524288</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>ServiceIPC</key>
    <false/>
  </dict>
</plist> 

2.
새 파일의 소유자를 변경하십시오.

sudo chown root:wheel /Library/LaunchDaemons/limit.maxfiles.plist

3.
다음 새 설정을로드하십시오.

sudo launchctl load -w /Library/LaunchDaemons/limit.maxfiles.plist

4.
마지막으로, 한계가 올바른지 확인하십시오.

launchctl limit maxfiles

답변

다음은 가장 일반적인 문제를 해결해야하며 계층 순서대로 나열됩니다.

echo 'kern.maxfiles=20480' | sudo tee -a /etc/sysctl.conf
echo -e 'limit maxfiles 8192 20480\nlimit maxproc 1000 2000' | sudo tee -a /etc/launchd.conf
echo 'ulimit -n 4096' | sudo tee -a /etc/profile

노트:

  1. 이러한 변경 사항을 적용하려면 다시 시작해야합니다.
  2. AFAIK 더 이상 OS X에서 제한을 ‘무제한’으로 설정할 수 없습니다
  3. launchctl maxfiles는 sysctl maxfiles에 의해 제한되므로이를 초과 할 수 없습니다.
  4. sysctl은 launchctl maxfiles에서 kern.maxfilesperproc을 상속받는 것으로 보입니다.
  5. ulimit는 launchctl의 ‘파일 열기’값을 기본적으로 상속받는 것으로 보입니다.
  6. / etc / profile 또는 ~ / .profile 내에서 사용자 정의 ulimit를 설정할 수 있습니다. 이것이 필요하지는 않지만 예제를 제공했습니다.
  7. 기본값과 비교할 때 이러한 값을 매우 높은 숫자로 설정할 때는주의하십시오. 기능에는 안정성 / 보안이 있습니다. 다른 웹 사이트에 작성된 것으로 생각되는이 예제 번호를 사용했습니다.

답변

간단히 말해서 :

  • ulimit명령은 “쉘에 사용 가능한 자원과 그것이 작성하는 프로세스에 대한 제어”를 제공합니다 ( help ulimit및 참조 man bash). 쉘에 제공된 자원은 시스템 자원 한계에 의해 제한됩니다.

  • launchctl현재의 프로세스 제어에 의해 최대 시스템 자원 소모 (다음을 참조 man setrlimit하고 man launchctl). 최대 값은 커널 한계에 의해 제한됩니다.

  • sysctl컨트롤 한계 (: 참조 커널 man sysctlBSD의 튜닝 커널 제한 ).

한계를 늘리려면 문제점에 따라 각 명령을 사용할 수 있습니다.

참조 : `launchctl limit`과`ulimit`의 관계는 무엇입니까?


열린 파일이 너무 많은 문제의 경우 이는 로컬 소프트 셸 스크립트,로 실행되는 글로벌 스크립트 root, 앱 또는 모든 프로세스에 관계없이 정확히 소프트 또는 하드 제한에 도달 한 항목에 따라 다릅니다 . 모든 한계 (쉘, 론치 및 커널 한계) 를 늘릴 가치가 있습니다.

한계를 지속적으로 늘리려면 Mac에서 최대 시스템 리소스 소비를 지속적으로 제어하는 ​​방법을 참조하십시오.