Linux宿主机下/容器下如何修改进程打开的文件句柄数(open files)

Linux宿主机下/容器下修改进程打开的文件句柄数

背景1:平台调用算法出现异常,查看数据库调用错误状态码是499

  • 499:(客户端主动关闭请求);客户端向服务端发起请求,服务器端处理的时间过长,超出了客户端的超时时间,客户端主动断开连接。  
  • ## 这个报错表明请求已经打到了后端算法,只是后端算法请求太多导致的,迟迟没有响应客户端并返回结果而导致断开连接,此时可以增加服务后端节点数分摊压力或者增加文件句柄数(增加文件句柄数可以让算法接收更多的请求)

背景2:错误日志出现“Too many open files“等文件打开太多等错误,出现文件描述符耗尽的问题

背景3:容器里面的服务启动异常,排查发现容器里面文件句柄数太少,大概率是容器本身配置的句柄数过低

  • max-file 表示系统级别的能够打开的文件句柄的数量。是对整个系统的限制,并不是针对用户的。
  • ulimit -n 控制进程级别能够打开的文件句柄的数量。提供对shell及其启动的进程的可用文件句柄的控制,这是进程级别的

对于服务器,一般修改进程级的最大打开文件句柄数即可(系统默认1024,有点小)。一般不需要调整系统级的最大数。

如果出现了达到系统级别最大限制时,也需要同步调整系统级的最大数的。

一、查看系统最大句柄数

Linux 中,单个进程能够打开的最大文件句柄数量是可以配置的,系统默认是 1024。

当单个进程打开的文件句柄数量超过了系统定义的值,就会出现“Too many files open”的错误提示。

用户可以通过以下命令查看系统定义的最大值:

#查看文件句柄
[root@localhost ~]# ulimit -a
#查看当前进程打开了多少句柄数:
[root@localhost ~]# lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more 
131 24204 
57 24244   
57 24231 ......
​
其中第一列是打开的句柄数,第二列是进程ID。可以根据ID号来查看进程名:
[root@localhost ~]# ps aef|grep 24204
nginx  24204 24162 99 16:15 ?    00:24:25 /usr/local/nginx/sbin/nginx -s

二、修改文件句柄(进程级别)

#对于一般的应用程序而言 1024 已经完全够用了,但是有些进程处理大量请求,很有可能 1024 就不够用了,则需要调整系统参数,一般可以设置4096、65535或者102400,设置的太高会影响性能,并不是想设置多高就多高,毕竟打开的文件句柄数越多响应时间肯定会越慢

#临时生效
[root@localhost ~]# ulimit -n 4096
#永久生效法一:把这个临时生效的命令放在.bashrc或者.bash_profile配置文件里就可以永久生效了
[root@localhost ~]# echo "ulimit -n 4096" >> ~/.bashrc 
#永久生效法二
[root@localhost ~]# vim /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535

提示:* 表示所用的用户,但有的系统不认, 需要具体的用户名, 比如:
root soft nofile 65535
root hard nofile 65535
重新登录验证,或reboot后验证。

三、修改max user processes进程数

#临时生效
[root@localhost ~]# ulimit -u 65536
#永久生效
[root@localhost ~]# vim /etc/security/limits.conf
* soft nproc 65536
* hard nproc 65536

四、查看系统最大打开文件描述符数量(系统级别)

[root@localhost ~]# cat /proc/sys/fs/file-max  #查看系统最大打开文件描述符数量
180965
[root@localhost ~]# echo "1000000" > /proc/sys/fs/file-max   #临时设置该值
​
#永久性设置,需要在/etc/sysctl.conf中设置,并让它生效:
[root@localhost ~]# echo "fs.file-max = 1000000" >> /etc/sysctl.conf 
[root@localhost ~]# sysctl -p
fs.file-max = 1000000

注意:

  • 所有进程打开的文件描述符数量不能超过/proc/sys/fs/file-max。
  • 单个进程打开的文件描述符数不能超过user limit中nofile的soft limit。
  • nofile的soft limit不能超过其hard limit。

五、容器内部修改文件句柄

