Linux创建进程达到65535的方法
Linux上创建进程据说消耗很少,这个一直是Linux的特点,于是就专门测试Linux创建进程的极限,测试代码如下:
//fork.c
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAXPROCESS 65535
#define SLEEPTIME 60
int main(int argc, char **argv) {
pid_t pid;
int count = 0;
int maxprocess = MAXPROCESS;
if (argc == 2) {
maxprocess = atoi(argv[1]);
}
for (count = 0; count < maxprocess; count++) {
pid = fork();
if (pid < 0) {
perror("fork error");
exit(1);
} else if (pid == 0) {
printf("child %d startn", count);
sleep(SLEEPTIME);
printf("child %d endn", count);
exit(0);
}
printf("parent:create %d childn", count);
}
for (count = 0; count < MAXPROCESS; count++) {
wait();
}
exit(0);
}
这段代码是不断创建子进程,默认是创建65535个进程,如果无法创建,就打印出错误。
测试代码是我新建的一个blue帐户进行运行测试,为了让进程尽可能创建多的进程,首先要设置blue帐户创建进程数的硬限制
使用root帐户修改/etc/security/limits.conf文件,加入一下行:
blue hard nproc 65535
然后为blue帐户设置创建进程的软限制,在终端执行如下代码:
ulimit -u 65535
到了这里,虽然我们设置blue帐户创建进程数的硬限制和软限制都是65535,但是我们还不能使用blue帐户创建65535个进程,我们在Linux还需要设置内核参数kernel.pid_max,这个参数我默认安装都是32768,所以即使使用root帐户,却不设置这个内核参数,整个系统最多可以创建的进程数就是32768,所以我们需要进行如下设置:
sysctl -w kernel.pid_max=65535
备注:如果是使用root帐户执行程序,是不需要设置资源的硬限制和软限制,但是还是需要设置进程pid最大值的内核参数,才可以创建65535个进程。
接着在同一终端切换为blue帐户:
su blue
编译和执行测试代码:
gcc fork.c -o fork
./fork
我的虚拟机Linux内存是512M,在创建6千多个进程时,程序运行得很慢,通过vmstat命令观察,发现swap内存的置入置出很频繁,可以判断是由于内存不足,使用虚拟内存,导致频繁的IO操作,让测试代码变得很慢,所以创建过多进程时,系统的内存是重要衡量的一个方面。
后来我把测试代码放到一台配置比较好的至强服务器测试,内存是8G,在创建接近4W个进程时,程序的运行也到了瓶颈,依然是内存的瓶颈。
测试代码中,创建的子进程,占用的内存相当小,实际使用中,只可能比测试代码创建的进程使用更多的内存,所以相应的,同样配置的机器,能创建的可用进程应该是更少的。
总结
以上所述是小编给大家介绍的Linux创建进程达到65535的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对ZaLou.Cn网站的支持!
- Nginx通过二级目录(路径)映射不同的反向代理,规避IP+端口访问
- MySQL中批量初始化数据的对比测试(r12笔记第71天)
- Golang语言--包的概念、导入与可见性
- MySQL中的change,modify和自增列的关系(r12笔记第70天)
- Golang 值得注意的地方
- MySQL数值类型在binlog中需要注意的细节(r12笔记第69天)
- WordPress评论滑动/拉链解锁myQaptcha修改为自动提交的方法
- MySQL root用户登录的几个小问题(r12笔记第67天)
- Java实现生产者消费者的两种方式(r12笔记第66天)
- Golang语言的函数调用信息
- mysqldump的一点使用总结(r12笔记第81天)
- 转-Golang语言Interface漫谈
- WordPress导航菜单图标字体插件font awesome 4 menus纯代码版
- Oracle 12c远程克隆PDB的问题及修复(r12笔记第78天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法