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

我的系统: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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值