문제

인증 서비스의 "AuthorizationExecutewitHefivileges"호출을 통해 루트/관리자 명령으로 실행되는 대량의 쉘 명령이 있습니다. 문제는 잠시 후 (10-15 초, 아마도 100 개의 쉘 명령) 프로그램이 디버거 에서이 오류로 응답을 중지한다는 것입니다.

포크 할 수 없음 : Errno 35

그런 다음 앱이 실행되는 동안 더 이상 응용 프로그램을 시작할 수 없습니다. 나는이 문제를 연구했고 분명히 시스템이 사용할 수있는 스레드가 없다는 것을 의미합니다. 그러나 Activity Monitor를 사용하여 확인했으며 앱은 4-5 스레드 만 사용합니다.

이 문제를 해결하기 위해, 내가해야 할 일은 쉘 명령을 별도의 스레드 (기본 스레드에서 멀리)로 분리하는 것입니다. 나는 전에 나사산을 사용한 적이 없으며 어디서부터 시작 해야할지 확신 할 수 없습니다 (찾을 수있는 포괄적 인 예 없음)

감사

도움이 되었습니까?

해결책

Louis Gerbarg가 이미 지적했듯이, 당신의 질문은 스레드와 관련이 없습니다. 그에 따라 제목과 태그를 편집했습니다.

인증 서비스의 "AuthorizationExecutewitHefivileges"호출을 통해 루트/관리자 명령으로 실행되는 대량의 쉘 명령이 있습니다.

그렇게하지 마십시오. 해당 기능은 루트로 실행하려는 도구로 루트 : 관리자 소유권과 setUID 모드 비트를 복원 할 수 있도록 존재합니다.

아이디어는 루트로 실행할 필요가없는 부분과 완전히 별도의 프로그램으로 루트로 실행 해야하는 코드를 고려해야한다는 것입니다. 루트가 필요하지 않은 부분은 (setuid를 사용하지 않음) 그것 없이는 갈 수 있습니다.

코드 예제는 승인 서비스 프로그래밍 안내서.

문제는 잠시 후 (10-15 초, 아마도 100 개의 쉘 명령) 프로그램이 디버거 에서이 오류로 응답을 중지한다는 것입니다.

couldn't fork: errno 35

응. 한 번에 수백 개의 프로세스 만 실행할 수 있습니다. 이것은 OS 강화 한계입니다.

그것은 소프트 한계이므로, 당신이 그것을 올릴 수는 있지만, 단단한 한도까지만 올릴 수는 없습니다. 출력을 참조하십시오 limit 그리고 limit -h (ZSH; 나는 다른 껍질에 대해 모른다).

더 많은 프로세스를 실행하기 전에 프로세스가 완료 될 때까지 기다려야합니다.

그런 다음 앱이 실행되는 동안 더 이상 응용 프로그램을 시작할 수 없습니다.

허용만큼 많은 프로세스를 실행하고 있기 때문입니다. 이 x-120- 프로세스 한계는 프로세스 당이 아닌 사용자 당입니다.

나는이 문제를 연구했고 분명히 시스템이 사용할 수있는 스레드가 없다는 것을 의미합니다.

아니 그렇지 않아.

Errno 오류 코드는 많은 것들에 사용됩니다. EAGAIN (35, "자원을 일시적으로 사용할 수 없음")는 스레드를 시작하는 시스템 호출에 의해 설정 될 때 더 이상 스레드를 의미 할 수 있지만 다른 시스템 호출 또는 기능으로 설정할 때는 의미는 아닙니다.

명시 적으로 인용 한 오류 메시지는 fork, 새로운 것을 시작하기위한 시스템 호출입니다. 프로세스, 새로운 것이 아닙니다 . 그런 맥락에서 EAGAIN "당신은 이미 가능한 한 많은 프로세스를 실행하고 있습니다"를 의미합니다. 보다 포크 맨 페이지.

그러나 Activity Monitor를 사용하여 확인했으며 앱은 4-5 스레드 만 사용합니다.

보다?

이 문제를 해결하기 위해, 내가해야 할 일은 쉘 명령을 별도의 스레드 (기본 스레드에서 멀리)로 분리하는 것입니다.

스레드 당 하나의 프로세스를 시작하면 프로세스가 훨씬 빠르게 부족할뿐입니다.

나는 전에 나사산을 사용한 적이 없다 ...

당신이 언급하는 기능이 스레드가 아닌 프로세스를 시작하기 때문에 아직 그렇지 않은 것처럼 들립니다.

다른 팁

이것은 스레드에 관한 것이 아닙니다 (적어도 응용 프로그램의 스레드가 아닙니다). 이것은 시스템 리소스에 관한 것입니다. 이들 포크 프로세스 각각은 최소 1 개의 커널 스레드 (아마도 더 많은), 일부 vnodes 및 기타 여러 가지를 소비합니다. 결국 시스템은 더 많은 프로세스를 스폰 할 수 없습니다.

첫 번째 한계는 관리 한도입니다. 이 시스템은 더 많은 것을 지원할 수 있지만 성능 저하 및 기타 문제가 발생할 수 있습니다. 일반적으로 sysctls와 같은 다양한 메카 니즘을 통해 이것들을 올릴 수 있습니다. 일반적으로 특정 조정의 혜택을받을 특정 (특별한) 작업 부하가 없으면 나쁜 생각입니다.

이러한 한도를 높이면 문제가 해결되지 않을 가능성이 있습니다. 이러한 한도를 조정하면 조금 더 오래 실행될 수 있지만 실제로 수정하려면 리소스가 시스템으로 반환되지 않는 이유를 파악해야합니다. 위에서 설명한 내용을 바탕으로 포크 프로세스가 나가지 않는다고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top