OS X (10.5)에서 기본 ulimits는 어디에 지정되어 있습니까?


26

nofile요즘 OS X 사용자 계정 의 기본 제한은 약 256 개의 파일 설명자인 것으로 보입니다. 한 번에 열어 놓은 것보다 훨씬 더 많은 연결이 필요한 일부 소프트웨어를 테스트하려고합니다.

pam limits 모듈을 실행하는 일반적인 데비안 박스 /etc/security/limits.conf에서 소프트웨어를 실행할 사용자에 대해 더 높은 한계를 설정하도록 편집 했지만 OS X에서 이러한 한계를 설정할 위치가 궁금합니다.

어딘가에 GUI가 있습니까? 어딘가에 구성 파일이 있습니까? OS X에서 기본 ulimits를 변경하는 가장 좋은 방법은 무엇입니까?



답변:


27

Leopard에서 초기 프로세스는 launchd입니다. 각 프로세스의 기본 ulimits는에서 상속됩니다 launchd. 참고로 기본 (컴파일 된) 한계는 다음과 같습니다.

$ sudo launchctl limit
    cpu         unlimited      unlimited      
    filesize    unlimited      unlimited      
    data        6291456        unlimited      
    stack       8388608        67104768       
    core        0              unlimited      
    rss         unlimited      unlimited      
    memlock     unlimited      unlimited      
    maxproc     266            532            
    maxfiles    256            unlimited

이러한 제한을 변경하려면에 파일을 먼저 작성해야하는 행을 추가 /etc/launchd.conf하십시오. 인수는 launchctl명령에 전달 된 것과 동일합니다 . 예를 들어

echo "limit maxfiles 1024 unlimited" | sudo tee -a /etc/launchd.conf

그러나 launchd이미 로그인 셸을 시작 했으므로 이러한 변경 사항을 적용하는 가장 간단한 방법은 컴퓨터를 다시 시작하는 것입니다. (>>를 사용하여 /etc/launchd.conf에 추가하십시오.)


2
공식 문서에 대한 링크를 추가 할 수 있습니까?
글리프

7
문서가 어디에나 문서화되어 있다면이 페이지는 필요하지 않을 것입니다.
Dave Cheney

1
Snow Leopard에서 작동하지 않는 것 같습니다.
ismail

1
이것이 어떻게 다른지 sysctl.maxfiles아십니까? (관련 질문 : apple.stackexchange.com/questions/33715/too-many-open-files )
keflavich

2
작은 수정 : echosudo에서 실행 중이지만 권한이없는 권한없는 쉘을 파일에 추가하려고합니다. echo "limit maxfiles 1024 unlimited" | sudo tee -a /etc/launchd.conf대신 시도하십시오 .
Vineet

4
sudo echo "limit maxfiles 1024 unlimited" >> /etc/launchd.conf

sudo가 잘못된 위치에 있으므로 작동하지 않습니다.

echo 'limit maxfiles 10000 unlimited' | sudo tee -a /etc/launchd.conf

3
이것은 아마도 당신이 말하는 대답에 대한 "제안 된 편집"으로서 더 나을 것입니다.
Chris Johnsen

3

쉘 한계

쉘 및 프로세스에 사용 가능한 자원은 ulimit명령 으로 변경하여 개별 사용자 또는 모든 사용자 ~/.bashrc또는~/.bash_profile 시작 스크립트에 추가 할 수 있습니다 . 추가 할 행 예 :/etc/bashrc

ulimit -Sn 4096 && ulimit -Sl unlimited

참조 : help ulimitman bash더 많은 정보를 얻을 수 있습니다.

시스템 한계

일반적으로 시스템 한계는 Launchd 프레임 워크에 의해 제어되며 다음launchctl같은 명령 으로 변경할 수 있습니다.

launchctl limit maxfiles 10240 unlimited

변경 사항을 영구적으로 유지하려면 시작 에이전트 역할을하는 특정 Launch 호환 폴더 에 속성 목록 파일을 만들어야합니다 .

시작 파일을 작성하는 예제 명령은 다음과 같습니다.

