为什么我有这么多打开的套接字处理程序和 netstat DGRAM 条目?

为什么我有这么多打开的套接字处理程序和 netstat DGRAM 条目?

我在 RPi (Raspbian 3.12.35+ #730 PREEMPT Fri Dec 19 18:31:24 GMT 2014 armv6l GNU/Linux) 上运行一个 Python 2.7.8 中的守护进程,它通过查询各种 APIrequests并为自己提供一个 API 供另一个使用它的应用程序使用(两者都在同一台机器上运行)。我最近在日志中发现(在守护进程运行一段时间后)我通过异常耗尽了打开的文件处理程序requests

('Connection aborted.', error(23, 'Too many open files in system'))

由于我没有明确打开任何文件,因此我怀疑我的http呼叫处于打开状态。

我大约每 10 秒调用一次(大部分调用 localhost),运行守护进程一两个小时后lsof报告 32k+ 打开sock连接:

python2     804             pi  982u     unix 0xce3565a0        0t0     116809 socket
python2     804             pi  983u     unix 0xcb5553c0        0t0     116875 socket
python2     804             pi  984u     unix 0xcb555780        0t0     116899 socket
python2     804             pi  985u     unix 0xd74dd1e0        0t0     117010 socket
python2     804             pi  986u     unix 0xcb555d20        0t0     116918 socket

这个数字或多或少地随着所有应用程序的呼叫速率而增加。

我想通过'Connection': 'close'在代码中显式设置来强制关闭这些连接,但不幸的是这没有帮助,lsof仍然显示无数的打开sock处理程序。

netstat显示大量DGRAM连接(大约 12k+):

(...)
unix  2      [ ]         DGRAM                    74315
unix  2      [ ]         DGRAM                    68340
unix  2      [ ]         DGRAM                    67749
unix  2      [ ]         DGRAM                    58836
unix  2      [ ]         DGRAM                    58087
(...)

更让我担心的是,tcp 序列似乎在网络级别正确关闭:

在此输入图像描述

所以我在这里很迷路。开放描述符数量的增加可能是由于 http 调用造成的,但我很难理解为什么它们会留下开放处理程序?

注意:我最初在 SO 上问这个问题(指向我的代码),但我觉得它更面向系统。

相关内容