2

我们正在使用他们的 64 位 Python 容器在 Amazon Elastic Beanstalk 中运行一个应用程序。此应用程序产生线程,允许它们存在一定的时间,然后关闭它们,然后在任意时间段内迭代相同的模式。

然后,这些线程中的每一个在 Unix 系统中创建一些文件——使用带有 FileHandler 的 logging 模块以及与 SQS、EC2、Cloudwatch、Autoscale 和 S3 的各种连接创建的日志文件——所有这些都使用 boto 模块完成。这些连接创建的 TCP 文件可以在以下结果中识别:

lsof -p {process-id}

当一个线程完成时,我们删除 FileHandler 并关闭记录器。我们还明确关闭了使用 boto 建立的每个连接。在任何可能的情况下,我们使用with语法创建连接或文件,以便之后可以(希望)处理任何资源。

然而,我们发现在线程终止后仍有 TCP 请求作为打开的文件在系统上逗留 - 处于 CLOSE_WAIT 状态。这不是立即出现问题,但最终系统上打开的文件数超过了设置的限制/etc/security/limits.conf,Python 脚本因此停止执行。

目前,我们通过间歇性地调用 GDB 并指示它关闭任何我们认为是陈旧的处理程序来掩盖自己,但是这种解决方案缺乏优雅,并且忽略了真正的问题,即这些 TCP 打开的文件继续存在。

除了提供给我的连接选项之外,我在这里是否缺少一种模式close()

4

1 回答 1

1

CLOSE_WAIT我发现在boto 2.3.0 状态下的套接字存在同样的问题。原因是连接设置如下:

import boto.ec2
conn = boto.ec2.connect_to_region("eu-west-1")

它将首先打开一个连接以查找所有区域,然后打开到给定区域的第二个连接。但是第一个连接从未关闭。可以通过手动设置 ec2 连接boto.connect_ec2_endpoint(...)或使用boto >= 2.7.0 ,其中使用静态区域列表。

于 2013-11-06T14:47:49.650 回答