【1】惯例抛异常
首先抛个异常:java.io.FileNotFoundException: (*********
)Too many open files。
原因是由于linux限制了一次会话中,程序最大同时打开文件数目。
使用命令查看:
ulimit -n //默认值为1024
临时修改(退出会话失效):
ulimit -n XXXX
永久修改(修改/etc/security/limits.conf文件,设置用户最大打开文件数 ):
//文件末尾添加如下,具体大小建议65536 * - nofile 65536
注意 nofile 参数在 type 类型上有2个可能的选项:hard 和 soft
,这两个值都需要设置,“-”
代表同时设置这2个值为后面的数字。
hard limit 只是作为 soft limit 的上限,soft limit 才是你设置的系统当前限制。当你设置 hard limit 后,soft limit 的值就只能小于 hard limit 。普通用户可以降低 hard limit 的值,但是不能提高它,只有 root 用户才能提高 hard limit。
给个参考版本:
* hard nproc 64000 * soft nproc 64000 * hard nfile 64000 * soft nfile 64000 * soft stack unlimited * soft core unlimited * soft core unlimited * hard core unlimited * soft memlock 250000000 * hard memlock 250000000 * - nofile 65536
【2】root用户修改后其他用户不生效
在root用户修改为65536后,用其他用户登录服务器检测ulimit -n
还是1024。那么就是该用户未生效。
① 解决方案一
使用root用户进行如下操作:
vi /etc/ssh/sshd_config
将# UseLogin no修改如下:
UseLogin yes //如果没升级 ssh 则添加修改如下 UsePAM yes
重启sshd服务 :
service sshd restart
修改/etc/pam.d/login
#添加以下内容,注意写你自己系统pam_limits.so的绝对路径 session required /usr/lib64/security/pam_limits.so
修改/etc/security/limits.d/下的配置文件
[root@host-10-1-236-213 limits.d]# ll total 4 -rw-r--r-- 1 root root 196 Jul 23 14:29 20-nproc.conf
如下图所示:
② 解决方案二
如果还不行(实际上已经改过来了,只是其他用户看到的是默认值),建议升级openssh或者重装openssh:
//查看你的版本 rpm -qa openssh //安装最新版本 yum install openssh.x86_64
重装openssh如下:
//查看你的版本 rpm -qa openssh yum remove 上面查看的版本 //安装服务 yum install openssh openssh-server openssh-clients //重启服务 service sshd restart
注意,重装ssh会恢复使用默认端口22,如有必要还需修改端口:
vim /etc/ssh/sshd_config
如果直接使用其他用户如test登录之后ulimit -n还是1024并且着急使用,那么不妨尝试使用root用户登录然后切换到test用户再操作。
③ 重启ssh服务失败
重启sshd服务可能等待蛮久,然后提示失败。这时候使用命令systemctl status sshd.service
查看状态会看到失败,但是毫无有用信息,使用命令journalctl -xe
查看会看到异常信息。
异常实例如下:
sshd.service start operation timed out. Terminating. sshd[8425]: Received signal 15; terminating. systemd[1]: Failed to start OpenSSH server daemon. -- Subject: Unit sshd.service has failed -- Defined-By: systemd -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel -- -- Unit sshd.service has failed. -- -- The result is failed. systemd[1]: Unit sshd.service entered failed state. systemd[1]: sshd.service failed. polkitd[457]: Unregistered Authentication Agent for unix-process:8419:67059806 (system bus name :1.2658, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8) (disconnected from bus)
这里可以进行针对性解决,比如关闭selinux,我这里采用的是重装sshd服务。
【3】ulimit命令详解
① 是什么
ulimit命令用来限制系统用户对shell资源的访问。
解释如下:
假设有这样一种情况,当一台 Linux 主机上同时登陆了 10 个人,在系统资源限制的情况下,这 10 个用户同时打开了 500 个文档,而假设每个文档的大小有 10M,这时系统的内存资源就会受到巨大的挑战,而实际应用的环境要比这种假设复杂的多。
例如在一个嵌入式开发环境中,各方面的资源都是非常紧缺的,对于开启文件描述符的数量,分配堆栈的大小,CPU 时间,虚拟内存大小,等等,都有非常严格的要求。资源的合理限制和分配,不仅仅是保证系统可用性的必要条件,也与系统上软件运行的性能有着密不可分的联 系。这时,ulimit 可以起到很大的作用,它是一种简单并且有效的实现资源限制的方式。
ulimit 用于限制 shell 启动进程所占用的资源,支持以下各种类型的限制:所创建的内核文件的大小、进程数据块的大小、Shell 进程创建文件的大小、内存锁住的大小、常驻内存集的大小、打开文件描述符的数量、分配堆栈的最大大小、CPU 时间、单个用户的最大线程数、Shell 进程所能使用的最大虚拟内存。同时,它支持硬资源和软资源的限制。
作为临时限制,ulimit 可以作用于通过使用其命令登录的 shell 会话,在会话终止时便结束限制,并不影响于其他 shell 会话。而对于长期的固定限制,ulimit 命令语句又可以被添加到由登录 shell 读取的文件中,作用于特定的 shell 用户。
② 语法格式
语法如下:
ulimit(选项)
选项如下:
-a:显示目前资源限制的设定; -c <core文件上限>:设定core文件的最大值,单位为区块; -d <数据节区大小>:程序数据节区的最大值,单位为KB; -f <文件大小>:shell所能建立的最大文件,单位为区块; -H:设定资源的硬性限制,也就是管理员所设下的限制; -m <内存大小>:指定可使用内存的上限,单位为KB; -n <文件数目>:指定同一时间最多可开启的文件数; -p <缓冲区大小>:指定管道缓冲区的大小,单位512字节; -s <堆叠大小>:指定堆叠的上限,单位为KB; -S:设定资源的弹性限制; -t <CPU时间>:指定CPU使用时间的上限,单位为秒; -u <程序数目>:用户最多可开启的程序数目; -v <虚拟内存大小>:指定可使用的虚拟内存上限,单位为KB。
实例如下:
[root@localhost ~]# ulimit -a core file size (blocks, -c) 0 #core文件的最大值为100 blocks。 data seg size (kbytes, -d) unlimited #进程的数据段可以任意大。 scheduling priority (-e) 0 file size (blocks, -f) unlimited #文件可以任意大。 pending signals (-i) 98304 #最多有98304个待处理的信号。 max locked memory (kbytes, -l) 32 #一个任务锁住的物理内存的最大值为32KB。 max memory size (kbytes, -m) unlimited #一个任务的常驻物理内存的最大值。 open files (-n) 1024 #一个任务最多可以同时打开1024的文件。 pipe size (512 bytes, -p) 8 #管道的最大空间为4096字节。 POSIX message queues (bytes, -q) 819200 #POSIX的消息队列的最大值为819200字节。 real-time priority (-r) 0 stack size (kbytes, -s) 10240 #进程的栈的最大值为10240字节。 cpu time (seconds, -t) unlimited #进程使用的CPU时间。 max user processes (-u) 98304 #当前用户同时打开的进程(包括线程)的最大个数为98304。 virtual memory (kbytes, -v) unlimited #没有限制进程的最大地址空间。 file locks (-x) unlimited #所能锁住的文件的最大个数没有限制。
【Tips】
查看系统可接受的最大打开文件数(一般默认已足够,不用修改)
cat /proc/sys/fs/file-max