首页 > 其他分享 >关于 ulimit 的两个天坑

关于 ulimit 的两个天坑

时间:2024-04-03 15:22:44浏览次数:16  
标签:systemd fs 天坑 句柄 ulimit 关于 file root

稍微有点 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=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,大概率就是运维人员忘记做操作系统的参数调优了。

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

标签:systemd,fs,天坑,句柄,ulimit,关于,file,root
From: https://www.cnblogs.com/ulricqin/p/18112778

相关文章

  • 关于CSRF跨站请求伪造的理解(只写了一点点,未写完)
    之前做一道题时遇到了这样一句CSRF(Cross—SiteRequestForgery)跨站请求伪造的预防措施:1、使用token2、加验证码3、http请求头设置referer字段有点不太理解什么时候请求头设置了referer字段发现是这种浏览器开发者页面看到的请求头里的ReferrerPolicy。这个的含义,用AI生成......
  • 关于Win11系统 Ixchariot打流出现上行流无法打通的情况
    电脑有线接入,手机无线连接测试设备Wi-Fi,IxChariot链路从电脑IP到手机IP,可以打通。但是反过来无法进行。Win11电脑安装IxChariot(版本为6.70版本)时,安装的IXCHARIOTENDPOINTARCHIVE报错,无法安装:Error1920.SericeIxiaPerformanceEndpoint(IxiaEndpoint)failedtostart. 需......
  • 关于Unity Asset Store搜不到画线插件Vectrosity的问题(附带最新版本下载)
    Vectrosity是一个很好用的画线的插件,可以画出2D,3D,贝塞尔,圆,椭圆等各种线条图案,还可以给线段添加纹理,进行碰撞检查等,如果有多段线段的话,还能够检测到当前点击的是那段线段,我在项目中一直用的它,感觉还是挺稳定挺好用的。最近要开发另一个项目了,也要画线,就想着还用Vectrosity,去Asset......
  • 关于“共享程序员”,你们怎么看?
    前言最近出现了一个很火的词,叫做“共享员工”,眼下正是“金三银四”的春招旺季,记者了解到,今年,不少企业都在实行“共享员工”。“共享程序员”“共享设计师”等能为企业节省人力成本。这些“共享员工”一般不和企业签订固定合同,而是与企业就某一项目进行短期合作。对待“......
  • Android12.0 系统关于安兔兔显示信息的修改
    1.前言在12.0的系统rom定制化开发中,在一些产品开发中,对于安兔兔等第三方检测工具,检测不出某些版本的内核信息等,显示0GB等问题的相关修改,由于不知道安兔兔的检测方式,所以就需要来修改关于文本上的一些信息了2.系统关于安兔兔显示信息的修改的核心类frameworks/base/core/jav......
  • 关于Stata工具变量固定效应回归ivreghdfe包报错last estimates not found一步解决问题
            其实lastestimatesnotfound这个问题,不用这么麻烦。我也是研究了半天,最后发现可以根据ivreghdfe命令的作者在github上写的统一安装需要的那些命令来很方便快捷地解决。        这是ivreghdfe命令作者的Github主页:https://github.com/sergiocorreia/......
  • 关于AI编程代码生成工具汇总(持续整理中)
    1.BaiduComatehttps://comate.baidu.com/zh基于文心大模型,结合百度积累多年的编程现场大数据和外部优秀开源数据,为你生成更符合实际研发场景的优质代码。提升编码效率,释放“十倍”软件生产力。有免费版和付费版(提供高级功能)目前看只支持前端工具(目前Comate支持100+主流编程......
  • 生信小白菜之关于mutate函数的一切
    RforDataScience准备包和示例数据library(dplyr)library(nycflights13)mutate()函数基本用法#作用是添加新列,新列是由原有数据计算的来#添加的新列在数据集的最后#举例flights_sml<-select(flights,year:day,ends_with("delay"),distance,air_time)mu......
  • 生信小白菜之关于summarize函数的一切(part 1)
    准备包和示例数据library(dplyr)library(nycflights13)library(ggplot2)summarize()的基本用法#获取摘要的函数#作用是将数据框折叠成一行#举例summarise(flights,delay=mean(dep_delay,na.rm=T))#第二个参数新的一列,也是根据数据框原有数据计算得来#返回结......
  • 关于ITIL认证您需要了解的一切
    这是一篇关于从业人员、领导者和ITSM爱好者指南。ITIL4于2019年发布。最新版本的IT服务管理(ITSM)最佳实践从传统的生命周期方法转变为服务价值体系模型,重点关注价值共创、向业务交付成果以及与其他最佳实践框架的融合。新版本的框架也意味着培训的更新。本文将针对ITIL培训......