2014-07-07 4 views
0

토네이도 프레임 워크가있는 python http 서버가 있습니다. 여러 요청 후에는 사용할 수 없게됩니다. 브라우저 페이지에서 사용할 수 없습니다. 약 20 초 동안 사용하지 않으면 다시 작동하기 시작합니다.파이썬 토네이도 서버가 연결을 끊습니다

약 10 개의 예외가 포함 된 쿼리가 약 10 개 있습니다. 이로드에서 서버 프로세스는 약 30 %의 CPU를 사용합니다.

왜 서버를 사용할 수 없게됩니까?

서버 :

start_port = 4400 
workers = 1 

class MainHandler(tornado.web.RequestHandler): 
    def get(self): 
     data = ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(1000)) 
     self.write(data) 


def server_process(port): 
    application = tornado.web.Application([ 
     (r"/", MainHandler), 
    ]) 

    http_server = tornado.httpserver.HTTPServer(application) 

    http_server.listen(port) 
    tornado.ioloop.IOLoop.instance().start() 


if __name__ == "__main__": 
    for i in xrange(workers): 
     port = start_port + i 
     print 'process started on %d port' % port 
     p = Process(target=server_process, args=(port,)) 
     p.start() 

클라이언트 :

def f(): 
    for i in xrange(500000): 
     try: 
      r = requests.get('http://127.0.0.1:4400') 
      if i % 100 == 0: 
       print i, str(r.text) 
     except: 
      print traceback.format_exc() 
      time.sleep(5) 


if __name__ == '__main__': 
    for j in xrange(1): 
     p = Process(target=f) 
     p.start() 

역 추적 :

Traceback (most recent call last): 
    File "/home/me/PycharmProjects/test/client.py", line 16, in f 
    if i % 100 == 0: 
    File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 55, in get 
    return request('get', url, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 44, in request 
    return session.request(method=method, url=url, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 383, in request 
    resp = self.send(prep, **send_kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 486, in send 
    r = adapter.send(request, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/requests/adapters.py", line 378, in send 
    raise ConnectionError(e) 
ConnectionError: HTTPConnectionPool(host='127.0.0.1', port=4400): Max retries exceeded with url:/(Caused by <class 'socket.error'>: [Errno 99] Cannot assign requested address) 

업데이트 :

는 실험적으로 두 번째 하드웨어 버리는 당 300 개 요청의 값을 포착 ver (처리 안 함). 이 값은 토네이도를 실행하는 프로세스의 수에 의존하지 않습니다. nginx를 프록시 서버로 추가하는 것은 도움이되지 않습니다.

서버는 우분투 서버 12.04 및 linux mint 16에서 실행되었습니다.이 한계는 데비안 운영 체제에 따라 달라집니다.

+1

토네이도는 단일 스레드입니다. 서버로 백업하는 요청은 모두 처리 할 수 ​​없습니다. http://papercruncher.com/2013/01/15/truly-async-with-tornado/ – dm03514

+0

클라이언트에서 다음 메시지를 보냅니다. 포트 4400에서 실행되는 단일 프로세스에만 요청합니다. 아마도 서버 프로세스 수를 변경할 때 아무런 차이가 없음을 알 수 있습니다. – Eugen

+1

호기심 부족 : 각 요청마다 1000 자 대신 하나의 문자 만 반환하면 초당 요청 수가 수만 개로 증가할까요? – Eugen

답변

1

문제가 해결되었습니다. 다중 프로세스. 프로세스는 여러 가지 토네이도 프로세스에 좋지 않은 아이디어입니다. 대신 tornado.process를 사용하고 있습니다.

관련 문제