Linux对于每个用户,系统限制了其最大进程数。为提高性能,可以根据设备资源情况,设置每个linux用户的最大进程数。
| 参数 | 描述 |
|---|---|
| ulimited | 不限制用户可以使用的资源,但本设置对可打开的最大文件数(max open files) 和可同时运行的最大进程数(max user processes)无效 |
| -a | 列出所有当前资源极限 |
| -c | 设置core文件的最大值。单位:blocks |
| -d | 设置一个进程的数据段的最大值。单位:kbytes |
| -f | Shell 创建文件的文件大小的最大值,单位:blocks |
| -h | 指定设置某个给定资源的硬极限。如果用户拥有 root 用户权限,可以增大硬极限。任何用户均可减少硬极限 |
| -l | 可以锁住的物理内存的最大值 |
| -m | 可以使用的常驻内存的最大值,单位:kbytes |
| -n | 每个进程可以同时打开的最大文件数 |
| -p | 设置管道的最大值,单位为block,1block=512bytes |
| -s | 指定堆栈的最大值:单位:kbytes |
| -S | 指定为给定的资源设置软极限。软极限可增大到硬极限的值。如果 -H 和 -S 标志均未指定,极限适用于以上二者 |
| -t | 指定每个进程所使用的秒数,单位:seconds |
| -u | 可以运行的最大并发进程数 |
| -v | Shell可使用的最大的虚拟内存,单位:kbytes |
| -x |
资源描述
可以用ulimit -a来显示当前的各种用户进程限制。
# ulimit -a
core file size (blocks, -c) 100
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 14598
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 2047
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
| 参数 | 描述 |
|---|---|
| core file size | core文件的最大值为100 blocks, |
| data seg size | 进程的数据段可以任意大 |
| file size | 文件可以任意大 |
| pending signals | 最多有14598个待处理的信号 |
| max locked memory | 一个任务锁住的物理内存的最大值为64kB |
| max memory size | 一个任务的常驻物理内存的最大值 |
| open files | 每个进程可以打开最大文件描述符的数量,一个任务最多可以同时打开1024的文件 |
| pipe size | 管道的最大空间为4096字节 |
| POSIX message queues | POSIX的消息队列的最大值为819200字节 |
| stack size | 进程的栈的最大值为8192字节 |
| cpu time | 进程使用的CPU时间 |
| max user processes | 当前用户同时打开的进程(包括线程)的最大个数为2047 |
| virtual memory | 没有限制进程的最大地址空间 |
| file locks | 所能锁住的文件的最大个数没有限制 |
例子1
Java 应用程序,对于需要做许多 socket 连接并使它们处于打开状态的,则需要调整linux当前用户最大打开的个数。
下面我把某个linux用户的最大进程数设为10000个:
ulimit -u 10000
其他建议设置成无限制(unlimited)的一些重要设置是:
- 数据段长度:
ulimit -d unlimited - 最大内存大小:
ulimit -m unlimited - 堆栈大小:
ulimit -s unlimited - CPU 时间:
ulimit -t unlimited - 虚拟内存:
ulimit -v unlimited
这只是暂时地,永久地,则通过将一个相应的 ulimit 语句添加到由登录 shell 读取的文件中, 即特定于 shell 的用户资源文件,如:
解除 Linux 系统的最大进程数和最大文件打开数限制:
vi /etc/security/limits.conf # 添加如下的行 * soft noproc 11000 * hard noproc 11000上边两行可以用一行代替
* - noproc 11000-的意思为soft和hard全部限制。* soft nofile 4100 * hard nofile 4100说明:* 代表针对所有用户,noproc 是代表最大进程数,nofile 是代表最大文件打开数
让 SSH 接受 Login 程式的登入,方便在 ssh 客户端查看 ulimit -a 资源限制:
a.vi /etc/ssh/sshd_config
把UserLogin的值改为yes,并把#注释去掉
b. 重启 sshd 服务:
/etc/init.d/sshd restart修改所有 linux 用户的环境变量文件:
vi /etc/profile ulimit -u 10000 ulimit -n 4096 ulimit -d unlimited ulimit -m unlimited ulimit -s unlimited ulimit -t unlimited ulimit -v unlimited保存后运行
source /etc/profile使其生效
例子2
通过ulimit命令来限制文件的大小,从而导致拷贝命令的失败
# ls temp.txt
ls: temp.txt: 没有那个文件或目录
# ulimit -f 1 #设置创建文件的最大块(一块=512字节)
# cat a.c > temp.txt
文件大小超出限制,文件a.c的大小是5002字节,而我们设定的创建文件的大小是512字节x1块=512字节。
例3:Linux下一个进程可以开多少线程
一、ulimit -n可以查看一个进程最多可以打开多少文件描述符数;
二、一个进程最多可以产生多少线程,可用如下的方法:
32位linux系统最大内存地址4G,0-3GB的给用户进程(User Space)使用,3-4GB给内核使用的。
stack size (kbytes,-s)10240表示线程堆栈大小,3G/10M=最大线程数。
但实际会比这个数小一点,因为程序本身占内存,还有些管理线程,可以使用ulimit -s来设置stack size,设置的小一点开辟的线程就多。
同时,/usr/include/bits/local_lim.h中的PTHREAD_THREADS_MAX限制了进程的最大线程数,
/proc/sys/kernel/threads-max中限制了系统的最大线程数。
三、最靠谱的方法还是自己写程序测试的结果
#include<unistd.h>
#include<stdlib.h>
#include<pthread.h>
#include<stdio.h>
void* foo(void* param)
{
}
int main()
{
int i = 0;
pthread_t thread;
while (1) {
if (pthread_create(&thread, NULL, foo, NULL) != 0)
break;
i ++;
}
printf("i = %d\n", i);
}
编译命令如下:
g++ main.cpp -o main -lpthread
执行结果:
[root@localhost]# ./main
i = 32747
公司的服务器:
限制数为:2^19
实际测试结果:2^16
