深入探討linux下進程的最大線程數、進程最大數、進程開啟的檔案數

來源:互聯網
上載者:User

=====最大線程數====
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 的大小,也就是 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”能看到這些限制,如: 複製代碼 代碼如下:[root@HQtest root]# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 2047
virtual memory (kbytes, -v) unlimited

用ulimit ?n 10240 修改開啟的檔案數目變為 10240
雖然使用ulimit ?a 能看到變為10240,不過我在做壓力測試的時候,當超過1024個使用者時,服務就會down機。
最後只有重新編譯了核心,編譯核心後一切OK!
操作方法如下:
不同的Linux核心版本有不同的調整方法,
在Linux核心2.2.x中能用如下命令修改: 複製代碼 代碼如下:# echo '8192' > /proc/sys/fs/file-max
# echo '32768' > /proc/sys/fs/inode-max

並將以上命令加到/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倍。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.