总结下 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

相关文章
|
机器学习/深度学习 存储 并行计算
深度学习Pytorch-Tensor的属性、算术运算
深度学习Pytorch-Tensor的属性、算术运算
292 0
|
5月前
|
数据采集 数据可视化 数据挖掘
用 Excel+Power Query 做电商数据分析:从 “每天加班整理数据” 到 “一键生成报表” 的配置教程
在电商运营中,数据是增长的关键驱动力。然而,传统的手工数据处理方式效率低下,耗费大量时间且易出错。本文介绍如何利用 Excel 中的 Power Query 工具,自动化完成电商数据的采集、清洗与分析,大幅提升数据处理效率。通过某美妆电商的实战案例,详细拆解从多平台数据整合到可视化报表生成的全流程,帮助电商从业者摆脱繁琐操作,聚焦业务增长,实现数据驱动的高效运营。
|
7月前
数据传输的基本概念
本内容介绍了带宽、数据传输速率和吞吐量的概念及三者关系。带宽是通信链路的最大传输能力,决定理论上限;数据传输速率表示实际传输速度,受多种因素影响可能低于带宽;吞吐量则是实际测量的传输速率,反映网络真实性能。用公路类比:带宽是宽度(容量)、数据传输速率是速度、吞吐量是实际通行量。
1632 7
|
6月前
|
存储 运维 监控
确定Ceph集群中OSD组件与具体物理磁盘的关联。
总结来说,确定Ceph集群中OSD与具体物理磁盘的关联需要搜集和对比Ceph集群的配置信息、OSD元数据、物理磁盘的详细信息,以及运行时的系统日志。这对于Ceph存储集群的维护和问题诊断至关重要,也有助于进行正常的运维活动,如扩容、升级或替换硬件。通过上述步骤,管理员可以直观且高效地管理和定位Ceph集群中的存储资源。
371 15
|
NoSQL MongoDB 数据库
MongoDB 删除集合
10月更文挑战第14天
407 1
|
8月前
|
安全 缓存 容器
2025 年 WordPress 主机托管深度测评
本测评针对全球23家主流主机商,基于120天实时监测与300+技术指标,筛选出5家优秀WordPress托管方案。从基础性能(响应时间、加载速度等)、技术适配(容器化支持、缓存机制等)、服务保障(技术支持、安全防护等)到性价比模型,全方位评估。推荐方案涵盖性能优先型(CloudPress Pro)、成本敏感型(BlueHost Premium)、技术开发型(SiteGround GoGeek)等,满足不同需求。报告还洞察行业趋势,如容器化普及、Serverless探索及AI驱动优化,为用户选型提供科学依据。测评数据来自2025年1-3月实测,保持中立客观立场。
359 0
2025 年 WordPress 主机托管深度测评
|
网络协议 网络安全 网络架构
不会这10个抓包技巧,就不要在网工圈里混了!
不会这10个抓包技巧,就不要在网工圈里混了!
651 1
|
10月前
|
人工智能 编解码 自然语言处理
Zonos:油管博主集体转粉!开源TTS神器Zonos爆火:克隆你的声音说5国语言,还能调喜怒哀乐
Zonos 是 ZyphraAI 推出的开源多语言 TTS 模型,支持语音克隆、情感控制和多种语言,适用于有声读物、虚拟助手等场景。
796 18
Zonos:油管博主集体转粉!开源TTS神器Zonos爆火:克隆你的声音说5国语言,还能调喜怒哀乐
|
Kubernetes 调度 Perl
在K8S中,Pod多副本配置了硬亲和性,会调度到同⼀个节点上吗?
在K8S中,Pod多副本配置了硬亲和性,会调度到同⼀个节点上吗?
|
算法 容器
令牌桶算法原理及实现,图文详解
本文介绍令牌桶算法,一种常用的限流策略,通过恒定速率放入令牌,控制高并发场景下的流量,确保系统稳定运行。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
令牌桶算法原理及实现,图文详解