OS X 10.7.1의“시스템에 너무 많은 열린 파일”오류가 수정 되었습니까?


191

OS X 10.7.1의 성가신 "시스템에 너무 많은 파일이 열려 있습니다"제한을 제거해야합니다. 

방법이 있습니까?


4
이 상황에 대해 더 자세히 설명 하시겠습니까? 어떤 상황에서?
slhck

1
@ slhck-같은 문제가 있습니다. 상황은 기본적으로 "무작위"입니다. 저는 개발자이므로 Mac을 상당히 많이 사용하고 있습니다. 하나 이상의 데이터베이스, 웹 서버, 테스트 도구, 하나 이상의 브라우저 및 음악 플레이어를 한 번에 실행합니다. Chrome은 많은 파일이 열려있는 하나의 프로그램 인 것 같습니다.
Nathan Long

사실, "무거운 사용"은 문제가되지 않았습니다. 커널 및 프로세스 당 최대 열린 파일 수에 대한 내 설정은 기본값보다 훨씬 낮습니다.
Nathan Long

2
네이선의 의견을 읽고 왜 그가 기본값에 대한 세부 사항을 포함하지 않았는지 궁금하다면, 그것은 아래의 답변에서 모든 것을 철자했기 때문입니다. (Nice answer! :)
Olie

나는 Nathan Long과 같은 사용 환경에 있으며 Apache를 다시 시작하는 것이 문제를 "해결"한 유일한 단계라는 것을 알았습니다. 아래의 모든 한도 증가를 적용했지만 즉시 도움이되지 않았습니다. 동일한 맥북에서 phpUnit tests> selenium server> firefox> apache> php> mysql 명령 행을 모두 실행하고 있습니다. 내가 매버릭스로 업그레이드 할 때까지 잘 작동했습니다. 내가 얻는 오류는 테스트중인 webapp에 있습니다. 즉, 파일이 부족한 php / apache이므로 셸 설정으로 제어되지 않을 것입니다.
scipilot

답변:


225

이 유용한 기사 에 따르면 (읽을 것을 권장합니다) :

기본적으로 Mac OS X에서 열 수있는 최대 파일 수는 12,288로 설정되어 있으며 지정된 프로세스에서 열 수있는 최대 파일 수는 10,240입니다.

다음을 통해 확인할 수 있습니다.

  • sysctl kern.maxfiles
  • sysctl kern.maxfilesperproc

다음과 같은 방법으로 자신의 위험에 따라 제한을 늘릴 수 있습니다.

  • sysctl -w kern.maxfiles=20480 (또는 원하는 숫자)
  • sysctl -w kern.maxfilesperproc=18000 (또는 원하는 숫자)

변경 사항을 영구적 으로 만들려면 다음과 같이 sudo설정 /etc/sysctl.conf을 작성하십시오 (생성해야 할 수도 있음).

kern.maxfiles=20480
kern.maxfilesperproc=18000

참고 : OS X 10.10 이하에서는 다음 /etc/launchd.conf과 같이 설정을 추가 할 수 있으며 limit maxfiles여기에 입력 한 내용보다 우선합니다.

다시 기사에서 :

이 작업을 완료하면 커널 자체에 최대 파일 수가 있지만 셸에는 없을 수 있습니다. 그리고이 많은 파일을 차지할 대부분의 프로세스는 쉘에 의해 시작될 것이므로이를 증가시키고 싶을 것입니다.

그 명령은 다음과 같습니다.

ulimit -S -n 2048 # or whatever number you choose

그 변화도 일시적입니다. 현재 쉘 세션 동안 만 지속됩니다. 당신은 당신의 쉘 구성 파일 (에 추가 할 수 있습니다 .bashrc, .zshrc당신은 당신이 쉘을 열 때마다 실행하려는 경우 또는 무엇이든).


1
실행 영역에서 아이콘을 클릭하여 시작된 프로세스에 어떤 제한이 적용됩니까? 그리고 그 한계를 바꾸는 방법? "쉘"이라고 말하면 대화식 터미널 쉘을 의미한다고 가정합니다.
Cheeso

