[代码修订版] 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 ...
- 我的微信小程序入门踩坑之旅
前言 更好的阅读体验请:我的微信小程序入门踩坑之旅 小程序出来也有一段日子了,刚出来时也留意了一下.不过赶上生病,加上公司里也有别的事,主要是自己犯懒,就一直没做.这星期一,赶紧趁着这股热乎劲,也不是 ...
随机推荐
- numpy 辨异(二) —— np.identity()/np.eye()
import numpy as np; 两者在创建单位矩阵上,并无区别,两者的区别主要在接口上: np.identity(n, dtype=None):只能获取方阵,也即标准意义的单位阵: np.ey ...
- hbase结合hive和sqoop实现数据指导mysql
hive综合hbase两个优势表中的: 1.实现数据导入到MYSQL. 2.实现hbase表转换为另外一张hbase表. 三个操作环节: 1.hbase关联hive作为外部 ...
- Analysis of variance(ANOVA)
方差分析,也称为"变异数分析",用于两个及两个以上样本均值(group means)差别的显著性检验.在 ANOVA 的环境下,一个观测得到的方差视为是由不同方差的源组合而成.
- 自动备份Mysql数据库脚本
[root@bogon ~]# cat auto_backup_mysql.sh #!/bin/bash #auto backup mysql db #by authors wugk #define ...
- 怎么给开源项目提PR?
1. fork 你要的项目 2. 下载到本地 相关步骤如下 在你需要的文件夹下面,右键 git bash 命令,打开 git 命令框 执行如下指令可将项目代码下载到当前目录 ~~~ git clone ...
- SDP开发平台试用版上线!提供源码!!!!
SDP开发平台提供试用版!! SDP软件快速开发平台是一套面向对象的应用软件快速开发平台. 1.SDP 设计端--页面设计 通过简单的拖拉控件,或者快速生成控件,可以在几分钟快速制作一个页面:如图 通 ...
- SqlServer 可更新订阅队列读取器代理错误:试图进行的插入或更新已失败
原文:SqlServer 可更新订阅队列读取器代理错误:试图进行的插入或更新已失败 今天发现队列读取器代理不停地尝试启动但总是出错: 其中内容如下: 队列读取器代理在连接"Publicati ...
- Android零基础入门第29节:善用TableLayout表格布局,事半功倍
原文:Android零基础入门第29节:善用TableLayout表格布局,事半功倍 前面学习了线性布局和相对布局,线性布局虽然方便,但如果遇到控件需要排列整齐的情况就很难达到要求,用相对布局又比较麻 ...
- Android零基础入门第36节:Android系统事件的响应
原文:Android零基础入门第36节:Android系统事件的响应 在开发Android应用时,有时候可能需要让应用程序随系统设置而进行调整,比如判断系统的屏幕方向.判断系统方向的方向导航设备等.除 ...
- Java HashMap实现原理 源码剖析
HashMap是基于哈希表的Map接口实现,提供了所有可选的映射操作,并允许使用null值和null建,不同步且不保证映射顺序.下面记录一下研究HashMap实现原理. HashMap内部存储 在Ha ...