アプリケーションのパフォーマンス問題を解決しようとするとき、通信レイヤのレイテンシの影響は一般的に過小評価されていますが、実用的な解決策に向けて努力するためには、正しい理解が不可欠です。
まず、通信層の遅延とは、パケットがローカルシステムからリモートシステムに到達し、再び戻ってくるまでにかかる時間のことです。通信層の遅延の最大の要因は距離です。もう一つの主要な要素は、パケットを処理するローカルホストとリモートホストの間にあるデバイスの数です。リンクの帯域幅は役割を果たしますが、ほとんどの人が考えるほど大きくはありません。帯域幅は挿入遅延に影響を与えます - パケットをワイヤ上に置くのにかかる時間ですが、ワイヤ上の信号は帯域幅ではなく、媒体に基づいた速度で移動します。この議論の残りの部分では、通信層のレイテンシを意味するときはレイテンシを使用します。
待ち時間がアプリケーションにどのように影響するかを説明するために、クライアントアプリケーションにデータを入力してリターンボタンを押したとします。クライアントアプリケーションはサーバアプリケーションにメッセージを送信し、応答を待ってから別のメッセージを送信し、応答を待つなど、いくつかの数N回の「ターン」の間、メッセージを送信します。Nターンの終わりに、クライアントアプリケーションは結果をあなたに返します。
10ターンが必要で、クライアントメッセージを処理してアンサーを送り返すのにサーバアプリケーションが1msかかるとします。待ち時間が1msの場合、応答時間は10 * (1ms + 1ms)または20msとなります。今すぐ飛行機に乗ってシカゴに旅行し、サーバーはボストンに滞在するので、あなたは今、50msと10 * (50ms + 1ms)または550msの応答時間のレイテンシを持っています。これは目立ちますが、苦痛ではありません。ターン数を100に増やすと、5.5秒の応答時間が発生します。100ターンは過剰だと思うかもしれませんが、複雑なデータベースクエリや複雑なフォームを入力するアプリケーションの中には、まさにそのような処理を行うものがあります。アプリケーションに必要なターン数を知っていますか?
OSL経由でファイルをコピーすると、このような挙動を示します。OSL は 4K トランザクションでファイルを送信します。各トランザクションはレスポンスを必要とするので、1,000,000 バイトのファイルは 1,000,000 / 4,096 = 245 トランザクション、または前の段落で述べた命名法を使用するためのターンが必要になります。ここでも、トランザクションを処理するのに1ms、待ち時間が1msと仮定すると、copy_fileは490msかかります。レイテンシを50msに増やすと、12.495秒かかります。ファイルを1,000,000,000,000バイトに増やすと、244,141トランザクションが必要になります。これに対応する時間は、1msの待ち時間が488.282秒、50msの待ち時間が12,451.191秒、約3.5時間です。
遅延を測定する最も簡単な方法はpingです。
ping 192.168.200.197 Pinging host 192.168.200.197 : 192.168.200.197 ICMP Echo Reply:TTL 53 time = 84 ms ICMP Echo Reply:TTL 53 time = 80 ms ICMP Echo Reply:TTL 53 time = 81 ms ICMP Echo Reply:TTL 53 time = 96 ms Host 192.168.200.197 replied to all 4 of the 4 pings |
start_process 'packet_monitor -numeric -time_stamp -filter -host A.B.C.D -port NNN' -privileged
”.と入力してください。telnet A.B.C.D NNN
”.いくつかの接続を行って平均値を取得する必要があります。リモートホストの未使用ポートに接続していることに注意してください。これはトレースのパケット数を減らしますが、ファイアウォールがポートをブロックしている場合は、アクティブなポートを使用する必要があるかもしれません。
start_process 'packet_monitor -numeric -time_stamp -filter -host 192.168.200.197 + -port 6666' -privileged ready 09:12:42 telnet 192.168.200.197 6666 Trying... telnet: Unable to connect to remote host: The connection was refused. ready 09:12:53 telnet 192.168.200.197 6666 Trying... telnet: Unable to connect to remote host: The connection was refused. ready 09:12:56 telnet 192.168.200.197 6666 Trying... telnet: Unable to connect to remote host: The connection was refused. ready 09:12:58 telnet 192.168.200.197 6666 Trying... telnet: Unable to connect to remote host: The connection was refused. ready 09:12:58 stop_process packet_monitor -no_ask Stopping Noah_Davids.CAC (packet_monitor). ready 09:13:07 d packet_monitor.out %phx_vos#m16_mas>SysAdmin>Noah_Davids>packet_monitor.out 09-11-13 09:13:17 mst Noah_Davids.CAC logged in on %phx_vos#m16 at 09-11-13 09:12:42 mst. packet_monitor -numeric -time_stamp -filter -host 192.168.200.197 -port 6666 *********************************************************** WARNING: failure to specify a specific interface will cause packet_monitor to bind to ALL interfaces on the module, greatly increasing the amount of Streams memory used!!! *********************************************************** dir icmp type + tcp hh:mm:ss.ttt len proto source destination src port dst p +ort type 9:12:52.984 T 0004 TCP 172.16.77.128 192.168.200.197 62515 + 6666 S 9:12:53.067 R 0000 TCP 192.168.200.197 172.16.77.128 6666 + 62515 RA 9:12:56.643 T 0004 TCP 172.16.77.128 192.168.200.197 62516 + 6666 S 9:12:56.724 R 0000 TCP 192.168.200.197 172.16.77.128 6666 + 62516 RA 9:12:58.003 T 0004 TCP 172.16.77.128 192.168.200.197 62517 + 6666 S 9:12:58.086 R 0000 TCP 192.168.200.197 172.16.77.128 6666 + 62517 RA 9:12:58.805 T 0004 TCP 172.16.77.128 192.168.200.197 62518 + 6666 S 9:12:58.887 R 0000 TCP 192.168.200.197 172.16.77.128 6666 + 62518 RA ready 09:13:07 Process finished. Terminating Noah_Davids.CAC (packet_monitor). Process stopped by Noah_Davids.CA +C. |
Latency times: 58.887 - 58.805 = 0.082 == 82ms
58.086 - 58.003 = 0.083 == 83ms
56.724 - 56.643 = 0.081 == 81ms
53.067 - 52.984 = 0.083 == 83ms
packet_monitor を使わなくても、私が書いたプログラムを使って接続の時間を計測することもできます。http://members.cox.net/ndav1/self_published/stcp_tping.doc を参照してください。stcp_tping コマンドは、リモートホストのアクティブなポートに接続する必要があります。この場合、私はポート 23 (telnet) を使用していますが、どのアクティブなポートでも動作します。コマンドの最後にある1という数字は、リクエストが1秒に1回送信されることを示しています。
stcp_tping 192.168.200.197 23 1 tping 192.168.200.197 23 1 Success/Tries=Percent min/average/max success times 1/1=100.000% 83.284/83.284/83.284 Connection in 83.284 ms 2/2=100.000% 81.697/82.490/83.284 Connection in 81.697 ms 3/3=100.000% 80.858/81.946/83.284 Connection in 80.858 ms 4/4=100.000% 80.858/81.895/83.284 Connection in 81.743 ms ^C |