@Cheeso - 내가 생각하는 전체 시스템의 한계 (sysctl을) 또는 launchd에 제한이 낮은 중, 그것을 제어하는.
Nathan Long

1
내용 제한을 가진 /etc/launchd.conf를 작성하십시오 maxfiles 1000000 1000000 저에게 효과적이었습니다! (OSX 10.8.2 here)
Zugwalt

1
내가 넣어 kern.maxfiles=65000 kern.maxfilesperproc=65000/etc/sysctl.conf에와 재부팅. kern.maxfiles는 무시되고 기본값을 유지했지만 kern.maxfilesperproc는 65000으로 설정되었습니다.
pferrel

2
max 파일이 고착되지 않는 문제가있는 사람은 maxfiles 행 뒤에 후행 공백이 있기 때문에 삭제해야하기 때문입니다.
jjathman

62

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

고마워요! 내 경우에는 오류가 메시지와 함께 Java 프로세스에서 나타납니다IO Error: Bad file descriptor (Write failed)
agradl

1
또한 El Capitan 10.11.6에서 작동
Troy Daniels

여전히 쉘의 ulimit를 변경할 수 없습니다. 최대 값은 내가 무엇을하든 1024를 유지합니다
DataGreed

2 단계에서 실행 : sudo chmod 600 /Library/LaunchDaemons/limit.maxfiles.plist sudo chown root /Library/LaunchDaemons/limit.maxfiles.plist
Hai Nguyen

32

ulimit 설정을 늘려야합니다. 요즘 OS X에서는 기본적으로 256입니다. ulimit -n 4096~ / .profile 또는 이와 동등한 것을 추가 하거나 유사하게하면 로컬 환경에서 해결할 수 있습니다. ulimit -a현재 레벨을 확인하기 위해 실행

시스템 설정을 보려면 다음을 실행하십시오.

launchctl limit maxfiles

이전보다 프로세스별로 Lion (10240)에서 상당히 높게 설정되었습니다. 그러나 여전히 타격을 가하면 원하는 레벨의 동일한 명령을 사용하여 더 높게 설정할 수 있습니다. 변경 사항을 영구적으로 유지하려면 /etc/launchd.conf에서 관련 행을 추가해야합니다.


1
256? 그것은 2560 파일 설명자이며 결코 변경하지 않았습니다. 한계는 266 개의 프로세스입니다 (cf ulimit -a).
slhck

2
MacOS X Maverick의 256 개 파일
Climbatize

4
OS X Yosemite에서도 256
Alexander는

2
El Capitan의 256도.
TMN

1
요세미티에서 256.
Jaec

31

다른 옵션은 범인을 찾는 것일 수 있습니다.

sudo lsof -n | cut -f1 -d' ' | uniq -c | sort | tail

마지막 파일의 경우 열려있는 파일을 볼 수 있습니다.

sudo lsof -n | grep socketfil

원하는 경우 프로세스를 종료하십시오.

kill $pid

의견에서 :

가치있는 것을 위해 가장 열린 파일을 사용하여 프로세스 ID 목록을 얻을 수도 있습니다.

lsof -n | sed -E 's/^[^ ]+[ ]+([^ ]+).*$/\1/' | uniq -c | sort | tail

도움이됩니다! 그러나 OS X (10.11)에서 정렬은 -h를 사용하지 않습니다. (Maybe -g?)
Robert Calhoun

나를 위해 -h(OS X 10.12.3) 없이 잘 작동했습니다 :sudo lsof -n | cut -f1 -d' ' | uniq -c | sort | tail
vearutop


이것은 내 문제의 근본 원인이 된 유일한 답변입니다 .. thanks :)
SgtPooki

1
lsof -n +c 0프로세스 이름이 잘리지 않도록하는 데 사용 합니다.
vaughan

9

매버릭스 10.9.4에 사람들

ulimit -n 2048잘 작동합니다. 새로운 로그인 세션을 시작해야 할 수도 있습니다.


2

