您的位置:首页 > 运维架构 > Linux

关于linux系统最大进程数和单进程最大线程数的测试

2017-03-02 22:08 537 查看
我的系统:RedHat企业7 64位 内存6G

ulimit -a查看用于shell启动进程所占用的资源默认设置



一.最大进程数

1.使用命令
ulimit -u
查看软限制,我的为7807

/etc/security/limits.conf查看硬限制,内核参数kernel.pid_max也做了限制

2.系统用pid_t表示进程号,那么最大的进程数当然也不能超过pid_t的类型

查看最大进程数

cat /proc/sys/kernel/pid_max#查系统支持的最大进程数,一般会很大,相当于理论值




3.创建一个新进程会消耗系统资源(主要是内存),经测试,在创建6000多个进程时,程序运行的很缓慢,通过
vmstat
命令看到,swap内存置入置出频繁,可以判断是由于内存不足,使用虚拟内存,所创建过多进程时,系统内存必须要加以衡量。

代码验证:

#include<iostream>
#include<unistd.h>
#include<stdio.h>
using namespace std;

int main()
{
pid_t pid;
int i=0;
while(1)
{
pid = fork();
if(pid == 0)
break;
else if(pid == -1)
{
perror("create error");
break;
}
cout<<i++<<" process"<<endl;
}
}




可以即使是系统的默认配置文件,对最大进程数还是有所限制的,我的机器最多创建了32012个进程。这也就是为什么用ps aux命令监控系统资源时,进程的pid达到了近30000.

二.最大线程数

/usr/include/bits/local_lim.h
#define PTHREAD_THREADS_MAX 1024
,可见最大线程数限制为1024,而NPTL( Native POSIX Thread Library)中则没有硬性的限制,仅受限于系统资源(主要是线程的stack所占用的内存,可用命令
ulimits -s
查看,一般是8192KB(8M))。

cat /proc/sys/kernel/threads-max #查系统支持的最大线程数,一般会很大,相当于理论值




代码试验:

#include<stdio.h>
#include<unistd.h>
#include<pthread.h>

void* foo(void*)
{}
int main()
{
pthread_t thread;
int i = 0;
while(1)
{
if(pthread_create(&thread, NULL, foo, NULL) != 0)
return -1;
printf("%d\n", i);
i++;
}
return 0;
}




最终结果为32747个,远远小于理论值90829

Linux上,最大线程数目是:

number of threads = total virtual memory / (stack size*1024*1024),由于我机子的virtual memory为unlimited,,当然。在32位系统上,进程空间是4G,其中0-3G是用户空间(0x0-0xBFFFFFFF), 3G-4G是内核空间。

因此理论上讲,用户空间大小/栈大小=最大线程数。3072M/8M=384,考虑到系统的占用,主线程(管理线程)等,应该是在380左右. 也许在你的系统上是382.

我们可以减小栈限制或者增大虚拟内存使得线程的数目增加。



检查虚拟内存: ulimit -v
检查栈大小:  ulimit -s
设置虚拟内存: ulimit -v 新值
设置栈大小: ulimit -s 新值
或者pthread_create用pthread_attr_getstacksize设置一个较小的栈大小


总结系统限制有:

/proc/sys/kernel/pid_max #查系统支持的最大线程数,一般会很大,相当于理论值

/proc/sys/kernel/thread-max

max_user_process(ulimit -u) #系统限制某用户下最多可以运行多少进程或线程

/proc/sys/vm/max_map_count硬件内存大小(我的为65530)



补充

1.查询当前某程序的线程或进程数

pstree -p
ps -e | grep java | awk '{print $1}'
| wc -l

上面用的是命令替换,关于命令替换,就是说用“括起来的命令会优先执行,然后以其输出作为其他命令的参数



pstree -p 进程号 | wc -l

top -H 进程号 | wc -l

上面用的是管道,关于管道:管道符号”|”左边命令的输出作为右边命令的输入

2.查询当前整个系统已用的线程或进程数

pstree -p | wc -l
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  进程数 线程数