稍微有点 Linux 经验的人一定会遇到过 “Too many open files” 错误,这个错误本质是 ulimit 设置不合理导致的。关于 ulimit 设置,有哪些需要注意的点呢?本文给大家做一个介绍,希望对大家有所帮助。

如何确认 ulimit 设置生效了?

很多人设置了 ulimit 最后发现还是报错 “Too many open files”。先不论如何操作,我们先要知道怎么确认进程的 ulimit 到底是多少。这不是通过 ulimit -n 来看的,而是找到进程的 pid,然后查看 /proc/<进程的PID>/limits 文件,这个文件里面记录了进程的真实 ulimit 信息。比如:

如何设置 ulimit?

如果 ssh 到机器上,通过 nohup 之类的方式启动进程,ulimit 将受限于 /etc/security/limits.conf 文件的配置。比如我这个机器:

[root@aliyun-2c2g40g3m ~]# cat /etc/security/limits.conf | grep -v '^#' | grep -v '^$'
root soft nofile 65535
root hard nofile 65535
* soft nofile 65535
* hard nofile 65535

这是 aliyun 的一台虚机,看起来阿里云已经帮我们设置了 ulimit 为 65535,这个是 OK 的,挺大的了。但是,如果你是通过 systemd 启动的服务,ulimit 将受限于 systemd 的配置。比如某个服务的 service 文件设置为:

[Unit]
Description="Categraf"
After=network.target [Service]
Type=simple ExecStart=/opt/categraf/categraf
WorkingDirectory=/opt/categraf Restart=on-failure
SuccessExitStatus=0
LimitNOFILE=65535
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=categraf [Install]
WantedBy=multi-user.target

看到 LimitNOFILE 那行配置了么?就是它。

如果 service 文件中没有配置 LimitNOFILE,systemd 会有个默认配置,systemd 的默认配置可以通过如下方式查看:

[root@aliyun-2c2g40g3m systemd]# pwd
/etc/systemd
[root@aliyun-2c2g40g3m systemd]# grep FILE *.conf
system.conf:#DefaultLimitNOFILE=
user.conf:#DefaultLimitNOFILE=

咱也不用关心默认配置是多少,反正每个 service 都配置一下 LimitNOFILE 就好了。

其他进程管理工具对 ulimit 也有影响

如果你不是通过 systemd 托管进程的,而是使用了其他的进程管理工具,比如 supervisor,那么 ulimit 将受限于 supervisor 的配置。如果你是通过 Saltstack 之类的工具,批量通过 shell 启动进程,还要小心 salt minion 的 ulimit 设置,至于 supervisor 和 salt minion 如何调整 ulimit,这里就不展开了,说多了都是泪。

句柄限制不止是 ulimit

实际上,操作系统对句柄的限制不止是 ulimit,还有 /proc/sys/fs/file-max 这个参数,这个参数限制了整个系统的句柄数量。如果你的系统句柄数量设置过小,那么即使你设置了 ulimit,也会受限于这个参数。比如我的系统如下:

[root@aliyun-2c2g40g3m systemd]# cat /proc/sys/fs/file-max
188844

如何调整这个参数呢?操作命令如下:

[root@aliyun-2c2g40g3m systemd]# echo 100000 > /proc/sys/fs/file-max
[root@aliyun-2c2g40g3m systemd]# cat /proc/sys/fs/file-max
100000
[root@aliyun-2c2g40g3m systemd]# echo 188844 > /proc/sys/fs/file-max
[root@aliyun-2c2g40g3m systemd]# cat /proc/sys/fs/file-max
188844

如果想要机器重启也能生效,就要修改 sysctl.conf 文件,比如:

fs.file-max = 188844

如何监控句柄相关问题?

系统层面总共分配了多少句柄可以通过 /proc/sys/fs/file-nr 文件查看,比如:

[root@aliyun-2c2g40g3m systemd]# cat /proc/sys/fs/file-nr
1760 0 188844

