长期运行的 daemon 进程或者 socket 测试类进程, 经常遇到的坑是:
IOError: [Errno 24] Too many open files
即进程遇到 IO 错误, 无法打开更多的文件.
一般从两个方面入手:
a. 谁打开谁关闭是个普适的原则:
只有逻辑设计者自己最熟悉
短暂的文件读写打开推荐使用 pythonic 的 with statement
# with 语法会在生命周期后自动关闭打开的文件 FD
with open('xxxx_path.file', 'w') as fhandle:
fhandle.dosth()
b. 检查文件 FD 是否存在泄漏
系统设计阶段一般会预估系统总体可打开的 FD 情况. 当出现如下情况时可能出现了泄漏 BUG
Python 基础库 CUP 提供对进程打开 FD 的支持, 详见示例代码.
以 Centos 6.3 Linux 系统
为例, 查看 /etc/security/limits.conf 获得系统软硬限资源
* soft nofile 10240
* hard nofile 10240
其中, 用户不能突破系统的硬线 hard nofile limit
.
用户也可以通过 shell 命令 ulimit -n 来限定该 shell 启动的所有进程的 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
作者持续更新的 cnblogs: https://www.cnblogs.com/mythmgn/
作者持续更新的 Github:
Life is short. We use Python.
1
anonymous256 2019-07-01 00:55:55 +08:00 via Android
python2.7 告辞
|
2
iwanghang 2019-07-01 01:23:51 +08:00
不错
|
3
so1n 2019-07-01 10:38:03 +08:00
有的还需要编辑 /etc/systemd/system.conf 的 DefaultLimitNOFILE 和 DefaultLimitNPROC,光靠 /etc/security/limits.conf 无法生效
|
4
www5070504 2019-07-01 11:13:42 +08:00
用什么语言 文件描述符泄露都会导致这个问题 这个真不能算是 python 采坑 另外这本身也不算坑
|
5
mythmgn OP @so1n
先赞一个. 是的, 不同发行版配置不一. 我在示例里给了下参考 Centos 6.3. 在文章最后我也提示下大家吧. 代码示例支持 平台: Centos 6.3 Python: 2.7.14 代码示例: 菜单 - Python 踩坑指南代码示例 |
6
mythmgn OP @anonymous256 python3 目前在 beta, 近期会发出来除了 网络通信框架 cup.net.async 之外的版本.
默认 unicode 之后, 对网络包序列化处理上影响多, 这块工作量比想象的大. 哈哈 |