深入探討linux下進(jìn)程的最大線(xiàn)程數(shù)、進(jìn)程最大數(shù)、進(jìn)程打開(kāi)的文件數(shù)
=====最大線(xiàn)程數(shù)====
linux 系統(tǒng)中單個(gè)進(jìn)程的最大線(xiàn)程數(shù)有其最大的限制 PTHREAD_THREADS_MAX
這個(gè)限制可以在 /usr/include/bits/local_lim.h 中查看
對(duì) linuxthreads 這個(gè)值一般是 1024,對(duì)于 nptl 則沒(méi)有硬性的限制,僅僅受限于系統(tǒng)的資源
這個(gè)系統(tǒng)的資源主要就是線(xiàn)程的 stack 所占用的內(nèi)存,用 ulimit -s 可以查看默認(rèn)的線(xiàn)程棧大小,一般情況下,這個(gè)值是 8M
可以寫(xiě)一段簡(jiǎn)單的代碼驗(yàn)證最多可以創(chuàng)建多少個(gè)線(xiàn)程
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);
}
}
試驗(yàn)顯示,在 linuxthreads 上最多可以創(chuàng)建 381 個(gè)線(xiàn)程,之后就會(huì)返回 EAGAIN
在 nptl 上最多可以創(chuàng)建 382 個(gè)線(xiàn)程,之后就會(huì)返回 ENOMEM
這個(gè)值和理論完全相符,因?yàn)?32 位 linux 下的進(jìn)程用戶(hù)空間是 3G 的大小,也就是 3072M,用 3072M 除以 8M 得 384,但是實(shí)際上代碼段和數(shù)據(jù)段等還要占用一些空間,這個(gè)值應(yīng)該向下取整到 383,再減去主線(xiàn)程,得到 382。
那為什么 linuxthreads 上還要少一個(gè)線(xiàn)程呢?這可太對(duì)了,因?yàn)?linuxthreads 還需要一個(gè)管理線(xiàn)程
為了突破內(nèi)存的限制,可以有兩種方法
1) 用 ulimit -s 1024 減小默認(rèn)的棧大小
2) 調(diào)用 pthread_create 的時(shí)候用 pthread_attr_getstacksize 設(shè)置一個(gè)較小的棧大小
要注意的是,即使這樣的也無(wú)法突破 1024 個(gè)線(xiàn)程的硬限制,除非重新編譯 C 庫(kù) <=此處值得討論,我在ubuntu 7.04+3G內(nèi)存上用ulimit -s 1024,則可以得到3054個(gè)線(xiàn)程。
===============進(jìn)程最大數(shù)=================
LINUX中進(jìn)程的最大理論數(shù)計(jì)算:
每個(gè)進(jìn)程的局部段描述表LDT都作為一個(gè)獨(dú)立的段而存在,在全局段描述表GDT中要有一個(gè)表項(xiàng)指向這個(gè)段的起始地址,并說(shuō)明該段的長(zhǎng)度以及其他一些 參數(shù)。除上之外,每個(gè)進(jìn)程還有一個(gè)TSS結(jié)構(gòu)(任務(wù)狀態(tài)段)也是一樣。所以,每個(gè)進(jìn)程都要在全局段描述表GDT中占據(jù)兩個(gè)表項(xiàng)。那么,GDT的容量有多大 呢?段寄存器中用作GDT表下標(biāo)的位段寬度是13位,所以GDT中可以有8192個(gè)描述項(xiàng)。除一些系統(tǒng)的開(kāi)銷(xiāo)(例如GDT中的第2項(xiàng)和第3項(xiàng)分別用于內(nèi)核 的代碼段和數(shù)據(jù)段,第4項(xiàng)和第5項(xiàng)永遠(yuǎn)用于當(dāng)前進(jìn)程的代碼段和數(shù)據(jù)段,第1項(xiàng)永遠(yuǎn)是0,等等)以外,尚有8180個(gè)表項(xiàng)可供使用,所以理論上系統(tǒng)中最大的 進(jìn)程數(shù)量是4090。
====重新編譯內(nèi)核來(lái)修改進(jìn)程打開(kāi)的最大文件數(shù)和修改listen偵聽(tīng)隊(duì)列====
用“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 修改打開(kāi)的文件數(shù)目變?yōu)?10240
雖然使用ulimit ?a 能看到變?yōu)?0240,不過(guò)我在做壓力測(cè)試的時(shí)候,當(dāng)超過(guò)1024個(gè)用戶(hù)時(shí),服務(wù)就會(huì)down機(jī)。
最后只有重新編譯了內(nèi)核,編譯內(nèi)核后一切OK!
操作方法如下:
不同的Linux內(nèi)核版本有不同的調(diào)整方法,
在Linux內(nèi)核2.2.x中能用如下命令修改:
# echo '8192' > /proc/sys/fs/file-max
# echo '32768' > /proc/sys/fs/inode-max
并將以上命令加到/etc/rc.c/rc.local文件中,以使系統(tǒng)每次重新啟動(dòng)時(shí)設(shè)置以上值。
在Linux內(nèi)核2.4.x中需要修改原始碼,然后重新編譯內(nèi)核才生效。編輯Linux內(nèi)核原始碼中的 include/linux/fs.h文件,
將 NR_FILE 由8192改為 65536,將NR_RESERVED_FILES 由10 改為 128。編輯fs/inode.c 文件將 MAX_INODE 由16384改為262144。
一般情況下,最大打開(kāi)文件數(shù)比較合理的設(shè)置為每4M物理內(nèi)存256,比如256M內(nèi)存能設(shè)為16384,
而最大的使用的i節(jié)點(diǎn)的數(shù)目應(yīng)該是最大打開(kāi)文件數(shù)目的3倍到4倍。
上一篇:DHCP:解析開(kāi)發(fā)板上動(dòng)態(tài)獲取ip的2種實(shí)現(xiàn)方法詳解
欄 目:C語(yǔ)言
下一篇:深入探討C語(yǔ)言中局部變量與全局變量在內(nèi)存中的存放位置
本文標(biāo)題:深入探討linux下進(jìn)程的最大線(xiàn)程數(shù)、進(jìn)程最大數(shù)、進(jìn)程打開(kāi)的文件數(shù)
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/4485.html
您可能感興趣的文章
- 01-10深入理解約瑟夫環(huán)的數(shù)學(xué)優(yōu)化方法
- 01-10深入二叉樹(shù)兩個(gè)結(jié)點(diǎn)的最低共同父結(jié)點(diǎn)的詳解
- 01-10深入理解C++中常見(jiàn)的關(guān)鍵字含義
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
- 01-10深入第K大數(shù)問(wèn)題以及算法概要的詳解
- 01-10深入解析最長(zhǎng)公共子串
- 01-10深入理解鏈表的各類(lèi)操作詳解
- 01-10深入N皇后問(wèn)題的兩個(gè)最高效算法的詳解
- 01-10深入理解二叉樹(shù)的非遞歸遍歷
- 01-10深入全排列算法及其實(shí)現(xiàn)方法


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫(xiě)分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫(xiě)函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法實(shí)例總結(jié)
- 04-02jquery與jsp,用jquery
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子