2013-08-15 3 views
0

다음 샘플 코드가 내 서버에서 실행되고 있습니다.서버 응답 시간을 개선 할 수 있습니까?

import socket 
import select 

def main(): 
bind = ("0.0.0.0", 28889) 
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
server_socket.bind(bind) 
server_socket.listen(50) 
server_socket.setblocking(0) 
server_socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) 

clients = {} 

epoll = select.epoll() # @UndefinedVariable 
epoll.register(server_socket.fileno(), select.EPOLLIN) # @UndefinedVariable 

while 1: 
    events = epoll.poll(1) 
    for (fileno, event) in events: 
     if fileno == server_socket.fileno(): 
      sock, addr = server_socket.accept() 
      sock.setblocking(0) 
      sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) 
      fileno = sock.fileno() 
      epoll.register(fileno, select.EPOLLIN) # @UndefinedVariable 
      clients[fileno] = sock 

     elif event & select.EPOLLIN: # @UndefinedVariable 
      sock = clients[fileno] 
      try: 
       sock.recv(4096) 
       sock.send("~\n") 
      except socket.error: 
       sock.close() 
       del clients[fileno] 

     elif event & select.EPOLLHUP: # @UndefinedVariable 
      sock = clients[fileno] 
      sock.close() 
      del clients[fileno] 

if __name__ == "__main__": 
main() 

내가 서버와 시간에 응답 시간 10 배를 연결하는 다음과 같은 클라이언트 코드가있다 : 여기

import socket 
import time 

def main(): 
sock = socket.socket() 
sock.connect(("192.30.35.15", 28889)) 

for _ in xrange(10): 
    start_time = time.time() 
    sock.send("~\n") 
    sock.recv(2048) 
    end_time = time.time() 
    print "Ping: %.5f" % (end_time-start_time) 


if __name__ == "__main__": 
main() 

이 결과 I 있습니다 뭔가를 읽고 즉시 응답 할 때 그것은 단순히 연결을 허용 그것을 실행에서 가져 오기 :

Ping: 0.09100 
Ping: 0.11500 
Ping: 0.87100 
Ping: 0.24400 
Ping: 0.49100 
Ping: 1.45300 
Ping: 0.74800 
Ping: 1.59100 
Ping: 0.43600 
Ping: 0.27100 

이것은 1.5 초까지 점프하는 핑 (ping)에서 꽤 나빠 보인다. 여기

나는 내가 서버에 ping 명령을 사용할 때 얻을 것 :

Reply from 192.30.35.15: bytes=32 time=83ms 

왜 내 응답 시간이 너무 나쁜 내가 그것을 개선하기 위해 할 수있는 일이?

참고 : 이것은 저렴한 임대 서버입니다. 예상 할 수있는 최고입니까? 서버 관리에 대해 잘 모릅니다. 확인할 사항이 있습니까?

+0

실행중인 ICMP 시간은 무엇입니까? 그보다 더 잘할 수는 없습니다. – xaxxon

답변

1

TCP는 3 방향 핸드 셰이크가 필요하며 10 왕복 데이터를 전송한다는 것을 기억하십시오. 당신이 만든 것은 대기 시간/바이트 측면에서 최악의 경우에 관한 것입니다.

귀하의 ICMP 핑 시간을 확인한 다음 .. 같은 것으로 곱하십시오. 25. 귀하의 응용 프로그램 핑 시간이 당신이 기대해야 할 내용과 일치한다는 것을 알 것입니다.

편집 : 실제로 이것은 많은 프로그램에 대한 건전한 조언이지만, 귀하의 상황과 정확히 일치하지는 않을 것입니다. 귀하의 연결은 귀하의 타이머 내에 없습니다. 아직도, 당신은이 특정 코드를 위해 잠재적으로 끌 수있는 (당신은 일반적으로 떠나는 것이 좋다) nagle 알고리즘으로 인한 지연을보고있다. 또한 ICMP 핑 (ping) 시간을보고 네트워크 상황에 따라 적절한 응답 시간을 얻을 수 있는지 확인하기를 원합니다.

관련 문제