▲ 点击上方"DevOps和k8s全栈技术"关注公众号


错误信息:

Failed to create pod sandbox: rpc error: code = Unknown desc =kubelet 133.0.218142failed pulling image"133.0.6.129:8021 /library/pause:3.1". Errorresponse from daemon: Get http;413306129:8021/v2/: dial tcp133.0.6.129:802t: socket: too many open files

从字面意思上看就是说程序打开的文件数过多,不过这里的files不单是文件的意思,也包括打开的通讯链接(比如socket),正在监听的端口等等,所以有时候也可以叫做句柄(handle),这个错误通常也可以叫做句柄数超出系统限制。

分析:

引起的原因就是进程在某个时刻打开了超过系统限制的文件数量以及通讯链接数,通过命令ulimit -a可以查看当前系统设置的最大句柄数是多少:

ef06d9152918dedc64f53e161ec3fb62.png

查看当前系统打开的文件数量:

代码如下:

lsof | wc -l 

watch "lsof | wc -l"

查看某一进程的打开文件数量:

代码如下:

lsof -p pid | wc -l 

lsof -p 1234 | wc -l 

解决方案

增大允许打开的文件数——命令方式:

1.临时(重启后失效): 

ulimit -n 1024000(非root用户限制到4096)    

2.永久生效(需要重启)

vim /etc/security/limits.conf  

#在最后加入  

* soft nofile 1024000 

* hard nofile 1024000

2.检查程序问题

  如果你对你的程序有一定的解的话,应该对程序打开文件数(链接数)上限有一定的估算,如果感觉数字异常,请使用第一步的lsof -p 进程id > openfiles.log命令,获得当前占用句柄的全部详情进行分析

1)打开的这些文件是不是都是必要的?
2)定位到打开这些文件的代码
3)是否程序操作了文件写入,但是没有进行正常关闭
4)是否程序进行了通讯,但是没有正常关闭(也就是没有超时结束的机制)–(eg:post.releaseConnection()关闭连接)

 代码中只用post.releaseConnection()关闭连接,经过再网上查找资料,说这种关闭并没有真正关闭连接,而是将该连接提交给 MultiThreadedHttpConnectionManager,等待复用。

Close_wate需要延迟几秒钟才能关闭连接,而每个Socket连接都需要等待几秒钟,压力过大时,开启的Socket连接超过了系统所能承受的最大连接数(ulimit -u 1024000),所以抛出Too many open files异常。

精彩文章推荐

年底了,总结下这一年,收获满满

看看kubernetes在2022年的这11个数据

Kuberentes 上 GitOps 最佳实践

Kubernetes常见的日常故障处理指南|干货分享|适合各类基础人员学习

K8S大规模集群优化方案系列文章-第一篇

微信公众号

   点亮收藏,服务器10年不宕机1d5ba466aea2af72351de1be701b6188.gifd4ee05dda3344fc31767ca70fc6cb8bb.gif

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