2012-04-09 3 views
2

포크() 또는 스레드를 생성하는 것으로부터 많은 EAGAIN이 있었기 때문에 리소스가 어딘가에 누출되었다고 생각하게되었습니다. 활성의 pthreads의프로세스 내부에서 유닉스 리소스를 모니터링합니다.

  • 수는 활성 아이의
  • 수는 활성 파이프
  • 수를 처리합니다

    는 프로세스 자체 내부에서 다음 얻기 위해, POSIX, 그것은 가능 활성 소켓 (또는 이것과 파이프는 파일 설명자로 계산됩니까?)

또는 이러한 hav 수동으로 계산하려면? 이미 그들에 대한 카운터가 있지만, 나는 그들 중 하나가 유출 생각합니다.

+0

몇 개의 어린이/스레드를 만들고 있습니까? – Duck

+0

아마도 꽤 많이, 그들은 주로 exec()를 실행하기 전에 fork()를 호출하지만, 제대로 종료되는지 여부를 알고 싶습니다. – kamziro

답변

1

리소스 제한을 초과하기 때문에 EAGAIN을 받고있는 것 같습니다. 실행할 수있는 스레드 수/프로세스 수에 대한 시스템 제한이 있습니다. 당신은

cat /proc/sys/kernel/threads-max 

그것을보고 각각

echo 100000 > /proc/sys/kernel/threads-max 

로 변경할 수 있습니다. 프로세스에 대한 사용자 제한을 설정하는 가능성이 큽니다. 설명서 페이지를 읽고 getrlimitulimit에 대한 검색을 수행해야합니다. SO에 관한 많은 정보가 여기에 있습니다.

하나의 부모로부터 이러한 모든 프로세스를 생성한다고 가정하면 쉽게 추적 할 수 있어야합니다. fork() 전에 부모의 카운터를 증가시킵니다. 아이들이 자식을 산다면 더 복잡해지며 공유 메모리 나 다른 IPC 메커니즘을 사용해야합니다. 어쨌든 wait()waitpid() 시스템 호출을 사용하여 자녀의 상태를 확인할 수 있으며이를 기반으로 프로세스 카운터를 감소시킬 수 있습니다. wait에 의해 반환 된 상태 데이터는 각 자녀의 처분 처분을 알려줍니다. 다시 말하지만, 당신이 곤경에 처했을 때 이것에 대한 상당한 세부 사항으로 들어가는 SO에 관한 몇 가지 질문이 있습니다.

기본 질문에 대한 답변으로, 관련 리소스에 대해 시스템에 (대개/proc를 통해) 쿼리하는 방법이 있습니다. 당신이 자신의 리소스에 대해 우려하는 경우이 거의 항상 잘못된 방법으로 이동합니다. 스스로 추적 할 수있는 능력을 갖추고 있으며 훨씬 효율적입니다.

행운을 빈다. 희망이 올바른 방향으로 당신을 가리 킵니다.

관련 문제