##这是针对已经run起来的容器修改文件句柄
[root@localhost ~]# ps -ef | grep dockerd
root      57213      1  0 Jan13 ?        02:49:32 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --icc=false --default-ulimit nproc=1024:2408 --default-ulimit nofile=100:200
root     126923 122986  0 10:44 pts/2    00:00:00 grep --color=auto dockerd

[root@localhost ~]# cat /usr/lib/systemd/system/docker.service
#把宿主机本身容器配置文件这一条修改后重启就会生效
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --icc=false --default-ulimit nproc=1024:2408 --default-ulimit nofile=65535:131070

[root@localhost ~]# systemctl restart docker && systemctl daemon-reload

–default-ulimit nofile=100:200,也就是文件句柄容器内100,宿主机200

#没有run运行起来的容器,可以直接在容器启动命令添加限制参数:
--ulimit nofile=65535:65535,容器启动完成后,在容器内查看java进程句柄数限制(已经成功修改为65535)
[root@localhost ~]# docker run --ulimit nofile=65535:65535 ...

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持恩蓝小号。

原创文章,作者:UVQYE,如若转载,请注明出处:https://www.wangzhanshi.com/n/1582.html

(1)
UVQYE的头像UVQYE
上一篇 2024年12月17日 18:00:15
下一篇 2024年12月17日 18:00:17

相关推荐

  • Linux与Windows文件互传(VMWare)

    虚拟机无桌面的linux 与 物理机windows 文件互传有很多种方法,现在先说一种通过共享文件夹的形式,其他方法后续再补充 1、背景 1) 虚拟机系统:vmware无桌面的li…

    2025年1月1日
  • linux虚拟网络设备之vlan配置详解

    简介 VLAN是网络栈的一个附加功能,且位于下两层。首先来学习Linux中网络栈下两层的实现,再去看如何把VLAN这个功能附加上去。下两层涉及到具体的硬件设备,日趋完善的Linux…

    2025年1月1日
  • 详解linux pwm驱动编写

    pwm方波可以用来控制很多的设备,比如它可以被用来控制电机。简单来说,就是单位时间内的方波越多,那么电机的转速就会越快;反之就越慢。通过这个特性,soc就可以轻松地利用pwm对外设…

    Linux 2025年1月1日
  • Linux使用dd命令来复制和转换数据的操作方法

    简介 Linux 中的 dd 命令是一个功能强大的数据复制和转换实用程序。它以较低级别运行,通常用于创建可启动的 USB 驱动器、克隆磁盘和生成随机数据等任务。 dd 全称可以为:…

    Linux 2025年2月24日
  • 详解Linux中关于引号的那些事

    本文详细的给大家介绍了关于linux中引号的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 引号 我们将把编写脚本的事情暂时搁在一边,然后来讨论一些,我们一直在用的,…

    2025年1月1日
  • Linux中别名与二进制的使用教程

    本文介绍的是关于linux中别名与二进制使用的相关内容,分享出来给大家参考,下面来看看详细的介绍: 二进制 一般二进制这个名词听上去高深莫测,然而当你了解它之后其实并不复杂,在计算…

    2025年1月1日
  • Linux关机时执行指定脚本功能实现

    1.关机时执行某个脚本的具体思路 (1)在文件夹/etc/init.d/下创建关机时需要执行的脚本file_name; (2)分别在文件夹/etc/rc0.d/和/etc/rc6.…

    Linux 2025年1月1日
  • linux 普通用户切换成root免密码的实现

    ? [root@ok ~]# vim /etc/pam.d/su 下面是/etc/pam.d/su文件的内容 ? #%PAM-1.0 auth      sufficient   …

    Linux 2025年1月1日
  • 在Linux中如何查找最大的10个文件方法汇总

    前言 众所周知当系统的磁盘空间不足时,您可能会使用 df、du 或 ncdu 命令进行检查,但这些命令只会显示当前目录的文件,并不会显示整个系统范围的文件。 您得花费大量的时间才能…

    Linux 2025年1月1日
  • 对send(),recv()函数的全面理解

    int send( SOCKET s, const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程序都用send函数来向TCP…

    Linux 2025年1月1日

发表回复

登录后才能评论