2014-02-11 5 views
4

내 응용 프로그램은 연결 스레드마다 만듭니다. 응용 프로그램이 0이 아닌 사용자 ID에서 손상되며 스레드 수가 기본값 인 1024를 초과하는 경우가 있습니다. 나는 setcap underprivilaged 사용자의 사용에 따라RLIMIT_NPROC 값을 편집하는 더 좋은 방법입니다

실행 [너무 떨어 뜨리는 매우 나쁜 생각도 securty과 타협해야] 내가 루트로

실행을 몇 가지 옵션이이 번호를 편집 할 및 제공 기능 CAP_SYS_RESOURCE. 나는 코드 메신저 내 프로그램

 struct rlimit rlp; /* will initilize this later with values of nprocs(maximum number of desired threads)*/ 
     setrlimit(RLIMIT_NPROC, &rlp); 
     /*RLIMIT_NPROC 
     *The maximum number of processes (or, more precisely on Linux, threads) that can  
     * created for the real user ID of the 
     *calling process. Upon encountering this limit, fork(2) fails with the error 
     *EAGAIN. */ 

다른 것은 내가 개발 사용자에 대한 항목을 만들 수 있으며, 예를 들어 라인을 넣을 수있는 단순히 /etc/securitylimits.conf 편집하고 추가 할 수 있습니다

  @devuser  hard nproc   20000 
      @devuser  soft nproc   10000 

여기서 10k이면 충분합니다. 그리고 나는 무엇이 더 튼튼하고 standars 접근 방식인지 아는 더 많은 골동품입니다.

의견을 추구하고, PS

:) 사전에 감사합니다 : 하나의 프로세스 이상 1K 스레드와 함께 제공 될 경우 무슨 일이 일어날 지. ofcource 나는 32GB의 램도 가지고있다.

답변

3

첫째, 나는 거의 천 개의 스레드를 가지고 있다고 잘못 생각한다. 쓰레드는 비용이 많이 들고, 대다수를 쓰는 것은 일반적으로 적당하지 않습니다. 나는 당신이 매우 값 비싼 수퍼 컴퓨터를 사용하지 않는다면, 최대 몇 개의 스레드를 가질 것을 제안 할 것입니다.

poll(2)과 같은 다중 시스템 호출을 중심으로 event loop이있을 수 있습니다. 그런 다음 단일 스레드가 수천 개의 연결을 처리 할 수 ​​있습니다. C10K problemepoll에 대해 읽어보십시오. (특히 특권 TCP/IP 포트를 열기) 필요한 자원을-설정

당신은 (아마도 setuid 기술을 사용하여) 루트로 응용 프로그램을 시작할 수 ... libevent 또는 libev 등과 같은 일부 이벤트 라이브러리를 사용하는 것을 고려 및

또한 setrlimit(2)를 사용하여 한계를 증가 작은 setuid를 C 프로그램의 주위에 응용 프로그램을 포장 할 수 ... 읽기 Advanced Linux Programmingsetreuid(2)

을 사용자에게 변경, setreuid로 사용자를 변경하고 마지막 execve(2)에서 당신의 진짜 프로그램.

+1

고마워요 @Basile, 실제로 currunt 디자인은 다음과 같습니다. 그리고 다음 rev에서 우리는 그것을 바꿀 것입니다. 하지만 그때까지 우리는 계속 실행하고 싶습니다. 예. 슈퍼 컴퓨터에서 실행되지는 않지만 자원이 충분합니다. setuid 다음 setruid 좋은 옵션입니다. 하지만 지금은 코드를 변경하는 것에 주저하여 /etc/security/limit.conf 파일을 편집했습니다. – Akaks