===========最大線程數==============
linux 系統中單個程序的最大線程數有其最大的限制 PTHREAD_THREADS_MAX
這個限制可以在 /usr/include/bits/local_lim.h 中檢視
對 linuxthreads 這個值一般是 1024,對于 nptl 則沒有硬性的限制,僅僅受限于系統的資源
這個系統的資源主要就是線程的 stack 所占用的記憶體,用 ulimit -s 可以檢視預設的線程棧大小,一般情況下,這個值是 8M
可以寫一段簡單的代碼驗證最多可以建立多少個線程
試驗顯示,在 linuxthreads 上最多可以建立 381 個線程,之後就會傳回 EAGAIN
在 nptl 上最多可以建立 382 個線程,之後就會傳回 ENOMEM
這個值和理論完全相符,因為 32 位 linux 下的程序使用者空間是 3G 的大小,也就是 3072M,用 3072M 除以 8M 得 384,但是實際上代碼段和資料段等還要占用一些空間,這個值應該向下取整到 383,再減去主線程,得到 382。
那為什麼 linuxthreads 上還要少一個線程呢?這可太對了,因為 linuxthreads 還需要一個管理線程
為了突破記憶體的限制,可以有兩種方法
1) 用 ulimit -s 1024 減小預設的棧大小
2) 調用 pthread_create 的時候用 pthread_attr_getstacksize 設定一個較小的棧大小
要注意的是,即使這樣的也無法突破 1024 個線程的硬限制,除非重新編譯 C 庫 <=此處值得讨論,我在ubuntu 7.04+3G記憶體上用ulimit -s 1024,則可以得到3054個線程。
===============程序最大數=================
LINUX中程序的最大理論數計算:
每個程序的局部段描述表LDT都作為一個獨立的段而存在,在全局段描述表GDT中要有一個表項指向這個段的起始位址,并說明該段的長度以及其他一些 參數。除上之外,每個程序還有一個TSS結構(任務狀态段)也是一樣。是以,每個程序都要在全局段描述表GDT中占據兩個表項。那麼,GDT的容量有多大 呢?段寄存器中用作GDT表下标的位段寬度是13位,是以GDT中可以有8192個描述項。除一些系統的開銷(例如GDT中的第2項和第3項分别用于核心 的代碼段和資料段,第4項和第5項永遠用于目前程序的代碼段和資料段,第1項永遠是0,等等)以外,尚有8180個表項可供使用,是以理論上系統中最大的 程序數量是4090。
===============重新編譯核心來修改程序打開的最大檔案數和修改listen偵聽隊列==========
用“ulimit -a”能看到這些限制,如:
用ulimit ?n 10240 修改打開的檔案數目變為 10240
雖然使用ulimit ?a 能看到變為10240,不過我在做壓力測試的時候,當超過1024個使用者時,服務就會down機。
最後隻有重新編譯了核心,編譯核心後一切OK!
操作方法如下:
不同的Linux核心版本有不同的調整方法,
在Linux核心2.2.x中能用如下指令修改:
并将以上指令加到/etc/rc.c/rc.local檔案中,以使系統每次重新啟動時設定以上值。
在Linux核心2.4.x中需要修改原始碼,然後重新編譯核心才生效。編輯Linux核心原始碼中的 include/linux/fs.h檔案,
将 NR_FILE 由8192改為 65536,将NR_RESERVED_FILES 由10 改為 128。編輯fs/inode.c 檔案将 MAX_INODE 由16384改為262144。
一般情況下,最大打開檔案數比較合理的設定為每4M實體記憶體256,比如256M記憶體能設為16384,
而最大的使用的i節點的數目應該是最大打開檔案數目的3倍到4倍。
轉自:http://hi.baidu.com/litto/blog/item/6185fbdddb1bc5e876c638a6.html
本文轉自張昺華-sky部落格園部落格,原文連結:http://www.cnblogs.com/sky-heaven/p/7017198.html,如需轉載請自行聯系原作者