【发布时间】:2013-12-30 15:57:46
【问题描述】:
我有一个简单的 python 网络服务器,它在 2 天/3 天后一直失败。经过调查是因为它达到了打开文件的数量限制。打开的文件描述符是套接字。 (ls -l /proc/pid/fd/xxx:/proc/pid/fd/xxx -> socket:[yyyyy])
我可以增加 ulimit,但我宁愿弄清楚发生了什么。
一些背景
- 我有 50 台机器每小时通过一个简单的 POST id=machine_id,cpu_usage=xxx 向服务器报告它们已启动并运行
- 服务器只是将其存储在数据库 (mongodb) 中
- 有一个 html 页面来监控事物,使用一些 jquery/get json 来制作给定机器的 cpu 使用率图表
- 在 GET 上提供 [(date, cpu_usage)] 的处理程序?date_start,date_end,machine_id
我是唯一使用此页面的人,正如我所说,每小时只有 50 个请求随机分发到服务器
问题可能源于:
- jquery 的
getjson打开了一个套接字并且从不关闭它(可能是,但我不这么认为,因为我重新启动了服务器并且没有进入监控页面) - python 代码和我在“main”中定义处理程序的方式
- mongodb
- 我想不到的其他地方
主代码:
import listener_handler
from flask import Flask
if __name__ == '__main__':
app = Flask(__name__)
listener_handl = None
@app.route('/listener', methods=['POST'])
def listener():
global listener_handl
if listener_handl is None:
listener_handl = listener_handler.ListenerHandler()
return listener_handl.Post()
... (other handlers for the getjson and the static monitoring page)
app.run()
处理程序代码:
from flask import request
class ListenerHandler:
def Post(self):
Save(request.form.get('machine_id'), request.form.get('cpu_usage'))
return 'ok'
mongo db 代码:
import pymongo
mongo_client = pymongo.MongoClient()
mongo_db = mongo_client.stations_monitoring
def Save(machine_id, cpu_usage):
mongo_db.db['monitoring'].save({'machine': machine_id, 'cpu': cpu_usage})
我试图保持代码轻量级,我对 python 有很好的经验,但对 python webserver 几乎没有,所以当我定义处理程序时,我真的不知道引擎盖下发生了什么,如果每次都创建一个新套接字,如果最后是关闭的,...
我首先有一个烧瓶服务器(此处为代码),然后移至 tornado(由一些 tornado 导入和一些 IOLoop.instance().start() 替换 app.run)但这导致了同样的问题
【问题讨论】:
-
可能是愚蠢的问题,但是那些与 mongod 进程的 pymongo 连接是否存在?不是您流程的另一部分?
-
你说得对,我前段时间解决了部分问题。套接字与mongodb无关。它位于远程计算机(客户端)和服务器之间。客户端建立了连接,但它的互联网连接很糟糕,所以它永远挂起。在 curl 上添加超时有帮助。但我不知道为什么 Flask 或 Tornado 不处理这个?
标签: python mongodb sockets flask tornado