2014-02-11 44 views
4

我的應用程序創建每個連接線程。應用程序在非零用戶標識下破壞,有時線程數超過默認值1024。我想編輯這多少讓我有幾個選擇這是更好的方法來編輯RLIMIT_NPROC值

運行作爲根[非常糟糕的主意,也有securty妥協,所以放棄它]

運行下underprivilaged用戶使用setcap,給能力CAP_SYS_RESOURCE。然後我就可以添加代碼IM我的程序

 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就夠了。因此,在chaning源代碼中不應該使用最後一個選項。而且我更加了解什麼是更強大和標準的方法。

尋求你的意見,並感謝你提前:)

PS:會發生什麼,如果一個單一的過程將1K多線程服務。 ofcource我有32GB的拉姆也

回答

3

首先,我相信你有錯有近千線程。線程是非常昂貴的,並且擁有這麼多的線程通常是不合理的。我建議最多有幾十個線程(除非你運行在一個非常昂貴的超級計算機上)。

您可能會有一些event loop圍繞多路複用系統調用,如poll(2)。然後一個線程可以處理數千個連接。閱讀關於C10K problemepoll。考慮使用一些事件庫,例如libeventlibev等等

你可以開始您的應用程序根目錄(比如用setuid技術),建立所需的資源(特別是打開特權TCP/IP端口)並改變用戶與setreuid(2)

閱讀Advanced Linux Programming ...

你也可以纏繞在一個小的setuid C程序的應用程序,提高了其使用setrlimit(2)的限制,與setreuid更改用戶,最後execve(2)你的真實程序。

+1

Thanks @Basile,其實currunt設計是這樣的,在下一個版本中,我們會改變它。但在那之前我們想保持它運行..是的沒有超級計算機上運行,​​但它有足夠的資源。 setuid然後setruid是偉大的選擇。但由於目前改變代碼的不情願,我編輯了/etc/security/limit.conf文件.. – Akaks

相關問題