第一个数字是已经分配的句柄数量,第三个数字是系统总共可分配的句柄数量。如果第一个数字接近第三个数字,那么就要小心了。

夜莺的内置告警规则中,有针对 categraf 的机器指标的告警规则,其中就有文件句柄使用率的告警:

linux_sysctl_fs_file_nr / linux_sysctl_fs_file_max > 0.9

另外,如果你使用了 categraf 的 procstat 进程监控插件,并且打开了 gather_more_metrics 中的 limit,还会采集到 procstat_rlimit_num_fds_soft 指标,夜莺的内置规则中还有这么一条告警规则:

procstat_rlimit_num_fds_soft < 2048

这是采集进程的软句柄限制,如果软句柄限制过小,就告警。通常,小于 2048,大概率就是运维人员忘记做操作系统的参数调优了。

如上知识,希望对你有帮助。文末请允许我插播一个小广告。本人创业两年了,我们公司的业务如下,如果你有这方面的需求,欢迎联系我们做产品技术交流哈。

关于快猫星云

快猫星云是一家云原生智能运维科技公司,由知名开源项目“夜莺(Nightingale)”的核心开发团队组成,创始团队均来⾃阿⾥、百度、滴滴等互联⽹公司。夜莺是一款开源云原生监控工具,是中国计算机学会接受捐赠并托管的第一个开源项目,在GitHub上有超过8000颗星,迭代发布了超过100多个版本,上百位社区贡献者,是国内领先的开源可观测性解决方案。

快猫星云以开源夜莺为内核打造的“Flashcat平台”,是国内顶级互联⽹公司可观测性实践的产品化落地,致力于让可观测性技术更好的服务企业,保障服务稳定性。Flashcat 平台具有以下特点:

  • 统一采集:采用插件化思路,内置集成上百种采集插件,服务器、网络设备、中间件、数据库、应用、业务,均可监控,开箱即用。
  • 统一告警:支持几十种数据源对接,收集各类监控系统的告警事件,进行统一的告警收敛、降噪、排班、认领、升级、协同,大幅提升告警处理效率。
  • 统一观测:将 Metrics、Logs、Traces、Events、Profiling 等多种可观测性数据融会贯通,并预置行业最佳实践,既提供全局业务视角、技术视角的驾驶舱,也提供层层下钻的故障定位能力,有效缩短故障发现和定位时间。

快猫星云,让可观测性数据更有价值!
https://flashcat.cloud/

关于 ulimit 的两个天坑的更多相关文章

  1. 巩固复习(Hany驿站原创)_python的礼物

    Python编程语言简介 https://www.cnblogs.com/hany-postq473111315/p/12256134.html Python环境搭建及中文编码 https://www ...

  2. 关于ulimit -a中需要修改的两个值

    以root用户运行 ulimit -a 命令,其中有两个参数分别为: open files和max user processes   修改方法:  vi /etc/security/limits.co ...

  3. ulimit

    .修改ulimit vim /etc/security/limits.conf * soft nproc * hard nproc * soft nofile * hard nofile vim /e ...

  4. [转]正确配置Linux系统ulimit值的方法

    在Linux下面部署应用的时候,有时候会遇上Socket/File: Can't open so many files的问题:这个值也会影响服务器的最大并发数,其实Linux是有文件句柄限制的,而且L ...

  5. 常见linux命令释义(第七天)——ulimit 与变量内容的删除替代与替换。

    linux是一个多用户多任务的系统,不同于windows的单人多任务操作系统.再linux上,在同一个时间点上,可以有多个人同时执行多个任务. 那么假若有10个用户,同时打开了100个100M的文件. ...

  6. ulimit命令

    原文链接 linux下默认是不产生core文件的,要用ulimit -c unlimited放开 概述 系统性能一直是一个受关注的话题,如何通过最简单的设置来实现最有效的性能调优,如何在有限资源的条件 ...

  7. MySQL Innodb的两种表空间方式

    要说表空间,MySQL的表空间管理远远说不上完善.换句话说,事实上MySQL根本没有真正意义上的表空间管理.MySQL的Innodb包含两种表空间文件模式,默认的共享表空间和每个表分离的独立表空间.只 ...

  8. linux ulimit调优

    1,说明:ulimit用于shell启动进程所占用的资源.2,类别:shell内建命令3,语法格式:ulimit [-acdfHlmnpsStvw] [size]4,参数介绍:-H 设置硬件资源限制. ...

  9. 优化系统资源ulimit《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》

    优化系统资源ulimit<高性能Linux服务器构建实战:运维监控.性能调优与集群应用> 假设有这样一种情况,一台Linux 主机上同时登录了10个用户,在没有限制系统资源的情况下,这10 ...

  10. 正确配置Linux系统ulimit值的方法【转】

    转自:http://www.cnblogs.com/ibook360/archive/2012/05/11/2495405.html 在Linux下面部署应用的时候,有时候会遇上Socket/File ...

