Python 踩坑之旅进程篇其五打不开的新文件

2019-06-30 22:24:44 +08:00
 mythmgn

1.1 踩坑案例

长期运行的 daemon 进程或者 socket 测试类进程, 经常遇到的坑是:

IOError: [Errno 24] Too many open files

即进程遇到 IO 错误, 无法打开更多的文件.

1.2 填坑和分析

一般从两个方面入手:

1.2.1 从程序优化入手

a. 谁打开谁关闭是个普适的原则:

# with 语法会在生命周期后自动关闭打开的文件 FD
with open('xxxx_path.file', 'w') as fhandle:
    fhandle.dosth()

b. 检查文件 FD 是否存在泄漏

系统设计阶段一般会预估系统总体可打开的 FD 情况. 当出现如下情况时可能出现了泄漏 BUG

Python 基础库 CUP 提供对进程打开 FD 的支持, 详见示例代码.

1.2.2 从资源软硬限入手

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

1.4.1 技术关键字

下期坑位预告

文章来源

作者持续更新的 cnblogs: https://www.cnblogs.com/mythmgn/

作者持续更新的 Github:


Life is short. We use Python.

1937 次点击
所在节点    Python
6 条回复
anonymous256
2019-07-01 00:55:55 +08:00
python2.7 告辞
iwanghang
2019-07-01 01:23:51 +08:00
不错
so1n
2019-07-01 10:38:03 +08:00
有的还需要编辑 /etc/systemd/system.conf 的 DefaultLimitNOFILE 和 DefaultLimitNPROC,光靠 /etc/security/limits.conf 无法生效
www5070504
2019-07-01 11:13:42 +08:00
用什么语言 文件描述符泄露都会导致这个问题 这个真不能算是 python 采坑 另外这本身也不算坑
mythmgn
2019-07-01 12:33:33 +08:00
@so1n

先赞一个.

是的, 不同发行版配置不一. 我在示例里给了下参考 Centos 6.3. 在文章最后我也提示下大家吧.

代码示例支持
平台: Centos 6.3
Python: 2.7.14
代码示例: 菜单 - Python 踩坑指南代码示例
mythmgn
2019-07-01 12:34:47 +08:00
@anonymous256 python3 目前在 beta, 近期会发出来除了 网络通信框架 cup.net.async 之外的版本.

默认 unicode 之后, 对网络包序列化处理上影响多, 这块工作量比想象的大. 哈哈

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/578807

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX