> Linux教程 > 系统运维 >

高并发下linux ulimit优化

系统性能一直是一个受关注的话题,如何通过最简单的设置来实现最有效的性能调优,如何在有限资源的条件下保证程序的运作,ulimit 是我们在处理这些问题时,经常使用的一种简单手段。ulimit 是一种 linux 系统的内键功能,它具有一套参数集,用于为由它生成的 shell 进程及其子进程的资源使用设置限制。

ulimit 用于限制 shell 启动进程所占用的资源,支持以下各种类型的限制:所创建的内核文件的大小、进程数据块的大小、Shell 进程创建文件的大小、内存锁住的大小、常驻内存集的大小、打开文件描述符的数量、分配堆栈的最大大小、CPU 时间、单个用户的最大线程数、Shell 进程所能使用的最大虚拟内存。同时,它支持硬资源和软资源的限制。
ulimit 指令参数:

 
选项 [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

 
# 确认包含下面的内容:
* 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

 
# 添加如下的行
*          soft    nproc     10240
root       soft    nproc     unlimited




(责任编辑:IT)