我有一個簡單的python web服務器,它在2天/ 3天后保持失敗。經過調查,這是因爲它達到了它打開文件數量的限制。打開的文件描述符是套接字。 (ls -l /proc/pid/fd/xxx
:/proc/pid/fd/xxx -> socket:[yyyyy]
)不斷增加的數量的python web服務器上打開的套接字
我可以增加ulimit,但我寧願弄清楚發生了什麼事情。
一些背景
- 我有50臺機器可報告每隔一小時,他們是正常運行的服務器上,通過一個簡單的帖子ID = machine_id,cpu_usage = XXX
- 服務器只存儲這在數據庫(MongoDB的)
- 有一個HTML頁面來監測東西,用一些jQuery的/獲得JSON在
- ,使CPU使用率的圖表給定的機器也給了[(日處理程序,cpu_usage)]在GET? DATE_START,DATE_END,machine_id
我用這個頁面只有一個,和我說,有僅50請求一個小時隨機分配到服務器
問題可能源於:
- jquery的
getjson
打開一個套接字,並從不關閉它(可能是,但我不這樣認爲,因爲我重新啓動服務器,並沒有去監控頁面) - python代碼和我定義的處理程序的方式'main '
- 的mongodb
- 別的地方我想不出
碼主:
from flask import request
class ListenerHandler:
def Post(self):
Save(request.form.get('machine_id'), request.form.get('cpu_usage'))
return 'ok'
爲蒙戈DB代碼:爲處理程序
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()
代碼
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 web服務器,所以我真的不知道什麼是在我定義處理程序時,如果每次創建一個新的套接字,如果在年底關閉,...
我第一次有一個燒瓶服務器(此處代碼)然後轉移到龍捲風(由少數龍捲風進口和一些IOLoop.instance().start()
更換app.run
),但是這導致了同樣的問題
可能是愚蠢的問題,但這些pymongo連接的mongod被掛的過程?不是你的過程的另一部分? –
你說得對,我前段時間解決了部分問題。套接字與mongodb無關。它位於遠程計算機(客戶端)和服務器之間。客戶建立連接,但其互聯網連接蹩腳,所以它永遠掛起。在curl上添加超時幫助。但我不知道爲什麼Flask或龍捲風不處理這個問題? – Thomas