sudo /usr/libexec/PlistBuddy /Library/LaunchAgents/com.launchd.maxfiles.plist -c "add Label string com.launchd.maxfiles" -c "add ProgramArguments array" -c "add ProgramArguments: string launchctl" -c "add ProgramArguments: string limit" -c "add ProgramArguments: string maxfiles" -c "add ProgramArguments: string 10240" -c "add ProgramArguments: string unlimited" -c "add RunAtLoad bool true"

그러나 파일은 시스템 시작시로드되어 수동으로 실행되도록로드됩니다.

sudo launchctl load /Library/LaunchAgents/com.launchd.maxfiles.plist

현재 한계를 확인하려면 다음을 실행하십시오 launchctl limit..

시작 데몬 및 에이전트 작성을 참조하십시오 .

커널 한계

  • 커널 한계는 sysctl명령에 의해 제어됩니다 .
  • 현재 커널 한계를 보려면 다음을 실행하십시오 sysctl -a | grep ^kern.max..
  • 열 수있는 최대 파일을 변경하려면 다음을 실행하십시오 sudo sysctl -w kern.maxfiles=20480..
  • 변경 사항을 영구적으로 유지하려면 위의 비슷한 방법을 사용하여 시스템 시작 폴더에 속성 목록 파일을 만듭니다.

관련 :


더 이상 사용되지 않는 메소드

이전 버전의 macOS에서는 /etc/sysctl.conf일반적으로 Unix에서와 같이 시스템 전체 에서 이러한 제한을 설정할 수 있지만 지원되지 않는 것 같습니다.

를 사용 ~/.launchd.conf하거나 /etc/launchd.conf기존 버전의 macOS에서도 지원되지 않는 것 같습니다. 위키

/etc/rc.local시작 파일 과 동일하며 macOS에서 지원되지 않습니다.


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

이제 한계를 확인 / 설정하는 두 가지 방법이있는 이유를 찾아야합니다 ....


좋아요 - 보인다 ulimitsysctl그들이 실제로 뭔가를 할 것을 거짓 긍정적 인 의미를 부여 - 대신 그들은 것 같다 쓸모 . 누군가 그것을 확인할 수 있습니까?


알았어. 이해하기 시작 했어. v10.4 init부터는 더 이상 프로세스 가 없으며 launchdPID로 1로 실행되는 로 대체되었습니다 .

% ps -fu root
  UID   PID  PPID   C     STIME TTY           TIME CMD
    0     1     0   0   0:30.72 ??         0:46.72 /sbin/launchd

물론 언급 할 가치가있는 것은 ulimit쉘 내장 launchctl프로그램이며 쉘 독립 프로그램입니다.


2

OS X에서 데몬이나 프로세스 또는 작업에 대한 소프트 한계를 수정하려는 경우 이러한 소프트 한계를 변경하는 올바른 방법은 모든 프로세스에 대해 기본 실행 구성을 변경하는 것이 아니라 프로세스에 맞게 설정하는 것입니다. 실행하려고합니다.

이것은 프로세스를 위해 시작된 .plist 파일에서 수행됩니다.

더 많은 열린 파일이 필요한 데몬 또는 프로세스가 실행중인 경우 plist 파일을 작성하고 다음 매개 변수를 추가하십시오.

    <key>SoftResourceLimits</key>
    <dict>
        <key>NumberOfFiles</key>
        <integer>1024</integer>
    </dict>

mongodb를 사용하는 예입니다. org.mongo.mongodb.plist라는 .plist 파일을 만들어 /Library/LaunchDaemons/org.mongo.mongodb.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>Disabled</key>
  <false/>
  <key>Label</key>
  <string>org.mongo.mongod</string>
  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/lib/mongodb/bin/mongod</string>
    <string>--dbpath</string>
    <string>/Users/Shared/mongodata/</string>
    <string>--logpath</string>
    <string>/var/log/mongodb.log</string>
  </array>
  <key>QueueDirectories</key>
  <array/>
  <key>RunAtLoad</key>
  <true/>
  <key>UserName</key>
  <string>daemon</string>
  <key>SoftResourceLimits</key>
  <dict>
    <key>NumberOfFiles</key>
    <integer>1024</integer>
    <key>NumberOfProcesses</key>
    <integer>512</integer>
  </dict>
</dict>
</plist>

