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()

これを実行して得た結果は次のとおりです。

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

これは、ping が 1.5 秒までジャンプするので、かなり悪いようです。

サーバーにpingを実行すると、次のようになります。

Reply from 192.30.35.15: bytes=32 time=83ms

応答時間が非常に遅いのはなぜですか?それを改善するためにできることはありますか?

注: これは安価なレンタル サーバーですが、期待できる最高のサーバーですか? サーバー管理についてよくわからないのですが、確認すべきことはありますか?

4

1 に答える 1

1

TCP では 3 ウェイ ハンドシェイクが必要であり、さらに 10 ラウンド トリップのデータを送信していることを思い出してください。あなたが作成したものは、レイテンシ/バイトの観点から最悪のケースについてです。

ICMP の ping 時間を確認してください..次に、それを掛けます.. 25. アプリケーションの ping 時間が予想どおりであることがわかると思います。

編集:実際、これは多くのプログラムにとって適切なアドバイスですが、あなたの状況には正確には関係ないと思います。接続がタイマー内にありません。それでも、nagle アルゴリズムによる遅延が発生しているため、この特定のコードでは無効にすることができます (ただし、一般的には有効のままにしておくことをお勧めします)。また、ICMP の ping 時間も調べて、ネットワークの状況を考慮して適切な応答時間を確認する必要があります。

于 2013-08-15T22:05:55.407 に答える