レイテンシ(遅延)とスループット(帯域幅)と帯域幅遅延積

[マルチクラウド展開にまつわる既成概念を覆す](https://www.oracle.com/jp/news/announcement/blog/myths-of-multicloud-deployment-jp-2022-08-19/)より
データ転送では、特に長距離の場合にレイテンシ（遅延）が問題になることがありますが、現在はすべてのクラウド・プロバイダーがそれぞれの物理インフラストラクチャを互いの近くに配置（専門用語では「コロケーション」）しているため、これはさほど問題となりません。この近接性（場合によっては同一コロケーション施設内の別の部屋）は、クラウド間のレイテンシがミリ秒単位であることを意味します。それに加え、クラウド・データセンター・リージョンは世界中で増加しており、クラウド・リージョン間の距離は縮まっています。
という事で、レイテンシ(遅延)について、まとめてみてみます。

# ■ Agenda
　:white_check_mark: [レイテンシ(遅延)とスループット(帯域幅)](#-レイテンシ遅延とスループット帯域幅)
　:white_check_mark: [レイテンシと TCP の動作](#-レイテンシと-tcp-の動作)
　:white_check_mark: [帯域幅遅延積(Bandwidth-Delay Product)](#-帯域幅遅延積bandwidth-delay-product)
　:white_check_mark: [TCP Window Size の調整とチューニング](#-tcp-window-size-tcp-buffer-sizeの調整とチューニング)
 　:white_check_mark: [クラウドサービスでの考慮](#-クラウドサービスでの考慮)
　:white_check_mark: [レイテンシ(遅延)の机上計算](#-レイテンシ遅延の机上計算)
　:white_check_mark: [ネットワーク・パフォーマンスの測定方法](#-ネットワークパフォーマンスの測定)
　:white_check_mark: [必要レイテンシ(遅延)値の事前策定](#-必要レイテンシ遅延値の事前策定)
　:white_check_mark: [参考情報](#-参考情報)

# ■ レイテンシ(遅延)とスループット(帯域幅)
レイテンシとスループットは、2つのネットワークのパフォーマンス測定値です。
```
　・ レイテンシ: 転送要求から応答を受信するまでの応答時間
　・ スループット: 一定時間内に転送できるデータの量
```
TCP通信では、レイテンシが大きくなると比例してスループットは低下し、通信の完了が大きく影響を受けます。

・参考: [ネットワーク遅延対策技術](https://thinkit.co.jp/story/2011/08/23/2239)

**・イメージ**
![画像01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/b870638f-a1c5-5be9-fc7e-917bf9e31cfd.jpeg)
※ 分かりやすくするためのイメージです。TCP/IP - TCP 3ウェイハンドシェイク、ウィンドウサイズの折衝 等は割愛しています。詳しくはこちらも参考ください

　・参考: [TCP window size の仕組み](https://milestone-of-se.nesuke.com/nw-basic/tcp-udp/window-size-mss-mtu/)
 　　　 　  [TCP Window Control / Flow Control](https://www.infraexpert.com/study/tcpip11.html)



# ■ レイテンシと TCP の動作
TCP では、送信側が高速で受信側が低速な場合のオーバーランを防ぐため、ウィンドウ処理という仕組みが使用されます。
この仕組みでは、受信側のウィンドウが更新されるのを送信側が待つことなく送信できるデータ量を受信側から取り寄せます。
この TCP ウィンドウを使用することで、送信側システムと受信側システムはメモリを効率的に使用できます。
また、TCP ウィンドウサイズは、受信バッファサイズ、TCP ソケットバッファーサイズとも呼ばれます。
TCP 接続の一括転送のパフォーマンスの制限は次の式で表されます。
```: 式
Throughput = Window Size / Round Trip Time(RTT)のレイテンシ
```
・参考: [問題: レイテンシと TCP の動作](https://cloud.google.com/compute/docs/networking/tcp-optimization-for-network-performance-in-gcp-and-hybrid?hl=ja)
　　  　 [応用情報技術者過去問題](https://www.ap-siken.com/kakomon/24_haru/pm05.html)
　　  　 [ビット？バイト？ データ量の表し方](https://www.networld.co.jp/solution/learn_first/storage/p22_24.html)


ウィンドウ・サイズ=64 KB, レイテンシ=1ms の時のスループットは次のようになります。
```: Window Size=64KB, RTT=1msの場合
64 KB / 1 ms  = (64 KB) / (1/1000 s)
              = 64000 KB/s
              =    64 MB/s 
              =   512 Mbps
```
ということで、TCPを用いるアプリケーションの最大スループットは、往復の遅延時間（RTT: Round Trip Time）の影響をうけるため、ウィンドウサイズが 64Kバイトの場合のTCP最大スループットの理論値は以下のとおりです。
![画像表03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/5b8fc201-2a7c-d2f9-bc92-22bf5be58628.jpeg)
※ MByte は1,000 KByte とする。
・参考: [ネットワーク遅延と高速化](https://gihyo.jp/admin/serial/01/net_prac_tech/0002)




# ■ 帯域幅遅延積(Bandwidth-Delay Product)
帯域幅遅延積は、ネットワーク帯域幅とネットワークを通過するデータの往復時間の積です。
帯域幅遅延積以上の値に設定すると、ネットワーク帯域幅を最適に利用できるように、大量のデータが送信されます。
これは、TCP ウィンドウサイズが小さく帯域幅に余裕があり十分なスループットがでない場合、一度に送信するデータ量を増やせばこの問題を解決できます。
ネットワークの帯域幅が増加するとケーブル（ネットワーク）を流れるデータ量が増加します。
また、ケーブルが長くなるほどデータの受信確認に要する時間も長くなります。
この関係を帯域幅遅延積（Bandwidth-Delay Product: BDP）といいます。
BDP は帯域幅とラウンドトリップ時間（RTT）の積で、パイプにできるだけ多くのデータ量を流すために最適な送信ビット数が得られます。
これは以下の式で表されます。
```: 帯域幅遅延積の計算式
BDP（bit）= 帯域幅（bit/秒）× RTT（秒）
```
たとえば、ネットワークの帯域幅が 100Mbps (100,000,000bps)で、往復時間が 5ms の場合、送受信バッファは少なくとも (100*10ˆ6) * (5/10ˆ3)ビット、すなわち約 62.5KBになります。

```: スループット=100Mbps, レイテンシ=5ms の場合
  100,000,000 bits        1 Bytes        5 ms
--------------------  x  --------- x  ---------  =  62,500 bytes
   1 second               8 bits        1000
```

・参考
　- [レイテンシと TCP の動作](https://cloud.google.com/compute/docs/networking/tcp-optimization-for-network-performance-in-gcp-and-hybrid?hl=ja)
　- [帯域幅遅延積の求め方](https://docs.oracle.com/cd/F19136_01/netag/optimizing-performance.html#GUID-E55C75B9-0678-4F17-BFBC-97FCBC004E2F)



ということで、先ほどの表に帯域幅遅延積を加えると次のようになります。
![画像表04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/ce1f751f-b714-3fce-9dfe-04a2953ad9f1.jpeg)



最適な ウィンドウ サイズ, TCP Buffer Sizeの値は、それぞれのユーザーの状況によって異なりますが、システムのデータ送信が予期される経路の BDP（帯域遅延積）の最大値が 1 つの基準となります。
ネットワーク帯域幅をすべて使うようにするには、送信ウィンドウを帯域遅延積の2倍以上に設定します。

　・参考: [HPCユーザが知っておきたいTCP/IPの話](https://archive.xsig.ipsj.or.jp/history/SACSIS/2009/SACSIS2009_TCP.pdf)


# ■ TCP Window Size (TCP Buffer Size)の調整とチューニング
## ● Path MTU Discovery確認
TCP Buffer Size の調整の前に、Maximum Transmission Unit (MTU) と Path MTU Discovery (PMTUD)設定を確認しておきます。
MTU とは一回のデータ転送で送信可能なIPデータグラムの最大値、この値は固定もしくは Path MTU Discoveryによる自動検出により設定されます。
自動検出有効にするには送信元へICMP（type 3 code 4）でその最小 MTU値の情報を送信して、MTUサイズを自動修正させます。
ということで、MTUサイズ異なることによる接続がハングするという問題を回避するよう Firewall に ICMP（type 3 code 4）を許可する設定をしておきます。

・参考: 
　- [Path MTU Discovery](https://www.infraexpert.com/info/5.2adsl.htm)
　- [Window Size と MSS (≒MTU) との違い](https://milestone-of-se.nesuke.com/nw-basic/tcp-udp/window-size-mss-mtu/)
　- [ハングしている接続](https://docs.oracle.com/ja-jp/iaas/Content/Network/Troubleshoot/connectionhang.htm)


## ● OS での TCP Buffer Size調整
まず、アプリケーションの TCP Buffer Size 調整の前にOSのTCP Buffer Sizeのリミッターを引き上げる必要があります。そして、OSの設定値を確認し、効果がありそうか調整を試みます。

### ・ [Linux](https://docs.oracle.com/cd/F22978_01/osmanage/osmanage-ConfiguringSystemSettings.html#ol-perfparm-sysctl)
```
・ net.core.rmem_max: 最大読取りソケット・バッファ・サイズを指定
・ net.core.wmem_max: 最大書込みソケット・バッファ・サイズを指定
・ net.ipv4.tcp_rmem: TCPソケットの 最小, デフォルト, 最大受信バッファ・サイズを指定
・ net.ipv4.tcp_wmem: TCPソケットの 最小, デフォルト, 最大送信バッファ・サイズを指定
```

・参考: [システム・パフォーマンスを制御するパラメータ](https://docs.oracle.com/cd/F22978_01/osmanage/osmanage-ConfiguringSystemSettings.html#ol-perfparm-sysctl)

### ・ [Mac OSX](https://fasterdata.es.net/host-tuning/osx/)
```
・ net.inet.tcp.autorcvbufmax
・ net.inet.tcp.autosndbufmax
・ net.inet.tcp.win_scale_factor
・ kern.ipc.maxsockbuf
・ net.systm.kctl.autorcvbufmax
```

・参考: [Mac OSX Tuning](https://fasterdata.es.net/host-tuning/osx/)


### ・ [Windows](https://learn.microsoft.com/ja-jp/troubleshoot/windows-server/networking/description-tcp-features#tcp-window-size)
受信ウィンドウ サイズを特定の値に設定するには、Windows のバージョンに固有のレジストリ サブキーに TcpWindowSize 値を追加します。

・参考: [Windows TCP 機能の説明](https://learn.microsoft.com/ja-jp/troubleshoot/windows-server/networking/description-tcp-features#tcp-window-size)

## ● Software での TCP Buffer Size調整
アプリケーション、ソフトウェアによって、TCP Buffer Sizeを調整してNWスループットを上げることができるものがあります。
 
### ・ ファイル転送ソフトウェア
・ **WinSCP**
　「接続バッファ サイズの最適化」をチェック
　　・参考: [The Connection Page (Advanced Site Settings dialog)](https://freesoft.tvbok.com/freesoft/winscp_buffer.html)
  
**・ SFTP**
　　-B バッファサイズを指定 : デフォルト 32768 バイト
　　・参考: [manページ — SFTP](https://nxmnpg.lemoda.net/ja/1/sftp)


**・ SCP**
　　[High Performance SSH/SCP](https://www.psc.edu/index.php/hpn-ssh) は、SSH バッファサイズを動的に大きくすることで、スループットを劇的に増やすことができます。
　　・参考: [SSHの高速化](https://wiki.archlinux.jp/index.php/OpenSSH#SSH_.E3.81.AE.E9.AB.98.E9.80.9F.E5.8C.96)
  
**・ RCLONE**
　　--buffer-size=SIZE: バッファ・サイズを指定して、ファイル転送を高速化します。
　　・参考: [rclone.org](https://rclone.org/docs/)

### ・ Oracle Database
　- [TCPソケット・バッファ・サイズの設定](https://docs.oracle.com/cd/F19136_01/haovw/plan-oracle-data-guard-deployment.html#GUID-8B35E191-38E8-4E7F-B405-FA3AE0291C50)
　- [REDOデータ転送のネットワーク調整](https://docs.oracle.com/cd/F19136_01/sbydb/troubleshooting-oracle-data-guard.html#GUID-5B879B01-2433-4B08-8D58-E91DBA58FEF7)
　- [パフォーマンスの最適化](https://docs.oracle.com/cd/F19136_01/netag/optimizing-performance.html#GUID-FC114CA9-4166-4195-8EFD-DB4FE8733D3F)
　- [帯域幅遅延積の求め方](https://docs.oracle.com/cd/F19136_01/netag/optimizing-performance.html#GUID-E55C75B9-0678-4F17-BFBC-97FCBC004E2F)
　- [How to measure Network Latency for Oracle Data Guard Replication](https://database-heartbeat.com/2022/05/02/latency_dg/)
　- [Doc ID 2064368.1: Assessing and Tuning Network Performance for Data Guard and RMAN](https://support.oracle.com/rs?type=doc&id=2064368.1)
　
## ● その他チューニングによるスループット高速化
スループット高速化するには、転送回数削減、転送サイズ縮小化などがあります。
```
　・ 転送回数削減: 並列処理、効率的プログラミング・アルゴリズムの使用、など
　・ 転送サイズ縮小化: データ圧縮、オーバーヘッド少ない暗号アルゴリズムの選択、など
```
### ・ ファイルを分割して並列転送で高速化
ファイル転送でバッファ・サイズ指定できない場合や、効果が足りない場合、ファイルを分割して並列転送して転送時間を短縮します。
また、ファイル圧縮もできれば転送時間をより削減できます。

　・ [scp の複数同時接続](https://oxon.hatenablog.com/entry/20100128/1264645269)
　・ [大きなファイルを分割して送信し、そのあとで結合する方法](https://improve-future.com/divide-big-file-and-send-and-combine-them.html)
　・ [Object Storageのマルチパート・アップロード](https://docs.oracle.com/ja-jp/iaas/Content/Object/Tasks/usingpreauthenticatedrequests_topic-Working_with_PreAuthenticated_Requests.htm#To_put_a_large_object)
　・ [Curl で マルチパート・アップロード](https://qiita.com/shirok/items/0c891eec869f4454f4d3#-curl-%E3%81%A7-%E3%83%9E%E3%83%AB%E3%83%81%E3%83%91%E3%83%BC%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89)



### ・ 効率的な暗号アルゴリズムの選択
暗号化にはオーバーヘッドが生じ、アルゴリズムにより異なります。
scp, sftp の場合 ssh -Q cipher で使用できる暗号方式を確認し、-c オプション: 暗号アルゴリズムを選択できます。

　・ [大容量ファイルのSCP転送を高速にする方法](https://www.na3.jp/entry/20101025/p1)
　・ [次の暗号化オプションのどれがオーバーヘッド/コストを増加させるでしょうか？](https://www.jpnshiken.com/qa/ISACA.CISA.v2019-05-08.q750/%E6%AC%A1%E3%81%AE%E6%9A%97%E5%8F%B7%E5%8C%96%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E3%81%A9%E3%82%8C%E3%81%8C%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%98%E3%83%83%E3%83%89-%E3%82%B3%E3%82%B9%E3%83%88%E3%82%92%E5%A2%97%E5%8A%A0%E3%81%95%E3%81%9B%E3%82%8B%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%81%8B)
　・ [SSHの公開鍵暗号には「RSA」「DSA」「ECDSA」「EdDSA」のどれを使えばよいのか？](https://gigazine.net/news/20200828-ssh-encryption-algorithm/)



### ・ 圧縮による転送効率化
ファイル圧縮して転送サイズを縮小化し転送時間を削減します。
scp, sftpコマンドの場合 -C オプション, rsyncコマンドの場合 -z --compress でデータ圧縮して転送することもできます。

　・ [zipsplit コマンド――ZIPファイルを分割する](https://atmarkit.itmedia.co.jp/ait/articles/1809/27/news037.html)
　・ [大容量ファイルのSCP転送を高速にする方法](https://www.na3.jp/entry/20101025/p1)

Oracle の場合、クエリー・パフォーマンスの改善, ネットワーク通信量の削減などの効果が得られます。

　・ [Oracle Advanced Compression概要](https://www.oracle.com/jp/database/advanced-compression/)
 　・ [Oracle Advanced Compression ホワイトペーパー](https://www.oracle.com/technetwork/jp/database/options/compression/advanced-compression-wp-1896128-ja.pdf)
　・ [徹底解説! データベース圧縮のすべて～検証結果・事例に基づくベストプラクティス～](https://www.oracle.com/jp/a/tech/docs/technical-resources/11gadvancedcompression-handsout.pdf)


### ・ SQL処理を分割並列処理とバルク処理で高速化
SQLを直列Loop処理するようなバッチ処理は、Loopプロシージャを複数に分割して並列処理して帯域幅を有効活用するのと、バルク処理で1回のフェッチで複数の行を取得し、複数行をすばやく処理して高速化します。

**・ 処理イメージ**
![画像11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/5598c64a-d767-823f-6c27-39c4e3acb289.jpeg)
・参考: 
　- [BULK COLLECTとFORALLによるバルク処理](https://www.oracle.com/jp/database/technologies/plsql101/o52plsql.html)
　- [Linux Traffic Controlを使用してレイテンシーをシミュレートし、Oracle Databaseのフェッチ・サイズを調査する](https://blogs.oracle.com/cloud-infrastructure/post/linux-traffic-controller-latency-fetch-size-db)

### ・ 輻輳制御の新アルゴリズム TCP BBRを設定
[輻輳制御の新アルゴリズム TCP BBR を GCP に導入](https://cloud.google.com/blog/ja/products/gcp/tcp-bbr-congestion-control-comes-to-gcp-your-internet-just-got-faster?hl=ja)より〜
BBR（Bottleneck Bandwidth and Round-trip propagation time）は、Google が開発した新しい輻輳制御アルゴリズムです。ネットワークに接続されたすべてのコンピュータ、携帯電話、タブレットで実行され、データの送信速度はこれによって決まります。
BBR は、どのくらいのペースでネットワークにデータを送り出すかを決めるにあたって、そのネットワークがどれくらいの速さでデータを送り届けているかを考慮します。一定のネットワーク接続におけるネットワークの転送速度とラウンドトリップ時間の最近の測定値を用いて、その接続の帯域幅の上限と最小のラウンドトリップ遅延の両方を含むモデルを構築します。BBR はこのモデルを用いて、データの送信速度とネットワークに流し込むデータ量の上限を常に制御します。
BBR の導入により、従来の輻輳制御アルゴリズムである CUBIC と比べて Cloud サービス間のスループットは向上し、レイテンシは低くなって、サービスが快適に使えるようになりました。

**・ 設定方法**
BBR と BBR に必要な [FQペーシング](https://groups.google.com/g/bbr-dev/c/4jL4ropdOV8)を設定します
**1) 事前確認**
```
# cat /proc/sys/net/ipv4/tcp_congestion_control
    cubic
```

**2) BBR設定**
```
# vi /etc/sysctl.conf
# cat /etc/sysctl.conf
    net.core.default_qdisc=fq
    net.ipv4.tcp_congestion_control=bbr
# sysctl -p
```
**3) BBR設定確認**
```
# cat /proc/sys/net/core/default_qdisc
    fq_codel

# cat /proc/sys/net/ipv4/tcp_congestion_control
    bbr
```

# ■ クラウドサービスでの考慮
## ● クラウドサービス機能でのレイテンシー削減
各クラウド・プロバイダーでレイテンシを考慮するポイントは、作成するシステム構成図の各アイコン単位にノード・レイテンシがあると考えることができます。
![画像サービス02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/b7a4bd16-e1d0-7a92-0dce-0b0624715adf.png)




**(1) Availability Domain(AD)/Availability Zones(AZ)**
複数ある AD もしくは AZ間は距離が離れているため、接続するAD/AZによりレイテンシは異なります。
　　・[AWS東京リージョンと大阪リージョンのAZ間レイテンシを比較してみた](https://www.accenture.com/jp-ja/blogs/technology-diaries/measuring-latency-among-availability-zones-of-aws-january-2022)
　　・[OCI-Azure Interconnectを使用したネットワーク・レイテンシとベスト・プラクティス](https://blogs.oracle.com/oracle4engineer/post/ja-network-latency-oci-azure-best-practices)

また、クラウド・プロバイダによってはレイテンシーを削減するための AZ があります
　　・[AWS Local Zones](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.RegionsAndAvailabilityZones.html)

**(2) Gateway**
各クラウド・プロバイダーの Gatewayは複数ある場合はそれぞれ追加されるレイテンシが異なる場合や高速化するための追加オプションがある場合があります。
　　・参考: [Virtual Network Gateway Ultra Performance](https://learn.microsoft.com/ja-jp/azure/expressroute/expressroute-about-virtual-network-gateways)

**(3) Cloud 専用ネットワーク接続**
クラウド・プロバイダーによって、高速化するオプションがある場合があります。
　　・参考: [ExpressRoute FastPath](https://learn.microsoft.com/ja-jp/azure/expressroute/about-fastpath)
  
**(4) Compute**
コンピュートのネットワークを高速化するオプションがある場合があります。
　　・参考: [AWS: Enhanced networking on Linux](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/enhanced-networking.html)
　　　　 　 [Azure: 高速ネットワークの概要](https://learn.microsoft.com/ja-jp/azure/virtual-network/accelerated-networking-overview?tabs=redhat)
　　　　 　 [Google Cloud: VM ごとの Tier_1 ネットワーキング パフォーマンスを構成する](https://cloud.google.com/compute/docs/networking/configure-vm-with-high-bandwidth-configuration?hl=ja#create-high-bandwidth-vms)
　　　　 　 [Oracle Cloud: コンピュート・インスタンスのネットワーク起動タイプ](https://docs.oracle.com/ja-jp/iaas/Content/Compute/Tasks/recommended-networking-launch-types.htm)

これらの考慮ポイントにより、Azure と Oracle Cloud Infrastructure(OCI)接続で、2ms未満のレイテンシを実現できます。

・参考: [Oracle Interconnect for Azure を FastPathと高速ネットワークで相互接続して](https://qiita.com/shirok/items/1b1b2249d23ea79c6351)

https://qiita.com/shirok/items/1b1b2249d23ea79c6351

# ■ レイテンシ(遅延)の机上計算
コンピュート間のレイテンシは、距離に比例します。
レイテンシに影響ある要素は、ワイヤー長(距離)と通過ノードです。
データセンター(Data Center: DC) 間を光ファイバー・ケーブルで接続されている場合、光ファイバー ケーブルは、ユーザーとデータセンターの間で直接的につながっているわけではありません。ファイバー・ケーブル上の光は、その経路に沿ってノード(機器)を通過します。

　・参考: [光遅延計算](http://mobile.shinsv.mydns.jp/calc/delay/)

そのため、ワイヤー長は綺麗な直線ではなく迂回もされているため、ノード・レイテンシ含めると 実際のレイテンシは、1.5 倍程度はありそうだと考えることができます。
実際に Oracle Cloud の Tokyo Region と Osaka Regionを Googleマップで距離を調べて机上計算してみてみます。

## ● 光ファイバーの速さ
光速は、1秒間に地球を7周半回ることができる速さで、単に「光速」と言うとき、真空中の光速を示します。
光ファイバー中は光は全反射を繰り返して伝搬するため、直線距離より伸びます。そのため、一般的な真空中の速度 約30万Km/秒 の 2/3 の 約20万Km/秒 の速度になります

　・参考: 
　　- [光速](https://ja.wikipedia.org/wiki/%E5%85%89%E9%80%9F)
　　- [光遅延計算](http://mobile.shinsv.mydns.jp/calc/delay/)


## ● 机上計算
**1) Google Mapで距離計測**
Oracle Cloud Region の データセンターは所在が公開されていないため、FastConnect Location間の距離を Google Mapで計測してみます。
Oracle FastConnectのロケーションは[ここ](https://www.oracle.com/jp/cloud/networking/fastconnect/providers/#apac)から確認できます。

・参考: [Oracle FastConnectのロケーション](https://www.oracle.com/jp/cloud/networking/fastconnect/providers/#apac)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/59d84e5b-fd6f-18a3-d8a1-ef2077f73bd3.png)
距離は約500Kmであることを確認できます。

**2) 往復遅延時間(RTT)計算**

RTT （Round Trip Time）の計算は次になります。
```:式
ワイヤー長(距離) / 光ファイバー速度 x 往復 = 往復遅延時間(RTT)
```
Google Mapの距離と光ファイバー速度から次のように計算できます。
　　・ ワイヤー長(距離)= 500 Km
　　・ 光ファイバー速度 = 200,000 km/s
```:計算実行
500 km / 200,000 km/s x 2 = 0.005 (秒)
　　　　　　　　　　　　　　   = 5 (ms)
```

また、ここのWebから計算することもできます。

・参考: [光遅延計算](http://mobile.shinsv.mydns.jp/calc/delay/)

**3) 迂回経路とノード・レイテンシー考慮**
迂回経路とノード・レイテンシー考慮すると、1.5倍はありそうだと考えてみます。
```:迂回経路とノード・レイテンシー考慮
　5 ms x 1.5倍 = 7.5 ms
```
**4) FastClnnect Location から Oracle Cloud Region間考慮**
FastClnnect Location のデータ・センターから OCI Region間のレイテンシーを 1ms未満 とすると、東京と大阪2つ合わせて、1 ~ 2 ms程度のレイテンシが追加されると考えられます。

```: FastConnect Location ~ OCI Region 間レイテンシー追加
　7.5 ms + 1 ms = 8.5 ms
```

## ● 確認
Oracle CloudでのRegion間レイテンシーは OCI コンソールで確認できます。
**1) OCIコンソール**
[ネットワーキング] > [リージョン間のレイテンシ]をクリック

![OCIコンソール01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/4ab0d96e-fbd3-3b33-3f6d-61b5dc76c5bd.jpeg)

**2）リージョン間のレイテンシ画面**
レイテンシを確認したいリージョン、Tokyo と Osakaを入力し、[Show]をクリック
![OCIコンソール02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/f4e94156-3b7b-a38f-9751-19eb5d4e1d97.jpeg)
結果は、8.1 ms で 理想的な机上計算の結果となりました。

## ● サイト/リージョン間レイテンシ(遅延)情報
サイト間のレイテンシを公開しているプロバイダ
　・[Azure ネットワーク ラウンドトリップ待ち時間統計](https://learn.microsoft.com/ja-jp/azure/networking/azure-network-latency?tabs=APAC%2CJapan)
　・[Equinix Latency Data](https://docs.equinix.com/en-us/Content/Interconnection/Metro-Connect/MCC-latency.htm)
　・[Megaport ネットワーク レイテンシ](https://www.megaport.com/ja/network-latency/)
　・[Oracle Cloud Public Cloud Regions](https://www.oracle.com/cloud/public-cloud-regions/)
 
# ■ ネットワーク・パフォーマンスの測定
## ● レイテンシ(遅延)測定
[クラウドでのネットワーク レイテンシの測定](https://cloud.google.com/blog/ja/products/networking/using-netperf-and-ping-to-measure-network-latency?hl=ja)より、
ネットワークのRTTレイテンシを測定するツールには ping、iperf、netperf などがありますが、すべてが同じように実装、構成されるわけではないため、ツールによって結果が異なる場合があります。ほとんどの場合、この質問に対する代表的な回答が得られるツールは、netperf であると考えられます。 
ping は測定に ICMP パケットを使用し、nping、hping、TCPing などの ping をベースとするツールは TCP パケットを使用します。
レイテンシ テストを実施する際に忘れてはならないのは、間隔やその他のツールの設定を記録、報告することです。特にレイテンシが低い場合は、間隔が大きな違いをもたらすからです。 pingの場合、 [-i 0.001 オプション](https://www.server-memo.net/tips/command/ping/ping.html#toc8)で間隔を netperfと同じ μs単位にすることができます。

また、[Azure VM 間の RTT 測定に ICMP を使ってはいけない](https://qiita.com/tokawa-ms/items/bf0784fd00cbe88d8663)より、Virtual Machines の RTT 測定には、Datacenter 内のネットワーク高速化の仕組み上、TCP/UDP かつ、実際に到達できるポートに対する通信を利用する必要があります。


**・Netperf 実演デモ**

https://qiita.com/shirok/items/f5083a90d1ba81563c9d

**・SockPerf 実演デモ**

https://qiita.com/shirok/items/75aacc8d0121c76447f1

::: note info
How to measure network latency for Oracle Database applications in OCI (Doc ID 3008087.1)より、Oracle Databaseへのレイテンシ測定では、SQL と「set Timing on」を使用して RTT を測定することは不適切であり、よく知られたユーティリティ tnsping も使用すべきではありません。 これらの方法はいずれも、RTT を正確に測定したり、必要な精度で測定したりすることはできません。
:::
## ● スループット(帯域幅)測定
[iperf3](https://iperf.fr/) は、TCP / UDP データ ストリーム（シングルスレッドまたはマルチスレッド）を作成し、伝送するネットワークのスループットを測定できるネットワーク テストツールです。
一方のインスタンスをサーバー、もう一方のインスタンスをクライアントとして実行します。

・参考: [ネットワーク スループットを測定するためのツールの概要](https://cloud.google.com/network-connectivity/docs/interconnect/tutorials/calculate-network-throughput-over-interconnect?hl=ja)
・実演デモ

https://qiita.com/shirok/items/7362abd6edfebccff2f7



# ■ 必要レイテンシ(遅延)値の事前策定
コンピューターの距離により遅延、帯域が変わり、データ転送などの時間が変わることがあります。
tcコマンド(Traffic Control)を使用して、ネットワークのレイテンシ(遅延)とスループット(帯域幅)を制御してテストすることで、既存の処理に影響が出るか、どのくらいのネットワーク・パフォーマンスが必要か確認することができます。
ということで、tcコマンドで、遅延、帯域が制御できるか確認してみてみます。

・実演デモ

https://qiita.com/shirok/items/f57e0ecd86abec33a087

・参考: [Linux Traffic Controlを使用してレイテンシーをシミュレートし、Oracle Databaseのフェッチ・サイズを調査する](https://blogs.oracle.com/cloud-infrastructure/post/linux-traffic-controller-latency-fetch-size-db)
# ■ 参考情報

**・TCP関連**
　- [ネットワーク遅延対策技術](https://thinkit.co.jp/story/2011/08/23/2239)
　- [ネットワーク遅延と高速化](https://gihyo.jp/admin/serial/01/net_prac_tech/0002)
　- [TCP window size とは](https://milestone-of-se.nesuke.com/nw-basic/tcp-udp/window-size-mss-mtu/)
　- [TCP window size の仕組み](https://milestone-of-se.nesuke.com/nw-basic/tcp-udp/window-size-mss-mtu/)
　- [TCP Window Control / Flow Control](https://www.infraexpert.com/study/tcpip11.html)
　- [問題: レイテンシと TCP の動作](https://cloud.google.com/compute/docs/networking/tcp-optimization-for-network-performance-in-gcp-and-hybrid?hl=ja)
　- [Difference between TCP window size & MTU](https://jaanhio.me/blog/tcp-window-size-mtu/)
　- [HPCユーザが知っておきたいTCP/IPの話](https://archive.xsig.ipsj.or.jp/history/SACSIS/2009/SACSIS2009_TCP.pdf)
　- [レイテンシとは？ ネットワーク性能指標の概要と改善方法を解説](https://baremetal.jp/blog/2022/02/02/1154/)


**・MTU関連**
　- [TCP window size の仕組み〜MSS(MTU)との違い](https://milestone-of-se.nesuke.com/nw-basic/tcp-udp/window-size-mss-mtu/)
　- [Path MTU Discovery](https://www.infraexpert.com/info/5.2adsl.htm)
　- [ICMP Type / Code](https://www.infraexpert.com/info/5.0adsl.htm)
　- [ハングしている接続 MTU問題と解決策](https://docs.oracle.com/ja-jp/iaas/Content/Network/Troubleshoot/connectionhang.htm)


**・光通信関連**
　- [光速](https://ja.wikipedia.org/wiki/%E5%85%89%E9%80%9F)
　- [光遅延計算](http://mobile.shinsv.mydns.jp/calc/delay/)
　- [SINET5で変わる長距離高速通信テクニック](https://www.sinet.ad.jp/static/c2795209c6078e797a06d72c52e1d093/advnet2016_2_2_yamanaka.pdf)
　- [波長分割多重(WDM,CWDM,DWDM)とは](https://www.fiberlabs.co.jp/tech-explan/about-wdm/)
　- [WDMとは？伝送の仕組みやCWDMとDWDMの違いを解説](https://www.dyden.jp/network/library/wdm/)


**・Azure**
　- [Azure ネットワーク ラウンドトリップ待ち時間統計](https://learn.microsoft.com/ja-jp/azure/networking/azure-network-latency?tabs=APAC%2CJapan)
　- [Oracle Cloud Public Cloud Regions](https://www.oracle.com/cloud/public-cloud-regions/)


**・Google**
　- [レイテンシと TCP の動作](https://cloud.google.com/compute/docs/networking/tcp-optimization-for-network-performance-in-gcp-and-hybrid?hl=ja)
　- [レイテンシの測定](https://cloud.google.com/load-balancing/docs/tutorials/optimize-app-latency?hl=ja)
　- [ネットワーク パフォーマンスの TCP 最適化](https://cloud.google.com/compute/docs/networking/tcp-optimization-for-network-performance-in-gcp-and-hybrid?hl=ja)
　- [クラウドでのネットワーク レイテンシの測定](https://cloud.google.com/blog/ja/products/networking/using-netperf-and-ping-to-measure-network-latency?hl=ja)
　- [ネットワーク スループットを測定するためのツールの概要](https://cloud.google.com/network-connectivity/docs/interconnect/tutorials/calculate-network-throughput-over-interconnect?hl=ja)

 
**・Mac OS**
　- [Mac OSXのチューニング](https://fasterdata.es.net/host-tuning/osx/)


**・ORACLE**
　- [ネットワーク・パフォーマンス](https://docs.oracle.com/ja-jp/iaas/Content/Network/Concepts/networkperformance.htm)
　- [TCPソケット・バッファ・サイズの設定](https://docs.oracle.com/cd/F19136_01/haovw/plan-oracle-data-guard-deployment.html#GUID-8B35E191-38E8-4E7F-B405-FA3AE0291C50)
　- [REDOデータ転送のネットワーク調整](https://docs.oracle.com/cd/F19136_01/sbydb/troubleshooting-oracle-data-guard.html#GUID-5B879B01-2433-4B08-8D58-E91DBA58FEF7)
　- [パフォーマンスの最適化](https://docs.oracle.com/cd/F19136_01/netag/optimizing-performance.html#GUID-FC114CA9-4166-4195-8EFD-DB4FE8733D3F)
　- [帯域幅遅延積の求め方](https://docs.oracle.com/cd/F19136_01/netag/optimizing-performance.html#GUID-E55C75B9-0678-4F17-BFBC-97FCBC004E2F)
　- [How to measure Network Latency for Oracle Data Guard Replication](https://database-heartbeat.com/2022/05/02/latency_dg/)
　- [Oracle Linux: システム・パフォーマンスを制御するパラメータ](https://docs.oracle.com/cd/F22978_01/osmanage/osmanage-ConfiguringSystemSettings.html#ol-perfparm-sysctl)
　- [Doc ID 2064368.1: Assessing and Tuning Network Performance for Data Guard and RMAN](https://support.oracle.com/portal/)
　- [Linux Traffic Controlを使用してレイテンシーをシミュレートし、Oracle Databaseのフェッチ・サイズを調査する](https://blogs.oracle.com/cloud-infrastructure/post/linux-traffic-controller-latency-fetch-size-db)
　- [Oracle Advanced Compression概要](https://www.oracle.com/jp/database/advanced-compression/)
　- [Oracle Advanced Compression ホワイトペーパー](https://www.oracle.com/technetwork/jp/database/options/compression/advanced-compression-wp-1896128-ja.pdf)
　- [徹底解説! データベース圧縮のすべて～検証結果・事例に基づくベストプラクティス～](https://www.oracle.com/jp/a/tech/docs/technical-resources/11gadvancedcompression-handsout.pdf)
　- [Doc ID 3008087.1: How to measure network latency for Oracle Database applications in OCI](https://support.oracle.com/portal/)


**・Redhat**
　- [レイテンシーの影響を受けやすいアプリケーションとは](https://www.redhat.com/ja/topics/edge-computing/latency-sensitive-applications)
　- [高スループットのための TCP 接続のチューニング](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/9/html/monitoring_and_managing_system_status_and_performance/tuning-tcp-connections-for-high-throughput_tuning-the-network-performance)

**・ファイル転送ソフトウェア**
　　- [FTPでスループット計測するときの注意事項](https://gihyo.jp/admin/serial/01/net_prac_tech/0001)
　　- [scp の複数同時接続](https://oxon.hatenablog.com/entry/20100128/1264645269)
　　- [大容量ファイルのSCP転送を高速にする方法](https://www.na3.jp/entry/20101025/p1)
　　- [大きなファイルを分割して送信し、そのあとで結合する方法](https://improve-future.com/divide-big-file-and-send-and-combine-them.html)
　　- [zipsplit コマンド――ZIPファイルを分割する](https://atmarkit.itmedia.co.jp/ait/articles/1809/27/news037.html)
　　- [Object Storageのマルチパート・アップロード](https://docs.oracle.com/ja-jp/iaas/Content/Object/Tasks/usingpreauthenticatedrequests_topic-Working_with_PreAuthenticated_Requests.htm#To_put_a_large_object)
　　- [Curl で マルチパート・アップロード](https://qiita.com/shirok/items/0c891eec869f4454f4d3#-curl-%E3%81%A7-%E3%83%9E%E3%83%AB%E3%83%81%E3%83%91%E3%83%BC%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89)
　　- [次の暗号化オプションのどれがオーバーヘッド/コストを増加させるでしょうか？](https://www.jpnshiken.com/qa/ISACA.CISA.v2019-05-08.q750/%E6%AC%A1%E3%81%AE%E6%9A%97%E5%8F%B7%E5%8C%96%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E3%81%A9%E3%82%8C%E3%81%8C%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%98%E3%83%83%E3%83%89-%E3%82%B3%E3%82%B9%E3%83%88%E3%82%92%E5%A2%97%E5%8A%A0%E3%81%95%E3%81%9B%E3%82%8B%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%81%8B)
　　- [SSHの公開鍵暗号には「RSA」「DSA」「ECDSA」「EdDSA」のどれを使えばよいのか？](https://gigazine.net/news/20200828-ssh-encryption-algorithm/)



**・データセンター間レイテンシ情報**
　- [Azure ネットワーク ラウンドトリップ待ち時間統計](https://learn.microsoft.com/ja-jp/azure/networking/azure-network-latency?tabs=APAC%2CJapan)
　- [Equinix Latency Data](https://docs.equinix.com/en-us/Content/Interconnection/Metro-Connect/MCC-latency.htm)
　- [Megaport ネットワーク レイテンシ](https://www.megaport.com/ja/network-latency/)
　- [Oracle Cloud Public Cloud Regions](https://www.oracle.com/cloud/public-cloud-regions/)

**・その他**
　- [ビット？バイト？ データ量の表し方](https://www.networld.co.jp/solution/learn_first/storage/p22_24.html)
　- [MbpsとMB/sって何が違うの？](https://www.ejworks.com/solution/detail.html?article_id=231)
　- [応用情報技術者過去問題](https://www.ap-siken.com/kakomon/24_haru/pm05.html)