处理too many open files相关限制及拓展
出现场景:在使用datagrip操作hive进行数据仓库建模过程中出现
原因:hiveserver2打开的文件过多.
介绍:linux操作系统会对每个进程设限,例如进程使用cpu的时间,打开文件的个数...
想看某个进程打开了哪些文件在哪看?
jps后记录目标进程的PID
#这个目录下的数字记录的就是每个进程的pid,进入相应pid就可以查看这个进程的运行相关信息
cd /proc/
对于该目录下相关文件的介绍:
exe ->
这个后面跟着的通常是启动该进程的二进制文件
拓展:可以用这个信息来清理电脑被安插的病毒
使用top命令查看占用资源异常的进程(一般侧重看cpu利用率),记录pid,我们进入proc下的相应pid,找到启动该进程的二进制文件(exe -> 指向的文件),将其删除即可
limits
这里面就记录着对该进程相应的限制
Max open files就是对打开文件个数的限制
fd
全称:file descriptor(文件描述符)
这里面就记录了目标进程到底打开了哪些文件 每一个非负整数(文件描述符)都指向一个文件
在里面我们可以看见socket的文件,linux把socket接口也当做了文件处理(可以体会出linux:一切皆文件,网络的连接,管道的连接,需要io操作的,linux全当做文件)
#查看到底打开了多少文件
ll | wc -l
一旦达到我们在limits下看见的那个限制,该进程就不能再打开文件了
4096对于我们开发来说就比较小了,正常都是设置上万,这些一般由运维来调整
#展示所有的限制(默认展示软限制)
ulimit -a
这里展示的是对于一个新文件的初始限制
所以想解决hiveserver2的too many open files报错可以这样解决:我先修改对于新文件的初始限制,然后重启hiveserver2
#展示硬限制
ulimit -aH
#展示软限制
ulimit -aS
修改
一个普通用户是可以在一个合理范围内(硬限制的范围内)随意的调整软限制的,硬限制也可以修改,但是是不可逆的,只能往小了调,例如硬限制从4096调成2048,再想从2048调回4096就不行了.
#在硬限制范围内调整软限制打开文件数限制(ulimit -对应要调整的参数 调到多少)
ulimit -nS 2048
#将硬限制调小(只是示例,最好不要修改)
ulimit -nH 2048
如果我们已经调到软限制的max,但是还是不够用,那我们就只能去调硬限制的max,只有root用户能做到这点
cd /etc/security/
目录下有个limits.conf,从这里我们就能调整其它用户的软硬件限制
<domain>下就是你要调整的用户对象,可以是一个用户,一个组,所有人
<type>就是选择软限制硬限制,这里的调的软限制就是目的对象的软限制默认值
<item>就是被限制的资源项 nofile就是打开文件数的限制
<value>就是要调整成多少
#示例
user hard nofile 10000
调整后保存重启操作系统才能生效
如果你发现操作后仍然没有生效,可能是被/etc/security/limits.d这个文件中的相同domain,相同type,相同item,不同value给覆盖掉了
/etc/security/limits.d目录下的配置格式和limits.conf是一样的,所以我们推荐在/etc/security/limits.d/中配置,在该目录下创建任意名字以.conf结尾的文件,在其中配置相应修改参数就可以,也可以在默认的20-nproc.conf配置,之后source一下试试,如果不行再重启操作系统.

浙公网安备 33010602011771号