Linux系統最大進程數和單進程最大線程數

一、linux系統支持的最大進程數

       限制1:既然系統使用pid_t表示進程號,那麼最大進程數不能超過pid_t類型的最大值吧

       限制2:使用命令ulimit -u查看系統中限制的最大進程數,我的機器上是65535。/etc/security/limits.conf裏面是硬限制,ulimit -u是軟限制,內核參數kernel.pid_max也做了限制。

       限制3:受系統資源限制,創建一個新進程會消耗系統資源,最主要的就是內存,有人做過測試,在創建6千多個進程時,程序運行得很慢,通過vmstat命令觀察,發現swap內存的置入置出很頻繁,可以判斷是由於內存不足,使用虛擬內存,導致頻繁的IO操作,讓測試代碼變得很慢,所以創建過多進程時,系統的內存是重要衡量的一個方面。

二、單進程最大線程數

     linux 系統中單個進程的最大線程數有其最大的限制 PTHREAD_THREADS_MAX,這個限制可以在 /usr/include/bits/local_lim.h 中查看,對 linuxthreads 這個值一般是 1024,對於 nptl 則沒有硬性的限制,僅僅受限於系統的資源, 這個系統的資源主要就是線程的 stack 所佔用的內存,用 ulimit -s 可以查看默認的線程棧大小,一般情況下,這個值是 8M。

       可以寫一段簡單的代碼驗證最多可以創建多少個線程 

int main()
{
     int i = 0;
     pthread_t thread;

     while (1) {
         if (pthread_create(&thread, NULL, foo, NULL) != 0)
             return;
         i ++;
         printf("i = %d\n", i);
     }
}

試驗顯示,在 linuxthreads 上最多可以創建 381 個線程,之後就會返回 EAGAIN
在 nptl 上最多可以創建 382 個線程,之後就會返回 ENOMEM
這個值和理論完全相符,因爲 32 位 linux 下的進程用戶空間是 3G(32位下進程可尋址4G,3G爲用戶空間,1G爲內核空間) 的大小,也就是 3072M,用 3072M 除以 8M 得 384,但是實際上代碼段和數據段等還要佔用一些空間,這個值應該向下取整到 383,再減去主線程,得到 382。
那爲什麼 linuxthreads 上還要少一個線程呢?這可太對了,因爲 linuxthreads 還需要一個管理線程
爲了突破內存的限制,可以有兩種方法
1) 用 ulimit -s 1024 減小默認的棧大小
2) 調用 pthread_create 的時候用 pthread_attr_getstacksize 設置一個較小的棧大小
要注意的是,即使這樣的也無法突破 1024 個線程的硬限制,除非重新編譯 C 庫

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章