记录日常工作关于系统运维,虚拟化云计算,数据库,网络安全等各方面问题。

Linux  too many open file与Resource temporarily unavailable解决方法


Linux普通用户对打开文件最大数与最大用户进程数,有限制。

[ct@hbyjsdb ~]$ 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) 30439
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 2048
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) 1024
virtual memory          (kbytes, -v) unlimited

file locks                      (-x) unlimited


可以看出max user processes ,最大用户进程数,才1024,比较小。

open files ,最大打开文件数,才2048,也比较小。


下面说下具体情况,

如果是max user processes 参数太小,就会出现登陆账号出现,Resource temporarily unavailable错误提示。

 nproc就是"max user processes",完整描述是: nproc - max number of processes

 参数含义:

 单个用户可以启动的线程数,因为进程也会启动一个线程,所以也间接对进程数有限制。

 注意:

 该参数只对普通用户有用,root用户不在此限制。 所以用root用户可以启动几万个线程,无法重现这个问题.


如果是open files ,最大打开文件数设置的参数过小,就会出现too many open file报错。

出现这句提示的原因是程序打开的文件/socket连接数量超过系统设定值。


查看某一进程的打开文件数量

lsof -p pid | wc -l


查看oracle用户下的打开文件数量:

lsof -u oracle |wc -l


这里参照oracle的配置信息,以下参数基本就是最大参数了。

# vi /etc/sysctl.conf

添加:

fs.file-max= 6815744

# sysctl –p  执行命令生效。


编辑/etc/security/limits.conf

由于普通用户有打开进程最大个数与打开文件最大数限制,所以需要修改。

# vi /etc/security/limits.conf
加入以下四行
oracle  soft        nproc  500000

oracle  hard        nproc  500000

oracle  soft        nofile 1048000

oracle  hard        nofile 1048000

或是将用户名换成 * 号,这样所有普通用户都会生效。


编辑/etc/pam.d/login,使用参数限制生效。

# vi /etc/pam.d/login
session required /lib64/security/pam_limits.so
session required pam_limits.so


(注意64位linux是/lib64 ,32位的是lib)



编辑系统环境配置文件/etc/profile,添加此参数的好处在于,用户很次登陆后都会生效。

需要在最后添加以下内容,

注意这里的参数不能大于limits.conf文件里面的参数。

if [ $USER = "oracle" ]; then

   if [ $SHELL = "/bin/ksh" ]; then

       ulimit -p 500000

     ulimit -n 1048000

   else

     ulimit -u 500000 -n 1048000

   fi

fi


修改完成后最好重启下系统。


参  数:
-a  显示目前资源限制的设定。
-c <core文件上限>  设定core文件的最大值,单位为区块。
-d <数据节区大小>  程序数据节区的最大值,单位为KB。
-f <文件大小>  shell所能建立的最大文件,单位为区块。
-H  设定资源的硬性限制,也就是管理员所设下的限制。
-m <内存大小>  指定可使用内存的上限,单位为KB。
-n <文件数目>  指定同一时间最多可开启的文件数。
-p <缓冲区大小>  指定管道缓冲区的大小,单位512字节。
-s <堆叠大小>  指定堆叠的上限,单位为KB。
-S  设定资源的弹性限制。
-t <CPU时间>  指定CPU使用时间的上限,单位为秒。
-u <程序数目>  用户最多可开启的程序数目。
-v <虚拟内存大小>  指定可使用的虚拟内存上限,单位为KB。

 

 

ulimit -a 用来显示当前的各种用户进程限制。
    Linux对于每个用户,系统限制其最大进程数。为提高性能,可以根据设备资源情况,
    设置各linux用户的最大进程数,下面我把某linux用户的最大进程数设为10000个:
     ulimit-u 10000
     对于需要做许多socket 连接并使它们处于打开状态的 Java 应用程序而言,
     最好通过使用ulimit -n xx 修改每个进程可打开的文件数,缺省值是 1024。
     ulimit-n 4096 将每个进程可以打开的文件数目加大到4096,缺省为1024
     其他建议设置成无限制(unlimited)的一些重要设置是:
     数据段长度:ulimit-d unlimited
     最大内存大小:ulimit-m unlimited
     堆栈大小:ulimit-s unlimited
     CPU时间:ulimit -t unlimited
     虚拟内存:ulimit-v unlimited

我们公司服务器需要调整ulimit的stack size 参数调整为unlimited 无限,使用ulimit -sunlimited时只能在当时的shell见效,重开一个shell就失效了。。于是得在/etc/profile的最后面添加ulimit -s unlimited 就可以了,source /etc/profile使修改文件生效。

PS:如果你碰到类似的错误提示
ulimit: max user processes: cannot modify limit: 不允许的操作
ulimit: open files: cannot modify limit: 不允许的操作

为啥root用户是可以的?普通用户又会遇到这样的问题?
看一下/etc/security/limits.conf大概就会明白。
linux对用户有默认的ulimit限制,而这个文件可以配置用户的硬配置和软配置,硬配置是个上限。
超出上限的修改就会出“不允许的操作”这样的错误。

在limits.conf加上
       soft    noproc  10240
       hard    noproc  10240
       soft    nofile  10240
       hard    nofile  10240
就是限制了任意用户的最大线程数和文件数为10240。





转载请标明出处【Linux too many open file与Resource temporarily unavailable解决方法】。

《www.micoder.cc》 虚拟化云计算,系统运维,安全技术服务.

网站已经关闭评论