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