测试系统单进程的线程数上限(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部分是相同的