2017-03-11 11 views
0

내가설정 maxfile 맥 OS 프로그래밍

$ launchctl limit 
    cpu   unlimited  unlimited  
    filesize unlimited  unlimited  
    data  unlimited  unlimited  
    stack  8388608  67104768  
    core  0    unlimited  
    rss   unlimited  unlimited  
    memlock  unlimited  unlimited  
    maxproc  709   1064   
    maxfiles 256   unlimited 

256의 소프트 제한이있을 나타납니다 (내 OS X 엘 캡 기계에) launchctllimit 명령을 사용하여 maxfiles 옵션을 보면, 하드 제한은 "무제한"입니다. 소프트 한도를 2048과 같이 변경하고 하드 제한을 그대로 둡니다. 내가 limit의 인수

$ launchctl help limit 
Usage: launchctl limit [<limit-name> [<both-limits> | <soft-limit> <hard-limit>] 

볼 때 나도 소프트 및 하드에 같은 일이, 또는 설정 값으로 모두 제한을 설정할 수 있습니다 나타납니다. 그러나 하드 제한을 무제한으로 설정하려고 시도합니다.

$ sudo launchctl limit maxfiles 2048 unlimited 

는 여기에 무슨 10240

$ launchctl limit 
    cpu   unlimited  unlimited  
    filesize unlimited  unlimited  
    data  unlimited  unlimited  
    stack  8388608  67104768  
    core  0    unlimited  
    rss   unlimited  unlimited  
    memlock  unlimited  unlimited  
    maxproc  709   1064   
    maxfiles 2048   10240   

의 호기심 값으로 끝? 무제한의 값을 설정할 수 있습니까? 그렇지 않다면, launchctl limit 명령의 제한 사항입니까, 아니면 시스템 수준의 무언가입니까? 나중에, unlimited의 초기 값은 무엇입니까? 아니면이 애플이 애플입니까?

보너스 포인트는 - 왜이 한계가 처음에 그렇게 낮게 설정되어 있는지 알 수 있습니까?

+0

피사체가 "프로그래밍 방식으로"라는 단어를 사용하는 이유는 무엇입니까? 여기서 보여주는 것은 기존의 의미에서 프로그래밍 방식으로 한도를 설정하지 않는 것입니다 (즉, 자체 프로그램에서 시스템 API를 호출하는 것). "외부"도구를 호출합니다. 따라서 주제를 벗어나서 슈퍼 유저 또는 Ask Different에 있어야합니다. –

+0

@KenThomases 질문은 본질적으로 내려 간다. 내 실제 컨텍스트는 프로그래밍중인 쉘 스크립트의 일부로 이러한 명령을 사용하고 있으며, 기본 시스템 호출에도 관심이있다. 즉, 내 프로그램에서 launchctl을 사용하지 않기로 결정한 것이므로 지금 당장은 가장 편리한 메커니즘입니다. 그것이 경계선이 아니다라고하는 어떤 논증도 아니라, SE가 포함 된 나의 년은 내게 그것이 그것이 머무르는 것을 말하는 국경의쪽에있는 것처럼 느낀다. –

답변

2

, launchd이 기능 구현에 의존하는 것이 기본 시스템 호출 :

setrlimit() 지금 역사적으로 성공 곳에서 EINVAL-errno 집합을 반환합니다. RLIM_NOFILE의 경우 "rlim_cur = RLIM_INFINITY"을 더 이상 허용하지 않습니다. "rlim_cur = min(OPEN_MAX, rlim_max)"을 사용하십시오.

그래서, 동안 getrlimit() 할 수있다 (처음에) 보고서는 하드 제한 RLIM_INFINITY 것을, 그것이 실제적으로, 즉 커널 구현 방법에 의해 부과 된 제한이 단순히 때문에 OPEN_MAX (10240). 한계를 설정하려고 시도하면 후자의 값을 사용해야하며 그 때부터보고 된 값에 영향을 미칩니다.

RLIM_NOFILE의 소프트 한도가 256으로 설정되는 이유는 방대하고 대다수의 프로세스에서 실제적인 제약이 없기 때문입니다. 그들은이 한도에 다가 가지 않고도 잘 지냅니다. 그리고 값을 "너무 낮게"유지한다는 것은 각 프로세스의 메모리 비용이 저렴하다는 것을 의미하며 각각의 파일 디스크립터를 새로운 하위 프로세스 등에 복제하는 작업이 적다는 것을 의미합니다.

더 많은 파일을 처리 할 가능성이있는 프로그램은 setrlimit()을 사용하여 자신의 제한을 변경할 수 있습니다.

1

이유에 대해 추측하지 않고서, 애플은 요세미티에서 이것을 변경했다. launchctl 한도를 통해 변경 한 사항은 현재 로그인 한 경우에만 일시적입니다. 다시 로그인하거나 재부팅하면 기본값으로 돌아갑니다.

10.12.4 b4에서이 동작이 변경되지 않았 음을 확인할 수 있습니다.

Apple이 Apple 일 때 쓸데없는 소화가 가능합니다. 개발자 문서에서 심도 깊은 잠수를했는데 왜 그들이 변경 한 이유에 대한 설명을 찾을 수 없었습니다. man page for setrlimit()에서