2013-08-15 5 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() 

Я следующий код клиента, который подключается к серверу и времени время отклика 10x:

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 секунд.

Вот что я получаю, когда я пинг сервера:

Reply from 192.30.35.15: bytes=32 time=83ms 

Почему мое время ответа так плохо и есть все, что я могу сделать, чтобы улучшить его?

Примечание: Это дешевый арендованный сервер, это лучшее, что я могу ожидать? Я мало знаю о администрировании сервера, есть ли что-нибудь, что я должен проверить?

+0

Что такое время ICMP в то же время, когда вы используете это? Ты не собираешься делать лучше. – xaxxon

ответ

1

Помните, что для TCP требуется трехстороннее рукопожатие, плюс вы отправляете 10 обратных рейсов. То, что вы создали, касается наихудшего случая с точки зрения задержки/байта.

Проверьте свои ICMP-запросы на ping .. затем умножьте это как. 25. Я думаю, вы увидите, что время выполнения ping вашего приложения соответствует тому, что вы ожидаете.

EDIT: на самом деле это звуковой совет для многих программ, я думаю, это не совсем относится к вашей ситуации. Ваше соединение не входит в ваши таймеры. Тем не менее, вы смотрите на задержки из-за алгоритма nagle, который вы могли бы отключить для этого конкретного кода (но в целом хорошо оставить его). Вы также хотите посмотреть время ICMP для проверки того, какое хорошее время отклика может быть предоставлено вашей сетевой ситуации.

Смежные вопросы