이제 프로세스에는 시스템의 전역 구성을 방해하지 않고 필요한 리소스가 있습니다. 다시 시작하면 자동으로 설정됩니다. 또는 다시 시작하지 않으려면 다음을 실행할 수 있습니다.

sudo launchctl load /Library/LaunchDaemons/org.mongod.plist

프로세스 또는 작업이 데몬보다 에이전트 인 경우 .plist를 / Library / LaunchAgents에 넣을 수 있습니다. 시작된 프로세스가 두 경우 모두 프로세스를 제어하는 ​​방법에 대해 다른 규칙이 적용됩니다. LaunchDaemons는 시작된 프로세스가 항상 최신 상태를 유지하려고 시도합니다.


1

다음은 대부분의 솔루션을 해결해야하며 계층 순서대로 나열됩니다.

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 maxfile은 sysctl maxfile에 의해 제한되므로이를 초과 할 수 없습니다.
  4. sysctl은 launchctl maxfiles에서 kern.maxfilesperproc을 상속받는 것으로 보입니다.
  5. ulimit는 launchctl의 '파일 열기'값을 기본적으로 상속받는 것으로 보입니다.
  6. / etc / profile 또는 ~ / .profile 내에서 사용자 정의 ulimit를 설정할 수 있습니다. 이것이 필요하지는 않지만 예제를 제공했습니다.
  7. 기본값과 비교할 때 이러한 값을 매우 높은 숫자로 설정할 때는주의하십시오. 기능에는 안정성 / 보안이 있습니다. 다른 웹 사이트에 작성된 것으로 생각되는이 예제 번호를 사용했습니다.
  8. launchctl 제한이 sysctl 제한보다 낮 으면 관련 sysctl 제한이 요구 사항을 충족시키기 위해 자동으로 충돌 할 것이라는보고가있었습니다.

1

내 경험은 프로세스 수가 많은 작업은 다음과 같이 성공한 것입니다.

kern.maxproc=2500  # This is as big as I could set it.

kern.maxprocperuid=2048

ulimit -u 2048

/etc/sysctl.conf안정적인 설정을 위해 처음 두 개는 launchd.conf에 들어가고 ulimit 값으로 들어갈 수 있습니다.

tcp / ip가 내가하고있는 일의 일부이기 때문에, 나는 또한 강화해야했다.

kern.ipc.somaxconn=8192

기본 128에서.

프로세스 제한을 늘리기 전에 리소스가 부족한 "포크"오류가 발생했습니다. kern.ipc.somaxconn을 늘리기 전에 "깨진 파이프"오류가 발생했습니다.

이것은 내 괴물 Mac, OS 10.5.7, 10.5.8, 현재 10.6.1에서 공정 번호 (500-4000)의 분리 된 프로세스를 실행하는 동안 발생했습니다. 내 상사 컴퓨터의 Linux에서 방금 작동했습니다.

프로세스 수는 1000에 가까울 것이라고 생각했지만 시작한 모든 프로세스에는 실제 작업을 수행하는 실제 항목 외에도 자체 쉘 사본이 포함 된 것으로 보입니다. 매우 축제.

나는 다음과 같은 디스플레이 장난감을 썼다 :

#!/bin/sh

while[ 1 ]

do

    n=netstat -an | wc -l

    nw=netstat -an | grep WAIT | wc -l

    p=ps -ef | wc -l

    psh=ps -ef | fgrep sh | wc -l

    echo "netstat: $n   wait: $nw      ps: $p   sh: $psh"

    sleep 0.5

done

그리고 ps -ef의 최대 프로세스 수와 netstat TIME_WAIT에서 만료 되기를 기다리는 것을 보았습니다 TIME_WAIT.

한계를 높이기 전에 1K 미만으로 시작했지만 1190의 높은 값으로 상승한 실패 임계 값을 몰래 움직일 수있었습니다. 실패 할 때마다 다음에 조금 더 걸릴 수 있습니다. 캐시는 실패 할 때마다 한계까지 확장되었습니다.

최종 진술로 내 테스트 케이스에 "대기"가 있었지만 종료 된 후에도 분리 된 프로세스가 많이 남아있었습니다.

인터넷에 게시 할 때 사용한 대부분의 정보를 얻었지만 모든 정보가 정확하지는 않았습니다. 마일리지가 다를 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.