写点什么

Too many open files 的四种解决办法

  • 2020-02-17
  • 本文字数:1419 字

    阅读完需:约 5 分钟

Too many open files的四种解决办法

【摘要】 Too many open files 有四种可能:一 单个进程打开文件句柄数过多,二 操作系统打开的文件句柄数过多,三 systemd 对该进程进行了限制,四 inotify 达到上限.


领导见了孔乙己,也每每这样问他,引人发笑。孔乙己自己知道不能和他们谈天,便只好向我们新员工说话。有一回对我说道,“你定位过问题么?”我略略点一点头。他说,“定位过,……我便考你一考。Too many open files,怎样解决?”我想,考评垫底的人,也配考我么?便回过脸去,不再理会。孔乙己等了许久,很恳切的说道,“不能解决罢?……我教给你,记着!这些方法应该记着。将来做接口人的时候,定位问题要用。”我暗想我和接口人的等级还很远呢,而且我们领导也从不将问题定位记功;又好笑,又不耐烦,懒懒的答他道,“谁要你教,不是 ulimit 太小么?”孔乙己显出极高兴的样子,将两个指头的长指甲敲着白板,点头说,“对呀对呀!……Too many open files 有四种可能,你知道么?”我愈不耐烦了,努着嘴走远。孔乙己却像是没有看到,自顾自的在白板上画了起来。

一 单个进程打开文件句柄数过多

ulimit 中的 nofile 表示单进程可以打开的最大文件句柄数,可以通过 ulimit -a 查看,子进程默认继承父进程的限制(注意,是继承,不是共享,子进程和父进程打开的文件句柄数是单独算的)。


网上还有一种解读是 nofile 表示单用户可以打开的文件句柄数,因为他们在 limit.conf 中看到类似于“openstack soft nofile 65536”,便认为是 openstack 用户最多可以打开的文件句柄数。该解读是错误的,“openstack soft nofile 65536”表示的含义是当你执行"su - openstack"切换到 openstack 用户后,你创建的所有进程最大可以打开的文件句柄数是 65536。


要查看一个进程可以打开的文件句柄数,可以通过“cat /proc/<pid>/limits”查看。


要修改 ulimit 中的 nofile,可以通过修改/etc/security/limits.conf 文件,在其中加入类似“openstack soft nofile 65536”的语句来进行修改。修改完成后,可以通过“su - openstack”切换用户,或者重新登录,来使该配置生效。


要动态修改一个进程的限制,可以使用 prlimit 命令,具体用法为:“prlimit --pid ${pid} --nofile=102400:102400”。

二 操作系统打开的文件句柄数过多

整个操作系统可以打开的文件句柄数是有限的,受内核参数“fs.file-max”影响。


可以通过执行“echo 100000000 > /proc/sys/fs/file-max”命令来动态修改该值,也可以通过修改"/etc/sysctl.conf"文件来永久修改该值。

三 systemd 对该进程进行了限制

该场景仅针对被 systemd 管理的进程(也就是可以通过 systemctl 来控制的进程)生效,可以通过修改该进程的 service 文件(通常在/etc/systemd/system/目录下),在“[Service]”下面添加“LimitNOFILE=20480000”来实现,修改完成之后需要执行"systemctl daemon-reload"来使该配置生效。

四 inotify 达到上限

inotify 是 linux 提供的一种监控机制,可以监控文件系统的变化。该机制受到 2 个内核参数的影响:“fs.inotify.max_user_instances”和“fs.inotify.max_user_watches”,其中“fs.inotify.max_user_instances”表示每个用户最多可以创建的 inotify instances 数量上限,“fs.inotify.max_user_watches”表示么个用户同时可以添加的 watch 数目,当出现 too many open files 问题而上面三种方法都无法解决时,可以尝试通过修改这 2 个内核参数来生效。修改方法是修改"/etc/sysctl.conf"文件,并执行"sysctl -p"。


2020-02-17 11:314464

评论

发布
暂无评论
发现更多内容

持久层Mybatis中对于SQL注入的问题,聊聊你的想法?

卢卡多多

SQL优化 8月日更

Android开发:Android Studio插件GsonFormat根据Json自动生成javabean的方法

三掌柜

8月日更 8月

python-类,对象--》多态,封装,继承

加里都好

Python

JavaScript继承的实现方式:原型语言对象继承对象原理剖析

zhoulujun

JavaScript

Git 应该用 fetch 还是 pull

HoneyMoose

前端之算法(四)快速排序

Augus

算法 8月日更

Web框架Gin | Gin 中间件

xcbeyond

Go 语言 gin gin-middleware 8月日更

模式包括问题和解决方案

escray

学习 极客时间 如何落地业务建模 8月日更

有书香气的七夕节

箭上有毒

8月日更

架构训练营毕业总结

Neil43

架构训练营

Seata搭建与分布式事务入门

码农参上

SpringCloud spring cloud alibaba seata 8月日更

MySQL 系列教程之(四)MySQL 中的数据类型

若尘

MySQL 数据库 8月日更

手撸二叉树之二叉树的堂兄弟节点

HelloWorld杰少

数据结构与算法 8月日更

「让我们一起Golang」让协程自己kill自己

Regan Yue

协程 Go 语言 8月日更

【Vue2.x 源码学习】第三十五篇 - 组件部分 - Vue.component 实现

Brave

源码 vue2 8月日更

梳理会在Scrum中是活动还是事件?——《Scrum指南》重读有感(6)

Bruce Talk

Scrum 敏捷 随笔 Agile

部署MinIO存储服务的四种方式

liuzhen007

8月日更

实战架构训练营总结

贯通

#架构实战营

crudapi增删改查接口零代码产品成功案例之商会联盟卡项目

crudapi

Java Vue 零代码 crudapi qusar

【Flutter 专题】66 图解基本约束 Box (一)

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 8月日更

https 与 http 区别

一个大红包

8月日更

毕业设计:电商秒杀系统

唐高为

【自驱型成长】——控制感

LeifChen

压力 控制感 8月日更 自驱型成长

在线日期计算器

入门小站

工具

【设计模式】中介者模式

Andy阿辉

C# 后端 设计模式 8月日更

Linux之rcp命令

入门小站

Linux

QDS04 TensorFlow

耳东@Erdong

tensorflow 8月日更 qds

从0开始的TypeScriptの七:函数

空城机

typescript 大前端 8月日更

架构实战营 毕业设计:设计电商秒杀系统

Ahu

万字文肝Python基础知识

ベ布小禅

8月日更

配置Flink流式应用(九)

Databri_AI

flink Kubernetes YARN

Too many open files的四种解决办法_服务革新_华为云开发者联盟_InfoQ精选文章