关于 ulimit 的两个天坑

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

如何确认 ulimit 设置生效了?

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

20240401155313

如何设置 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=simpleExecStart=/opt/categraf/categraf
WorkingDirectory=/opt/categrafRestart=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 等多种可观测性数据融会贯通,并预置行业最佳实践,既提供全局业务视角、技术视角的驾驶舱,也提供层层下钻的故障定位能力,有效缩短故障发现和定位时间。

快猫星云,让可观测性数据更有价值!
快猫星云 Flashcat | 让监控分析变简单 | 开源监控 | 夜莺监控 | 可观测平台 | 运维监控 | IT监控

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/589117.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据库系统工程师】软考2024年5月报名流程及注意事项

2024年5月软考数据库系统工程师报名入口&#xff1a; 中国计算机技术职业资格网&#xff08;http://www.ruankao.org.cn/&#xff09; 2024年软考报名时间暂未公布&#xff0c;考试时间上半年为5月25日到28日&#xff0c;下半年考试时间为11月9日到12日。不想错过考试最新消息…

freeRTOS学习

总结 1.总结任务调度算法之间的区别 调度算法&#xff1a;抢占式调度&#xff1a;优先级高的任务可以打断低优先级任务的执行&#xff0c;适用于不同优先级任务的执行。 时间片轮换&#xff1a;分配时间片&#xff08;1ms&#xff09;&#xff0c;时间片耗尽时&#xff0c;任…

C语言_第一轮笔记_指针

8.1 密码开锁 地址和指针 一般以变量所在的内存单元的第一个字节的地址作为他的地址NULL的值为0&#xff0c;代表空指针 指针变量的定义 类型名 *指针变量名类型名指定指针变量所指向变量的类型指针声明符*在定义指针变量时被使用&#xff0c;说明被定义的那个变量是指针指针变…

【Algorithms 4】算法(第4版)学习笔记 23 - 5.4 正则表达式

文章目录 前言参考目录学习笔记1&#xff1a;正则表达式1.1&#xff1a;表示1.2&#xff1a;快捷表示2&#xff1a;正则表达式与非确定有限状态自动机 REs and NFAs2.1&#xff1a;二元性2.2&#xff1a;模式匹配实现2.3&#xff1a;非确定有限状态自动机 Nondeterministic fin…

mysql 判断一张表是否存在的方法

查询表是否存在 使用 SHOW TABLES SHOW TABLES LIKE %tbl_tabl%;结果: 查询 INFORMATION_SCHEMA // like 匹配 SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA test AND TABLE_NAME like %tbl%; // 完全匹配 SELECT TABLE_NAME FROM INFORMATION_SC…

一个简单的Demo展示fastapi+tortoise-orm+celery如何搭配

1. 创建并激活虚拟环境 python3 -m venv venv source venv/*/activate 2. 安装依赖包 pip install fastapi uvicorn[standard] tortoise-orm celery[redis] fastapi-cdn-host 3. 配置数据库连接参数 - config.py from typing import TypedDictclass TortoiseInitParam(Ty…

HarmonyOS NEXT应用开发之ForEach:循环渲染

ForEach接口基于数组类型数据来进行循环渲染&#xff0c;需要与容器组件配合使用&#xff0c;且接口返回的组件应当是允许包含在ForEach父容器组件中的子组件。例如&#xff0c;ListItem组件要求ForEach的父容器组件必须为 List组件 。 说明&#xff1a; 从API version 9开始&a…

计算机网络|谢希仁版|数据链路层

数据链路层 数据链路层研究的是什么&#xff1f;数据链路层的几个共同问题数据链路与链路帧通信规程 三个基本问题封装成帧透明传输差错检测可靠传输 点对点协议PPPPPP协议应满足的需求PPP协议的组成PPP协议帧的格式各字段的意义字节填充零比特填充PPP协议的工作状态 使用广播信…

恒创科技:Windows 服务器关闭防火墙的两种方法

​  防火墙是在Windows服务器中的一项安全功能&#xff0c;可监视所有网络流量(传入和传出)&#xff0c;并根据一组旨在保护系统免受黑客攻击的规则允许或阻止流量。然而&#xff0c;在某些情况下&#xff0c;您可能需要暂时关闭防火墙以进行特定的网络配置或测试。本文将介绍…

03 Python进阶:MySQL - mysql-connector

mysql-connector安装 要在 Python 中使用 MySQL 数据库&#xff0c;你需要安装 MySQL 官方提供的 MySQL Connector/Python。下面是安装 MySQL Connector/Python 的步骤&#xff1a; 首先&#xff0c;确保你已经安装了 Python&#xff0c;如果没有安装&#xff0c;可以在 Python…

mac、windows 电脑安装使用多个版本的node

我们为啥要安装多个不同版本的node&#xff1f; 开发旧项目时&#xff0c;使用低版本Nodejs。开发新项目时&#xff0c;需使用高版本Node.js。可使用n同时安装多个版本Node.js&#xff0c;并切换到指定版本Node.js。 mac电脑安装 一、全局安装 npm install -g n 二、mac电脑…

如何优化TCP?TCP的可靠传输机制是什么?

在网络世界中&#xff0c;传输层协议扮演着至关重要的角色&#xff0c;特别是TCP协议&#xff0c;以其可靠的数据传输特性而广受青睐。然而&#xff0c;随着网络的发展和数据量的激增&#xff0c;传统的TCP协议在效率方面遭遇了挑战。小编将深入分析TCP的可靠性传输机制&#x…