处理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一下试试,如果不行再重启操作系统.

posted @ 2023-09-06 12:08  sunshin1  阅读(98)  评论(0)    收藏  举报  来源