总结下 fs.file-max,ulimit -n 和 lsof的异同

简介: 总结下 fs.file-max,ulimit -n 和 lsof的异同

总结下 fs.file-max,ulimit -n 和 lsof的异同

1 问题背景

最近排查一个大数据集群的性能问题,排查过程中发现通过命令 ulimit -n 获取的最大句柄数,和通过命令 cat /proc/$pid/limits 获取的最大句柄数不一致,特意总结了下相关知识,在此记录下。

2 操作系统全局级别的限制

LINUX在操作系统全局级别,通过参数 fs.file-max 控制了整个系统能够打开的文件的最大数,该参数是由kernel在内核层面限制的,适用于所有用户所有进程:

  • 可以通过如下命令查看全局级别的限制:sysctl fs.file-max;
  • 也可以通过如下命令查看全局级别的限制:cat /proc/sys/fs/file-max;
  • 可以通过如下命令修改全局级别的限制:sysctl -w fs.file-max=xxx;
  • 也可以查看或修改 fs.file-nr的值,该参数有三部分,第一部分是已经使用的文件句柄数,最后一部分是最大句柄数的限制;

image.png


3 用户级别的限制

可以在用户级别,配置某个特定用户,可以同时打开的最大文件句柄数,此时有以下几点需要注意:

  • 该参数实质是控制某个特定用户所运行的所有进程,单一一个进程所能够同时打开的最大文件句柄数(每个用户的每个进程能够打开的最大文件数);
  • 最大句柄数包括软限制和硬限制(soft limit and hard limit),且软限制小于等于硬限制,普通用户能够调整自己的 soft limit,而 hard limit只有root用户才能调整;
  • 临时修改最大文件句柄数限制,可以使用命令 ulimit -n 65535:该命令对该会话下后续新启动的所有进程都会立即生效,但系统重启后修改会丢失(ulimit -Hn/ulimit -Sn);
  • 永久修改文件句柄数,需要修改配置文件 /etc/security/limits.conf或/etc/security/limits.d/20-nproc.conf:该修改在系统重启后不会丢失,但用户需要重新登录才能使用这里的修改值;
  • 更改参数前已经存在的进程,以及这些已经存在的进程 fork 出的新进程,其底层实际生效的 nproc,仍然是参数更改前的值;
  • systemd 控制的 service unit, 是不受 /etc/security/limits.conf 和 /etc/security/limits.d/20-nproc.conf 中的配置参数影响的,对于他们需要在配置文件中配置 LimitNOFILE(推荐配置 /etc/systemd/system/.d/override.conf,而不是 /usr/lib/systemd/system/.service,因为通过rpm等包管理器升级时后者会被覆盖掉);
  • 查看当前会话下用户级别的限制,可以使用命令 ulimit -a;
  • The ulimit is for filehandles,it applies to files, directories, sockets, pipes epolls, eventfds, timerfds etc etc. The parameter is set at user level, but applied for each process;
  • You need to relogin to use the changed parms in /etc/security/limits.conf;
  • Old process's forked sub-process will inherit and use old value;
  • A duplicted session from an old session may not be using the new ulimit settings, you need use ulimit -a to check;
  • ulimit can also be set by environment variables in /etc/profile, etc.
  • you can use prlimit to dynamically modify limit settings for a certain process;
  • systemd service units will completely igrone ulimit settings.

4 特定进程当前生效的限制

通过上述描述可以发现,用户级别对最大句柄数的调整,对某个进程是否生效,还取决于该进程隶属于哪个会话,该进程的父子进程链如何,以及该进程是否受 systemd 管控的影响。

  • 对于某个正在运行的进程,其实际生效的句柄数限制,可以通过如下命令查看:cat /proc/$pid/limits | grep "open files";
  • 对于某个正在运行的进程,其已经打开的文件句柄数,可以通过如下命令行获得:ls /proc/$pid/fd |wc -l;

5 关于 lsof

最后,我们经常使用 lsof 查看某个进程或当前整个系统所打开的文件数,比如:

  • 通过如下命令查看某个进程打开的所有文件:lsof -p $pid |grep / | awk '{print $9}'|sort | uniq;
  • 通过如下命令查看当前系统打开的所有文件的句柄数:sudo lsof | wc -l;
  • 需要注意,lsof 和 fs.file-nr统计的口径并不一致:lsof count is more than fs.file-nr count, and the reason is, file-nr ignores some of the directories which are considered as files by lsof;

image.png

相关文章
|
Docker 容器 数据格式
Docker 修改镜像源地址
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34173549/article/details/80417198 我的Docker 版本为 1.
42363 0
Debian 官方源换为国内的源的操作方法
apt-get update 报错,采用更换源的方式解决问题。
56194 0
|
3月前
|
SQL Apache Windows
Windows服务器80端口被占用的全面解决方案
在服务管理器中启动apache2服务,即可正常使用80端口。若系统中还安装了其他微软产品如sql等,也可尝试停止其服务进行测试,但请注意,SQL通常不会使用80端口,因此一般不会受到影响。以上就是关于80端口被system占用的详细解决方法,希望对你有所帮助。
|
5月前
数据传输的基本概念
本内容介绍了带宽、数据传输速率和吞吐量的概念及三者关系。带宽是通信链路的最大传输能力,决定理论上限;数据传输速率表示实际传输速度,受多种因素影响可能低于带宽;吞吐量则是实际测量的传输速率,反映网络真实性能。用公路类比:带宽是宽度(容量)、数据传输速率是速度、吞吐量是实际通行量。
828 7
|
安全 Linux Shell
linux查看/修改各种资源限制ulimit
在Linux资源管理中,适当的使用 `ulimit`,结合系统配置文件的修改,可以更好地控制和优化系统资源,提高系统的稳定性和效率。对于系统管理员而言,精通这些知识是十分必要的,可以有效地防止因资源滥用导致的各种问题。
818 5
|
12月前
|
NoSQL MongoDB 数据库
MongoDB 删除集合
10月更文挑战第14天
327 1
|
6月前
|
安全 缓存 容器
2025 年 WordPress 主机托管深度测评
本测评针对全球23家主流主机商,基于120天实时监测与300+技术指标,筛选出5家优秀WordPress托管方案。从基础性能(响应时间、加载速度等)、技术适配(容器化支持、缓存机制等)、服务保障(技术支持、安全防护等)到性价比模型,全方位评估。推荐方案涵盖性能优先型(CloudPress Pro)、成本敏感型(BlueHost Premium)、技术开发型(SiteGround GoGeek)等,满足不同需求。报告还洞察行业趋势,如容器化普及、Serverless探索及AI驱动优化,为用户选型提供科学依据。测评数据来自2025年1-3月实测,保持中立客观立场。
235 0
2025 年 WordPress 主机托管深度测评
|
网络协议 网络安全 网络架构
不会这10个抓包技巧,就不要在网工圈里混了!
不会这10个抓包技巧,就不要在网工圈里混了!
531 1
|
存储 监控 安全
在Linux中,什么是无盘工作站?并且如何在Linux中配置它。
在Linux中,什么是无盘工作站?并且如何在Linux中配置它。
|
Linux 开发工具
Linux yum 使用时提示 获取 GPG 密钥失败Couldn‘t open file RPM-GPG-KEY-EPEL-7
Linux yum 使用时提示 获取 GPG 密钥失败Couldn‘t open file RPM-GPG-KEY-EPEL-7
383 2