在Linux下面部署应用的时候,有时候会遇上Socket/File: Can’t open so many files的问题,比如还有Squid做代理,当文件打开数到900多时速能就非常快的下降,有可能打不开网页.其实Linux是有文件句柄限制的,而且Linux默认不是很高,一般都是1024,生产服务器用其实很容易就达到这个数量.

[root@mail data]# ulimit -a
core file size           (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 66560
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                       (-n) 8192
pipe size             (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority               (-r) 0
stack size               (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes               (-u) 66560
virtual memory           (kbytes, -v) unlimited
file locks                       (-x) unlimited
[separator]
     其中 “open files (-n) 1024 “是Linux操作系统对一个进程打开的文件句柄数量的限制(也包含打开的SOCKET数量,可影响MySQL的并发连接数目).这个值可用ulimit 命令来修改,但ulimit命令修改的数值只对当前登录用户的目前使用环境有效,系统重启或者用户退出后就会失效.
     系统总限制是在这里,/proc/sys/fs/file-max.可以通过cat查看目前的值,修改/etc/sysctl.conf 中也可以控制.
     另外还有一个,/proc/sys/fs/file-nr,可以看到整个系统目前使用的文件句柄数量
     查找文件句柄问题的时候,还有一个很实用的程序lsof.可以很方便看到某个进程开了那些句柄.也可以看到某个文件/目录被什么进程占用了
[root@kyouwar data0]# cat /proc/sys/fs/file-max
372901
[root@kyouwar data0]# cat /proc/sys/fs/file-nr
3200     0       372901
=====================================
ulimit 用于shell启动进程所占用的资源。
可以使用该命令查看进程占用资源的情况。
使用方法:ulimit [-acdfHlmnpsStvw] [size]
-H 设置硬件资源限制.
-S 设置软件资源限制.
-a 显示当前所有的资源限制.
-c size:设置core文件的最大值.单位:blocks
-d size:设置数据段的最大值.单位:kbytes
     ulimit -d unlimited
-f size:设置创建文件的最大值.单位:blocks
-l size:设置在内存中锁定进程的最大值.单位:kbytes
-m size:设置可以使用的常驻内存的最大值.单位:kbytes
     ulimit -m unlimited
-n size:设置内核可以同时打开的文件描述符的最大值【每个进程可以打开的文件数目】【也包含打开的SOCKET数量,可影响MySQL的并发连接数目】.单位:n
-p size:设置管道缓冲区的最大值.单位:kbytes
-s size:设置堆栈的最大值.单位:kbytes
     ulimit -s unlimited
-t size:设置CPU使用时间的最大上限.单位:seconds
     ulimit -t unlimited
-v size:设置虚拟内存的最大值.单位:kbytes 5
-u 设置各linux 用户的最大进程数
     ulimit -u 10000
============================================
#暂时修改直接使用
     ulimit -参数 xx
如:
   同时修改软硬设置   ulimit -SHn 4500
----------------------------------------------------
# 永久地,通过将一个相应的 ulimit 语句添加到由登录 shell 读取的文件中, 即特定于 shell 的用户资源文件,如
1)、解除 Linux 系统的最大进程数和最大文件打开数限制:
vi /etc/security/limits.conf
# 添加如下的行
* soft noproc 11000
* hard noproc 11000
* soft nofile 8192
* hard nofile 8192
#如此每次用户登录后就依照此值设置。

说明:* 代表针对所有用户
noproc 是代表最大进程数
nofile 是代表最大文件打开数
     可以将文件句柄限制统一改成软11000,硬11000.配置文件最前面的是指domain,设置为星号代表全局,另外你也可以针对不同的用户做出不同的限制
     注意.这个当中的硬限制是实际的限制,而软限制,是warnning限制,只会做出warning.其实ulimit命令本身就有分软硬设置,加-H就是硬,加-S就是软
     默认显示的是软限制,如果运行ulimit命令修改的时候没有加上的话,就是两个参数一起改变.
============================================
2)、让 SSH 接受 Login 程式的登入,方便在 ssh 客户端查看 ulimit -a 资源限制:
         a、vi /etc/ssh/sshd_config
             把 UserLogin 的值改为 yes,并把 # 注释去掉
         b、重启 sshd 服务:
               /etc/init.d/sshd restart
#新版本好像不用设置这个!也没有这个配置选项
============================================
3)、修改所有 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
============================================
4)、生效
     修改完重新登录就可以见到.可以用ulimit -a 查看确认.)
----------------------------------------------------
     注意:如果你使用squid的话,你要在/etc/init.d/squid的文件加入ulimit -HSn 65535.另外,在squid.conf中也要加入max_filedesc 16384
============================================
特殊说明:
   注:上面这种方式只是改变了用户登陆系统后的文件打开数,对于/etc/init.d /nginx这种的启动脚本并不起作用,像这种启动脚本,需要在脚本内 程序命令前加一行:
   ulimit -HSn 65535
============================================
补充:可不设置
     生产服务器的配置说明
     有时候在程序里面需要打开多个文件,进行分析,系统一般默认数量是1024,(用ulimit -a可以看到)对于正常使用是够了,但是对于程序来讲,就太少了。
修改2个文件。
1./etc/security/limits.conf
vi /etc/security/limits.conf
加上:
* soft nofile 8192
* hard nofile 20480
----------------------------------------------------
2./etc/pam.d/login
session required /lib/security/pam_limits.so
   另外确保/etc/pam.d/system-auth文件有下面内容
session required /lib/security/$ISA/pam_limits.so
   这一行确保系统会执行这个限制。
----------------------------------------------------
3.一般用户的.bash_profile
#ulimit -n 1024
重新登陆ok

 source:http://hi.baidu.com/wz125/blog/item/2a79a8f3197c641cb07ec5dd.html