随机推荐

  1. 力扣54(java)-螺旋矩阵(中等)

    题目: 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素. 示例 1: 提示: m == matrix.lengthn == matrix[i].leng ...

  2. HarmonyOS NEXT 实战开发—Grid和List内拖拽交换子组件位置

    介绍 本示例分别通过onItemDrop()和onDrop()回调,实现子组件在Grid和List中的子组件位置交换. 效果图预览 使用说明: 拖拽Grid中子组件,到目标Grid子组件位置,进行两者 ...

  3. EMT4J——让 Java 应用升级更轻松

    简介: EMT4J 是什么?如何使用 EMT4J 工具进行 Java 应用升级? 前言 JDK 升级对于 Java 应用来说是不得不面对的事情,一方面 Java 生态系统希望 Java 应用能跟上最新 ...

  4. [FE] 关于网页的一些反爬手段的解析思路,比如 58 等

    这里主要是贴一些资料,有兴趣的可以再深入研究,比如做一些自动化库. www.cnblogs.com/TRHX/p/11740616.html blog.csdn.net/DzzzzzZzzzz/art ...

  5. centos7虚拟机部署netcore3.1服务供局域网访问

    如果买了亚马逊.腾讯.阿里等服务器,基本上几分钟就可以跑aspnetcore,外网访问分分钟.但是便宜点的服务器访问速度就没那么理想.这时候就需要考虑零成本的虚拟机部署了,当然这个基本都是局域网做测试 ...

  6. 分享几个.NET开源的AI和LLM相关项目框架

    前言 现如今人工智能(AI)技术的发展可谓是如火如荼,它们在各个领域都展现出了巨大的潜力和影响力.今天大姚给大家分享4个.NET开源的AI和LLM相关的项目框架,希望能为大家提供一些参考.如果你有更好 ...

  7. rails角本启动和停止

    start.sh #!/bin/bash nohup rails s Puma -d >> run_log.log 2>&1 & stop.sh #!/bin/bas ...

  8. 八大远程控制软件,完美替代Teamviewer

    理想情况下,最好的远程桌面软件应该物有所值,同时为用户提供快速.安全和可靠的远程连接.还应该有一套强大的解决方案,提供高级报告和增强功能.跨平台支持和通信. TeamViewer 拥有超过 25 亿的 ...

  9. 谈谈 Spring 的过滤器和拦截器

    前言 我们在进行 Web 应用开发时,时常需要对请求进行拦截或处理,故 Spring 为我们提供了过滤器和拦截器来应对这种情况.那么两者之间有什么不同呢?本文将详细讲解两者的区别和对应的使用场景. ( ...

  10. 机器学习策略篇:详解为什么是人的表现?(Why human-level performance?)

    为什么是人的表现? 在过去的几年里,更多的机器学习团队一直在讨论如何比较机器学习系统和人类的表现,为什么呢? 认为有两个主要原因,首先是因为深度学习系统的进步,机器学习算法突然变得更好了.在许多机器学 ...