关于linux系统最大进程数和单进程最大线程数的测试
2017-03-02 22:08
537 查看
我的系统:RedHat企业7 64位 内存6G
ulimit -a查看用于shell启动进程所占用的资源默认设置
一.最大进程数
1.使用命令
/etc/security/limits.conf查看硬限制,内核参数kernel.pid_max也做了限制
2.系统用pid_t表示进程号,那么最大的进程数当然也不能超过pid_t的类型
查看最大进程数
3.创建一个新进程会消耗系统资源(主要是内存),经测试,在创建6000多个进程时,程序运行的很缓慢,通过
代码验证:
可以即使是系统的默认配置文件,对最大进程数还是有所限制的,我的机器最多创建了32012个进程。这也就是为什么用ps aux命令监控系统资源时,进程的pid达到了近30000.
二.最大线程数
在
代码试验:
最终结果为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.
我们可以减小栈限制或者增大虚拟内存使得线程的数目增加。
总结系统限制有:
/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
上面用的是命令替换,关于命令替换,就是说用“括起来的命令会优先执行,然后以其输出作为其他命令的参数
或
pstree -p 进程号 | wc -l
top -H 进程号 | wc -l
上面用的是管道,关于管道:管道符号”|”左边命令的输出作为右边命令的输入
2.查询当前整个系统已用的线程或进程数
pstree -p | wc -l
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
相关文章推荐
- 小知识之Linux系统中的最大进程数,最大文件描述,最大线程数
- 小知识之Linux系统中的最大进程数,最大文件描述,最大线程数
- LINUX最大线程数及最大进程数
- linux下进程的最大线程数、进程最大数、进程打开的文件数
- LINUX最大线程数及最大进程数
- linux下进程的最大线程数、进程最大数、进程打开的文件数
- Linux最大线程数及最大进程数
- Linux最大线程数及最大进程数
- Linux最大线程数及最大进程数
- LINUX最大线程数及最大进程数
- 在Linux系统上动态修改MySQL最大进程数
- Linux最大线程数及最大进程数
- linux下进程的最大线程数、进程最大数、进程打开的文件数
- linux下进程的最大线程数、进程最大数、进程打开的文件数
- linux下进程的最大线程数、进程最大数、进程打开的文件数
- linux下进程的最大线程数、进程最大数、进程打开的文件数
- linux下进程的最大线程数、进程最大数、进程打开的文件数
- Linux最大进程数、最大线程数、最大文件描述符数
- linux下进程的最大线程数、进程最大数、进程打开的文件数
- LINUX最大线程数及最大进程数