[MacOS] file descriptor와 process limit 늘리기

맥에서 “too many open files” 에러 나면서 안되는 경우가 있다. Linux에 비해 limits이 너무 적기 때문이다.

Big sur 기준

  1. sudo vi /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>524288</string>
      <string>524288</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>ServiceIPC</key>
    <false/>
  </dict>
</plist>

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

3. sudo vi /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>

4. sudo launchctl load -w /Library/LaunchDaemons/limit.maxproc.plist

5. sudo sysctl -w kern.maxfiles=5242880

6. sudo sysctl -w kern.maxfilesperproc=524288

7. Reboot

참고: https://wilsonmar.github.io/maximum-limits/

[Linux kernel] Softlockup 디텍터와 (nmi_watchdog로 알려진) hardlockup 디텍터

이 문서의 저작권은 GPL을 따릅니다(This document is released under the GPL license).

번역 : 양정석(dasomoli@gmailREMOVETHIS.com)

===============================================================

Softlockup 디텍터와 (nmi_watchdog로 알려진) hardlockup 디텍터
===============================================================
리눅스 커널은 soft와 hard lockup을 검출하기 위해서 watchdog처럼 동작할
수 있습니다.
‘softlockup’ 은 커널로부터 야기되는 다른 태스크들에게 실행할 기회를
주지 않고 커널 모드 안에서 20초 이상 도는 버그로 정의(자세한 사항은
아래 “구현” 참조)됩니다. 기본값으로 검출된 상태의 현재 스택 트레이스를
보여주고, 시스템은 멈춘 상태로 머물게 됩니다. 아니면 다르게 커널이 패닉
을 일으키도록 설정될 수도 있습니다; 이를 위해, sysctl의
“kernel.softlockup_panic”, 커널 파라미터의 “softlockup_panic”, 그리고
컴파일 옵션 “BOOTPARAM_HARDLOCKUP_PANIC”이 제공됩니다.
‘hardlockup’ 은 CPU로부터 야기되는 다른 인터럽트들이 실행할 기회를
주지 않고 커널 모드 안에서 10초 이상 도는 버그로 정의(자세한 사항은
아래 “구현” 참조)됩니다. softlockup 상황과 비슷하게, 기본값은 컴파일
타임 옵션의 “BOOTPARAM_HARDLOCKUP_PANIC”, 커널 파라미터의
“nmi_watchdog”(자세한 사항은 “Documentation/kernel-parameters.txt”
참조)을 통해 바꿀 수 있는데, 바뀌지 않는 한, 검출 상태의 현재 스택
트레이스를 보여주고, 시스템은 멈춘 상태로 머물게 됩니다. 
패닉 옵션은 지정된 시간이 지난 후에 시스템을 자동으로 리부팅하기 위해서
panic_timeout(이 timeout 은 헷갈리게 이름지어진 “kernel.panic” sysctl을
통해 셋팅됩니다)의 조합으로 사용될 수 있습니다.
=== 구현 ===
soft와 hard lockup 디텍터는 각각 hrtimer와 perf 서브시스템의 위에
빌드됩니다. 이의 직접적인 결과는 이론적으로 이들 서브 시스템이 제공되는
어떤 아키텍처 위에서도 동작한다는 것입니다.
주기적인 hrtimer는 인터럽트를 일으키고 watchdog 태스크를 수행(kick)하기
위해서 실행됩니다. NMI perf 이벤트는 매 (컴파일 타임에 10으로 초기화되고
같은 이름의 sysctl을 통해 설정될 수 있는)”watchdog_thresh” 초마다
hardlockup을 검사하기 위해서 생성됩니다. 시스템 안의 어떤 CPU가 그 
시간 동안 hrtimer 인터럽트를 받지 못한다면 ‘hardlockup 디텍터'(NMI perf
이벤트 핸들러)가 설정에 따라, 커널 경고를 생성하거나 패닉을 호출할
것입니다.
watchdog 태스크는 스케줄될 때마다 타임 스탬프를 업데이트 하는 최고
우선 순위 커널 스레드입니다. 타임 스탬프가 2 * watchdog_thresh 초
(softlockup threshold)동안 업데이트되지 않으면, 만약 패닉을 일으키도록
되어 있다면 패닉을 호출하고, 아니면 다른 커널 코드의 실행을 재개한 후에
(hrtimer 콜백 함수 안에 작성된) ‘softlockup 디텍터’가 유용한 디버그 정보를
시스템 로그로 덤프할 것입니다.
hrtimer의 주기는 hardlockup 디텍터가 수행되기 전에 인터럽트 발생을 위한
두번 혹은 세번의 기회를 가지는 2 * watchdog_thresh / 5 입니다.
위에 설명된 대로, 관리자가 hrtimer와 perf 이벤트의 주기를 설정할 수 있도록
커널 옵션이 제공됩니다. 각 환경에 맞는 값은 lockup을 위한 빠른 응답과 검출
오버헤드 사이의 트레이드 오프입니다.