最近系统出现的一个bug,附件无法下载,查看linux后台日志报too many open files
google一搜索,一般报Too many open files的错,表示文件句柄数超出最大。对linux系统来说,默认的最大值为1024,在系统并发比较大的时候,这个很容易超过该值。文件句柄数大小可以通过命令ulimit -a查看。
为避免因程序任务过多导致文件句柄数不够的问题,在linux系统下部署程序的时候可以调大用户文件句柄数。用root用户修改/etc/security/limits.conf 配置,在文件末尾添加如下内容:
user soft nofile 2048
user hard nofile 65536
其中user为报错程序部署目录的用户名,根据部署环境配置。注意"nofile"项有两个可能的限制措施。就是<type>项下的hard和soft。硬限制表明soft限制中所能设定的最大值。soft限制指的是当前系统生效的设置值。hard限制值可以被普通用户降低。但是不能增加。soft限制不能设置的比hard限制更高。只有root用户才能够增加hard限制值。
修改完成后切换到user用户下再执行ulimit -a查看文件句柄数是否修改成功。
改完后,验证,发现用户的文件句柄数已变成2048.应该可以应对大并发数啦。
这里只是修改最大句柄数,另外一个问题,如何知道当前进程打开了多少个文件句柄呢?可以通过下面一段小脚本可以帮你查看:
[root@VM192168200201 etc]# lsof -n|awk '{print $2}'|sort|uniq -c |sort -nr|more
738 26249
164 16540
lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。
通过这个命令可以按照从大到小的顺序查看各进程共打开了多少文件句柄数。第一列为数量,第二列为进程号。然后再用pwdx 进程号 查看最大的进程路径,ps -ef|grep 进程号 查看程序名称。
其实我不太理解文件句柄的意思,查了下资料:
文件描述符是linux/unix操作系统中特有的概念。其相当于windows系统中的句柄。习惯性的,我们也把linux文件描述符称之句柄。
Linux系统中, 每当进程打开一个文件时,系统就为其分配一个唯一的整型文件描述符,用来标识这个文件。标准C中每个进程默认打开的有三个文件,标准输入,标准输出,标准错误,分别用一个FILE结构的指针来表示,即stdin,stout,sterr,这三个结构分别对应着三个文件描述符0,1,2。
文件描述符是一个简单的整数,用以标明每一个被进程所打开的文件和socket。第一个打开的文件是0,第二个是1,依此类推。linux 操作系统通常对每个进程l能打开的文件数量有一个限制。
linux系统默认的最大文件描述符限制是1024
[root@localhost ~]# ulimit -n
1024
当某个服务用户比较多时,1024个句柄明显不够用,比如web服务器。我们使用ulimit -HSn 65536来设置最大文件描述符数
将此命令写入rc.local中,就可以完美突破linux系统的文件描述符限制了
参考地址:http://blog.51cto.com/xueli/786758