최신 macOS (작성 시점 : 10.14.1)의 경우 sudo launchctl limit maxfiles 64000 524288(기본적으로 256) 사용할 수 있지만 현재 세션 내에서만 작동합니다. 영구적 인 해결책 launchctl을 위해서는 @ninjaPixel ( https://superuser.com/a/1171028/760235 )의 작업을 사용하십시오 .


번호 524288을 어떻게 생각 해냈습니까? 내 이전 값은 256이며 무제한이었습니다.
Chip Roberson

1

당신은 실행할 수 있습니다

lsof -n

어떤 프로세스가 너무 많은 파일을 엽니 다.

그럼 죽여

또는

sysctl -w kern.maxfiles=20480

더 큰 것으로 변경하십시오.


3
이 답변이 이미 제공된 답변과 어떻게 다른지 설명하십시오.
Stephen Rauch

1

내 자바 위의 모든 변경 후 10000 개 이상의 파일을 만들지 못했습니다. 해결책은이 jvm 플래그였습니다 -XX : -MaxFDLimit


0

chmod -R을 수행하는 동안 문제가 발생하여 더 작은 단계를 수행하여 문제를 해결했습니다.

# for each directory
find . -type d -exec chmod 755 {} \;

1
이것은 해결 방법 일지 모르지만 실제로 질문에 대답하지는 않습니다. 아마도 메시지를 제거 할 수 없다고 설명하고 문제를 덜 발생시키는 한 가지 방법으로 제안하면 답이 향상 될 것입니다.
music2myear

0

https://superuser.com/a/1171028/367819 와 유사

Mac OS X 시스템의 현재 제한을 확인하려면 다음을 실행하십시오.

launchctl limit maxfiles

마지막 두 열은 각각 소프트 및 하드 한계입니다.

Mac OS X Yosemite에서 시스템 전체에서 열린 파일 제한을 조정하려면 두 개의 구성 파일을 생성해야합니다. 첫 번째는 /Library/LaunchDaemons/limit.maxfiles.plist의 특성 목록 (일명 plist) 파일이며 다음 XML 구성을 포함합니다.

<?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>200000</string>
          <string>200000</string>
        </array>
      <key>RunAtLoad</key>
        <true/>
      <key>ServiceIPC</key>
        <false/>
    </dict>
  </plist>

이렇게하면 열린 파일 제한이 200000으로 설정됩니다. 두 번째 plist 구성 파일은 /Library/LaunchDaemons/limit.maxproc.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.maxproc</string>
      <key>ProgramArguments</key>
        <array>
          <string>launchctl</string>
          <string>limit</string>
          <string>maxproc</string>
          <string>2048</string>
          <string>2048</string>
        </array>
      <key>RunAtLoad</key>
        <true />
      <key>ServiceIPC</key>
        <false />
    </dict>
  </plist>

두 plist 파일 모두 root : wheel이 소유하고 권한 -rw-r--r--를 가져야합니다. 이 권한은 기본적으로 있어야하지만 sudo chmod 644를 실행하여 권한이 있는지 확인할 수 있습니다. 위에서 설명한 단계로 인해 시스템 전체 열린 파일 제한이 다시 시작될 때 올바르게 설정되지만 launchctl limit을 실행하여 수동으로 적용 할 수 있습니다.

시스템 레벨에서 이러한 한계를 설정하는 것 외에도 bashrc, bashprofile 또는 유사한 파일에 다음 행을 추가하여 세션 레벨에서 설정하는 것이 좋습니다.

ulimit -n 200000
ulimit -u 2048

plist 파일과 마찬가지로 bashrc 또는 유사한 파일에는 -rw-r--r-- 권한이 있어야합니다. 이제 컴퓨터를 다시 시작하고 터미널에 ulimit -n을 입력 할 수 있습니다. 시스템이 올바르게 구성된 경우 maxfiles가 200000으로 설정되어 있어야합니다.


자세한 내용은이 기사를 참조하십시오.

https://gist.github.com/tombigel/d503800a282fcadbee14b537735d202c


값을 유효하게하려면 Mac을 재시동하십시오.


답변이 이미있는 경우 게시물이 중복으로 표시되어야합니다. 그렇지 않으면 링크가 영구적으로 유효하지 않을 수 있으므로 링크에서 관련 정보를 게시하십시오.
Zymhan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.