系统性能一直是一个受关注的话题,如何通过最简单的设置来实现最有效的性能调优,如何在有限资源的条件下保证程序的运作,ulimit 是我们在处理这些问题时,经常使用的一种简单手段。ulimit 是一种 linux 系统的内键功能,它具有一套参数集,用于为由它生成的 shell 进程及其子进程的资源使用设置限制。
ulimit 用于限制 shell 启动进程所占用的资源,支持以下各种类型的限制:所创建的内核文件的大小、进程数据块的大小、Shell 进程创建文件的大小、内存锁住的大小、常驻内存集的大小、打开文件描述符的数量、分配堆栈的最大大小、CPU 时间、单个用户的最大线程数、Shell 进程所能使用的最大虚拟内存。同时,它支持硬资源和软资源的限制。
ulimit 指令参数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
选项 [options] 含义
-H 设置硬资源限制,一旦设置不能增加。
-S 设置软资源限制,设置后可以增加,但是不能超过硬资源设置。
-a 显示当前所有的 limit 信息。
-c 最大的 core 文件的大小, 以 blocks 为单位。
-d 进程最大的数据段的大小,以 Kbytes 为单位。
-f 进程可以创建文件的最大值,以 blocks 为单位。
-l 最大可加锁内存大小,以 Kbytes 为单位。
-m 最大内存大小,以 Kbytes 为单位。
-n Linux操作系统对一个进程可以打开最大文件描述符的数量。
-p 管道缓冲区的大小,以 Kbytes 为单位。
-s 线程栈大小,以 Kbytes 为单位。
-t 最大的 CPU 占用时间,以秒为单位。
-u 用户最大可用的进程数。
-v 进程最大可用的虚拟内存,以 Kbytes 为单位。
|
在我的centos 6.3 32位系统输入 ulimit -a 结果如下
这边重点描述下红色部分
ulimit -n
问题: Can’t open so many files 对于linux运维的同学们,相信都遇到过这个问题。
在Linux下一切资源皆文件,普通文件是文件,磁盘打印机是文件,socket 当然也是文件。系统默认设置成1024,但是这个数字对于服务器特别是大并发的远远是不够的,所以,我们需要结合实际情况修改成一个更大更合理的值。
修改方法
vim /etc/security/limits.conf
1
2
3
|
# 确认包含下面的内容:
* soft nofile
65536
* hard nofile
65536
|
保存,然后重启
注:65536 是我这边的设定值,读者也可以自行设置一个合适的值,* 代表针对所有用户
同时还有个要注意的值 file-max 是设置 系统所有进程一共可以打开的文件数量 ,可以通过如下方法进行修改
echo 6553560 > /proc/sys/fs/file-max
或修改 /etc/sysctl.conf, 加入
fs.file-max = 6553560 重启生效
另外还有一个,/proc/sys/fs/file-nr,可以看到整个系统目前使用的文件句柄数量
ulimit -u
比如我们在模拟大规模http并发测试的时候,客户端会报一个无法fork new proc异常,原因是受到了最大进程1024的限制
解除 Linux 系统的最大进程数
方法如下
vim /etc/security/limits.d/90-nproc.conf
1
2
3
|
# 添加如下的行
* soft nproc
10240
root soft nproc unlimited
|