[代码修订版] Python 踩坑之旅进程篇其五打不开的文件
| 代码示例支持 |
|---|
| 平台: Centos 6.3 |
| Python: 2.7.14 |
| 代码示例: 菜单 - Python踩坑指南代码示例 |
1.1 踩坑案例
长期运行的daemon进程或者socket测试类进程, 经常遇到的坑是:
IOError: [Errno 24] Too many open files
即进程遇到 IO 错误, 无法打开更多的文件.
1.2 填坑和分析
一般从两个方面入手:
1.2.1 从程序优化入手
- 检查文件打开是否遵循了"谁打开谁关闭"原则
- 文件是否存在关闭泄露
a. 谁打开谁关闭是个普适的原则:
只有逻辑设计者自己最熟悉
- 哪些文件 FD 需要一直维持打开状态
- 哪些文件直到某个事件发生后关闭
短暂的文件读写打开推荐使用 pythonic 的 with statement
# with 语法会在生命周期后自动关闭打开的文件 FD
with open('xxxx_path.file', 'w') as fhandle:
fhandle.dosth()
b. 检查文件 FD 是否存在泄漏
系统设计阶段一般会预估系统总体可打开的 FD 情况. 当出现如下情况时可能出现了泄漏 BUG
- 外围监控系统发现该进程 FD 大量突破了设计预估
- 打开 FD 增长趋势异常
- 一般随着业务增加, FD 会线性增长, 但有限度和规律
- 如果增长曲线不停的出现陡峭增长且在业务低峰期也如此可能出现了泄露
Python 基础库 CUP 提供对进程打开 FD 的支持, 详见示例代码.
1.2.2 从资源软硬限入手
- 了解系统的资源软硬限制
- 检查进程可打开的FD是否突破了系统限制
- 长期运行的 daemon 进程尤其注意
以 Centos 6.3 Linux系统为例, 查看 /etc/security/limits.conf 获得系统软硬限资源
* soft nofile 10240
* hard nofile 10240
其中, 用户不能突破系统的硬线 hard nofile limit.
用户也可以通过 shell 命令 ulimit -n 来限定该 shell 启动的所有进程的 nofile
- 当然非 root 用户是不能突破系统硬线的
- 用户为了进程控制, 可以设定nofile更小
ulimit -a 可以查看当前用户被设定的限制, 示例:
[test@agent1 ~]$ ulimit -a
core file size (blocks, -c) 0
.......
open files (-n) 10240
.....
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
1.4.1 技术关键字
- Open FD
- 资源 Soft limit / Hard limit
下期坑位预告
- PyDaemon 进程长什么样
Life is short. We use Python.
[代码修订版] Python 踩坑之旅进程篇其五打不开的文件的更多相关文章
- [代码修订版] Python 踩坑之旅 [进程篇其四] 踩透 uid euid suid gid egid sgid的坑坑洼洼
目录 1.1 踩坑案例 1.2 填坑解法 1.3 坑位分析 1.4 技术关键字 1.5 坑后思考 下期坑位预告 代码示例支持 平台: Centos 6.3 Python: 2.7.14 代码示例: 公 ...
- Python 踩坑之旅进程篇其三pgid是个什么鬼 (子进程\子孙进程无法kill 退出的解法)
目录 1.1 踩坑案例 1.2 填坑解法 1.3 坑位分析 1.4.1 技术关键字 下期坑位预告 代码示例支持 平台: Centos 6.3 Python: 2.7.14 Github: https: ...
- Python 踩坑之旅进程篇其四一次性踩透 uid euid suid gid egid sgid的坑坑洼洼
目录 1.1 踩坑案例 1.2 填坑解法 1.3 坑位分析 1.4 技术关键字 1.5 坑后思考 下期坑位预告 代码示例支持 平台: Centos 6.3 Python: 2.7.14 代码示例: 菜 ...
- Python 踩坑之旅文件系统篇其一文件夹也是个文件
目录 1.1 案例 1.2 分析 1.3 扩展 1.4 技术关键字 下期预告 代码示例支持 平台: Mac OS Python: 2.7.10 代码示例: - wx: 菜单 - Python踩坑指南代 ...
- Python踩坑之旅其一杀不死的Shell子进程
目录 1.1 踩坑案例 1.2 填坑解法 1.3 坑位分析 1.4 坑后扩展 1.4.1 扩展知识 1.4.1 技术关键字 1.5 填坑总结 1.1 踩坑案例 踩坑的程序是个常驻的Agent类管理进程 ...
- Python踩坑之旅其二裸用os.system的原罪
目录 1.1 踩坑案例 1.2 填坑解法 1.3 坑位分析 1.4.1 技术关键字 1.5 填坑总结 2. 前坑回顾 2.1 Linux中, 子进程拷贝父进程哪些信息 2.2 Agent常驻进程选择& ...
- 美团热修复Robust的踩坑之旅-使用篇
最近需要在项目中使用热修复框架,在这里以美团的Robust为主写一篇文章总结一下学习的过程. 一直认为要学习一个框架的原理,首先需要让他跑起来,从效果反推回去,这样更容易理解. 一.美团Robust的 ...
- EasyTrader踩坑之旅总结
easytrader是用python写的可以调用主要券商完成自动化炒股的一个软件 ,但我用的是同花顺,在研究过程中,发现同花顺暂时调不通.后来搜索发现thstrade的源码作者说是easytrad ...
- 我的微信小程序入门踩坑之旅
前言 更好的阅读体验请:我的微信小程序入门踩坑之旅 小程序出来也有一段日子了,刚出来时也留意了一下.不过赶上生病,加上公司里也有别的事,主要是自己犯懒,就一直没做.这星期一,赶紧趁着这股热乎劲,也不是 ...
随机推荐
- 主干(trunk)、分支(branch )、标记(tag)
主干(trunk).分支(branch ).标记(tag) 用法示例 + 图解 以svn为例,git的master相当于trunk,dev分支相当于branches --------------- ...
- 像职业选手样编码:地道Python
Code Like a Pythonista: Idiomatic Python David Goodger goodger@python.org http://python.net/~goodger ...
- silverlight,WPF动画终极攻略之会飞的小鸟篇(Blend 4开发)
原文:silverlight,WPF动画终极攻略之会飞的小鸟篇(Blend 4开发) 本教程基本涵盖了WPF和silverlight中的各种动画.先上张效果图. 声明下,这个做的不是让大家照搬的,只是 ...
- QT中窗口刷新事件的学习总结(viewport, paintEvent, repaint, update, erase, updatesEnabled)
一.主要理解一下几个方法和属性: 1.QWidget * QScrollView::viewport () const 2.void QWidget::paintEvent ( QPaintEvent ...
- 新版本MenuDemo——使用Duilib模拟Windows本机菜单
相信玩Duilib朋友已经开始期待一个很长的文章.由于我的文章在一周前公布--"无焦点窗体的实现"里面提到了无焦点窗体在菜单里面的应用,并承诺大家,写一个关于Menu实现的Demo ...
- 最新用WPF为触摸屏写了一个手写程序,双格输入的
原文:最新用WPF为触摸屏写了一个手写程序,双格输入的 双格输入可以提高手写速度,当前字写完以后可以自动识别提交,写下一个字.这样比单格手写速度提高一倍.特别适合触摸屏程序使用 界面如下: 程序如下: ...
- C++ string的那些坑,C++ string功能补充(类型互转,分割,合并,瘦身) ,c++ string的内存本质(简单明了的一个测试)
1. size_type find_first_of( const basic_string &str, size_type index = 0 ); 查找在字符串中第一个与str中的某个字符 ...
- CefSharp For WPF基本使用
原文:CefSharp For WPF基本使用 Nuget引用 CefSharp.Wpf CefSharp.Common cef.redist.x64 cef.redist.x86 直接搜索安装Cef ...
- 避免让WPF资源字典变得杂乱臃肿
原文:避免让WPF资源字典变得杂乱臃肿 避免让WPF资源字典变得杂乱臃肿 周银辉 今天看到项目种的一个XXXResource.xaml文件代码 ...
- Highcharts纯js图表库,以后可以跟客户说,你跟阿里云ECS用的图表库是同款
Highcharts是一款纯javascript编写的图表库,能够很简便的在Web网站或Web应用中添加交互性的图表,Highcharts目前支持直线图.曲线图.面积图.柱状图.饼图.散点图等多达18 ...