测试系统单进程的线程数上限(1)
Posted on Wed 23 November 2011 in 我思
前言
根据目前从网络上搜集到的信息来看,特定系统下一个应用进程能够开启的线程上限是受多方面因素影响(OS寻址范围、堆栈大小、OS限制、物理内存及交换区大小),具体哪个因素成为系统中的瓶颈,必须具体问题具体分析。而想要获得性能最优的线程数,就更是和具体应用方式关联在一起了。 不如直接测试,拿结果来反推更可靠一些。
我会先分析一下影响单进程创建线程数的瓶颈,然后再给出测试方法以及具体的测试代码和测试步骤,希望为广大系统工程师和程序员们提供一些有价值的帮助。
可能成为瓶颈的因素
32位系统的线程数瓶颈
对32位系统来说,理论上的寻址范围是4G(2^32),但实际系统还要预留系统空间用于自身管理,一般来说真正的最大寻址范围都要小于4G。
对于Linux来说,一个进程拥有的用户空间为0~0xBFFFFFFF,共3G;Windows的到0x7FFFFFFF,只有2G。(32位系统的寻址范围还可以扩大,应用某些扩展标准,例如PAE,最多能支持到16G到64G不等。但这个情况不在我的讨论范围)。
一个LInux进程在用户态最多访问3G内存,每个线程必须占用特定大小的堆栈空间(stack size),这个因素使32位系统创建的线程数不可能超过n
n=310001000k/StackSize
注:Stack Size可以用ulimit -s
查看,单位是k
一般linux的StackSize默认是1024k,所以大致上一个用户进程最对创建300左右的线程。
这个结论真实可信,实验代码和步骤见续篇。
Create thread 303
can't create thread: Cannot allocate memory
64位系统的线程数瓶颈
实测在一台64位linux下是8千多,mac下是2千多。
Create thread 8249
can't create thread: Resource temporarily unavailable
Create thread 2046
can't create thread: Resource temporarily unavailable
64位系统中的瓶颈因素没有令人信服的说明,欢迎大家提供线索。
实验方法
计划用不同语言(C/Python/Java)编写测试程序验证单进程创建线程上限。
大致计划如下:
C
32bit Linux/64bit Linux/64bit Mac OS
Python
32bit Linux/64bit Linux/64bit Mac OS
Java
OS/JDK: 64
OS/JDK: 32
OS:64/JDK:32
参考
Linux进程分析:
http://hi.baidu.com/zengzhaonong/blog/item/5b96e2fabd3a50d7b48f3191.html
1. 进程寻址空间0~4G
2. 进程在用户态只能访问0~3G,只有进入内核态才能访问3G~4G
3. 进程通过系统调用进入内核态
4. 每个进程虚拟空间的3G~4G部分是相同的
n=310001000k/StackSize注:Stack Size可以用
ulimit -s
查看,单位是k
一般linux的StackSize默认是1024k,所以大致上一个用户进程最对创建300左右的线程。
这个结论真实可信,实验代码和步骤见续篇。
Create thread 303
can't create thread: Cannot allocate memory
64位系统的线程数瓶颈
实测在一台64位linux下是8千多,mac下是2千多。
Create thread 8249
can't create thread: Resource temporarily unavailable
Create thread 2046
can't create thread: Resource temporarily unavailable
64位系统中的瓶颈因素没有令人信服的说明,欢迎大家提供线索。
实验方法
计划用不同语言(C/Python/Java)编写测试程序验证单进程创建线程上限。
大致计划如下:
C
32bit Linux/64bit Linux/64bit Mac OS
Python
32bit Linux/64bit Linux/64bit Mac OS
Java
OS/JDK: 64
OS/JDK: 32
OS:64/JDK:32
参考
Linux进程分析:
http://hi.baidu.com/zengzhaonong/blog/item/5b96e2fabd3a50d7b48f3191.html
1. 进程寻址空间0~4G
2. 进程在用户态只能访问0~3G,只有进入内核态才能访问3G~4G
3. 进程通过系统调用进入内核态
4. 每个进程虚拟空间的3G~4G部分是相同的
Create thread 8249
can't create thread: Resource temporarily unavailable
Create thread 2046
can't create thread: Resource temporarily unavailable
64位系统中的瓶颈因素没有令人信服的说明,欢迎大家提供线索。