如何疑難排解 Application Migration Service 的 Linux Source Server 複寫延遲或待辦項目問題?

4 分的閱讀內容
0

使用 AWS Application Migration Service 複寫資料時,我在 Linux Source Server 中發現延遲或待辦項目。

簡短描述

以下是將資料從來源伺服器複製到目標伺服器時,造成複寫延遲和待辦項目的因素:

  • 網路上行鏈路速度和頻寬可用性: 來源伺服器與複寫伺服器之間的網路連線速度可能會對複寫效能產生重大影響。緩慢的連線可能會導致複寫程序無法完成。此外,有限的頻寬會限制您在指定時間內可複寫的資料量。
  • 複寫時磁碟的變更: 在複寫程序期間,來源伺服器可能會繼續將新資料寫入其磁碟。如果來源伺服器正在寫入的新資料量激增,則資料會累積並產生大量待辦項目。AWS 複寫代理程式必須透過初始同步傳送此待辦項目。待辦項目越大,完成資料複寫所需的時間越長。
  • 儲存磁碟的 I/O 速度: 在複寫程序期間,AWS 複寫代理程式會讀取磁碟的儲存區塊,並將資料傳輸到複寫伺服器。不過,來源伺服器磁碟的讀取延遲過高可能會影響資料複寫的速度和效率。較慢的磁碟會造成延遲,而快速的磁碟可改善複寫速度。
  • 來源伺服器上的負載: 來源伺服器上的資源爭用可能會導致 CPU 使用率過高、記憶體消耗、I/O 等待或其他資源限制。例如,高 CPU 使用率可能會導致複寫瓶頸。這是因為系統難以在 AWS 複寫代理程式和其他程序之間分配 CPU 資源。同樣地,高記憶體消耗可能會導致系統將記憶體分頁交換至磁碟。這會導致 I/O 等待時間增加,並在複寫程序中減慢速度。
  • 佈建不足的複寫資源: 使用具有較低輸送量和 IOPS 的暫存 Amazon Elastic Block Store (Amazon EBS) 磁碟區可能會導致較高的讀取和寫入延遲以及高佇列長度。所有這些問題都會影響複寫效能。此外,具有低網路輸送量和 Amazon EBS 頻寬的複寫伺服器執行個體類型會導致複寫效能問題。

解決方案

若要判斷延遲的基本原因,請先在來源伺服器上執行檢查。然後,對暫存區域執行檢查。

來源伺服器檢查

確認來源伺服器已啟動並執行

確定遷移的來源伺服器已啟動並執行。

確認來源伺服器可以與地區性應用程式遷移服務 API 端點和複寫伺服器建立 SSL 連線

請確定在任何時間點都不會攔截和變更來源伺服器與應用程式遷移服務 API 端點之間的 SSL 憑證。而且,請確定來源伺服器與複寫伺服器之間不會攔截和變更 SSL 憑證。若要這麼做,請執行下列命令:

# echo -n | openssl s_client -connect mgn.<region>.amazonaws.com:443
# echo -n | openssl s_client -connect <replication server IP>:1500

注意:使用下列驗證作用中的 TCP 連線區段中列出的命令,尋找複寫伺服器的 IP 地址。

確認所有 AWS 複寫代理程式程序都正在執行

執行下列命令以列出執行中的 AWS 複寫代理程式服務:

# ps -u aws-replication

下列輸出顯示必須執行的 AWS 複寫代理程式程序:

 PID  TTY TIME    CMD
 30878 ? 00:00:00 update_onprem_v
 30879 ? 00:00:00 run_linux_migra
 30880 ? 00:00:00 tailer
 30881 ? 00:04:45 java
 30902 ? 00:00:01 tailer
 30904 ? 00:00:00 run_linux_migra
 30905 ? 00:00:10 update_onprem_v
 31023 ? 00:00:00 tail

驗證作用中的 TCP 連線

執行下列命令,以確認 TCP 連接埠 1500 上與複寫伺服器建立了五個作用中的 TCP 連線。

# sudo netstat -anp | awk '$5 ~ /:1500$/ {print}'

檢查作用中連線的命令輸出:

tcp6       0      0 172.31.1.39:54814       172.31.0.82:1500        ESTABLISHED 30881/java          
tcp6       0      0 172.31.1.39:54828       172.31.0.82:1500        ESTABLISHED 30881/java          
tcp6       0      0 172.31.1.39:54832       172.31.0.82:1500        ESTABLISHED 30881/java          
tcp6       0      0 172.31.1.39:54812       172.31.0.82:1500        ESTABLISHED 30881/java          
tcp6       0      0 172.31.1.39:54800       172.31.0.82:1500        ESTABLISHED 30881/java

檢查執行 AWS 複寫代理程式之 CPU 核心的 CPU 使用率

AWS 複寫代理程式是一種單執行緒程序,一次只能在一個 CPU 核心上運作。如果執行 AWS 複寫代理程式的核心 CPU 使用率很高,則資料複寫速度會變慢。

1.    執行下列命令,然後檢閱輸出以判斷下列項目:

  • AWS 複寫代理程式的程序 ID。
  • 它正在執行的 CPU 核心 (由 psr表示)。
# ps --pid $(pidof /var/lib/aws-replication-agent/jre/bin/java) -o psr,pid,comm

# mpstat -P <psr column value> 3

2.    然後,檢查識別的 CPU 核心的 CPU 使用率。

檢查來源伺服器上的磁碟效能

如果來源磁碟上的讀取輸送量 (rMB/s) 低,則讀取和複寫的資料較少。記下 IO 深度 (avgqu-sz)I/O 等待(await) 指標的任何增加。您可以使用 sariostat 工具來測量磁碟讀取輸送量:

# iostat -myx 3
# sar -dp 2

檢查來源伺服器是否出現寫入作業高峰

來源伺服器中的寫入作業高峰可能會導致複寫延遲增長。這種增長會持續到 AWS 複寫代理程式將所有寫入資料排清到複寫伺服器為止。定期執行 iostat 測試,以判斷工作負載變更時的 I/O 負載。如果寫入輸送量 (wMB/s) 超過可用的網路輸送量,您會看到複寫延遲。

**注意:**若要計算從來源伺服器到複寫伺服器的所需頻寬,請參閱計算 TCP 連接埠 1500 所需的頻寬

檢查來源伺服器到暫存區子網路的複寫速度和可用頻寬

1.    在您的目標 AWS 區域中,使用發佈 AMI CE-ssl-speedtest啟動測試 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體。EC2 執行個體必須與複寫伺服器的執行個體類型相同。

2.    選取與來源伺服器複寫設定中使用的子網路相同的子網路。

3.    確定安全群組允許 TCP 連接埠 1500 傳入存取。

4.    如下列範例所示,在來源伺服器上設定 SpeedTest CLI:

# cd /tmp
# git clone https://github.com/librespeed/speedtest-cli.git
# cd speedtest-cli/
# ls -l
# ./build.sh
# cat << EOF >> ./servers.json
[
  {
    "id": 1,
    "name": "PHP Backend",
    "server": "https://<test server private IP>:1500/speedtest/",
    "dlURL": "/garbage.php",
    "ulURL": "/empty.php",
    "pingURL": "/empty.php"
  }
 ]
EOF

**注意:**在上述範例中,請確定取代測試伺服器的 IP 地址。如果您使用測試伺服器的公有 IP 進行速度測試,請在 "pingURL" 行之後加入 "getIpURL": "/getIP.php"

5.    如下列範例所示,執行 LibreSpeed CLI 以測試複寫速度:

# ./out/librespeed-cli-linux-amd64 —local-json ./servers.json —server 1 —no-icmp —skip-cert-verify —simple
Ping: 11.00 ms Jitter: 0.00 ms
Download rate: 503.84 Mbps
Upload rate: 493.56 Mbps

檢查未正常關閉的來源伺服器

如果來源伺服器未正常關閉,則 AWS 複寫代理程式會在伺服器重新啟動後重新掃描所有磁碟。AWS 複寫代理程式會重新讀取磁碟,延遲會持續增加,直到重新掃描完成為止。如需詳細資訊,請參閱哪些 Windows 和 Linux 作業系統在重新開機時支援不重新掃描?

檢查是否有核心升級

如果在來源伺服器上升級核心並重新啟動伺服器,則 AWS 複寫代理程式無法執行。執行中的核心版本與代理程式安裝期間編譯 AWS 複寫代理程式驅動程式所用的核心版本相符。

執行下列命令以確認執行中的核心版本是否符合 AWS 複寫代理程式驅動程式編譯的核心版本:

$ uname -r
$ modinfo -F vermagic /var/lib/aws-replication-agent/aws-replication-driver.ko

**注意:**vermagic 用於驗證核心驅動程式編譯的核心版本。

確認 TCP 連接埠 1500 未封鎖傳出

請確定 TCP 連接埠 1500 未封鎖從來源伺服器傳出至複寫伺服器的傳出。

檢閱 MGN 代理程式日誌

檢查 MGN 代理程式日誌是否有 TCP 連接埠 1500 上複寫伺服器的任何連線問題。此外,檢查指出頻繁連線中斷的複寫異常情況。找出這些問題後,檢閱網路拓撲以進一步調查。

確認中繼裝置沒有較低的 MTU

確認複寫路徑中沒有任何中繼裝置的 MTU 較低。較低的 MTU 會降低複寫速度並造成程序延遲。最佳實務是在整個複寫路徑中維持一致的 MTU 大小。如果路徑中的裝置具有較低的 MTU,則將其更新或更換為較高的 MTU 裝置。

**注意:**如果您透過公用網際網路進行複寫,請確定 MTU 為 1500。1500 是網際網路閘道、對等互連和 VPN 支援的最大值。大型訊框只能在 Amazon Virtual Private Cloud (Amazon VPC) 或 AWS Direct Connect 中使用,並且有其本身的限制。如需詳細資訊,請參閱下列內容:

確認在來源伺服器的複寫設定中關閉了網路頻寬限流

必須在來源伺服器的複寫設定中關閉頻寬限流。

在來源伺服器中開啟頻寬限流會限流 AWS 複寫代理程式的資料傳輸速率。如果來源伺服器上有待辦項目,這可能會導致持續或停滯延遲的成長。若要維持持續且有限的頻寬以進行資料傳輸,請開啟網路頻寬限流。

若要檢查頻寬限流,請完成以下步驟:

1.    開啟應用程式遷移服務主控台

2.    選擇來源伺服器,然後選取來源伺服器。

3.    選擇複寫設定索引標籤。

3.    如果限流網路頻寬已開啟,請確定限流值等於或大於資料複寫所需的頻寬。如需詳細資訊,請參閱前一節中的注意事項:檢查來源伺服器是否出現寫入作業高峰

暫存區域資源檢查

確認 TCP 連接埠 1500 未封鎖傳入

確定複寫伺服器的安全群組中未封鎖 TCP 連接埠 1500 的傳入。

**注意:**您必須在 Amazon Elastic Compute Cloud (Amazon EC2) 主控台中完成下列步驟。

1.    開啟 Amazon EC2 主控台

2.    選取連結至複寫器執行個體的安全群組。

3.    確認連結的安全群組上允許傳入 TCP 連接埠 1500。

檢查 NetworkIn CloudWatch 指標

如果複寫伺服器的 NetworkIn Amazon CloudWatch 指標接近頻寬限制,則可能會發生限流。限流會導致複寫速度變慢和延遲增加。請考慮升級至可處理所需頻寬的較大執行個體類型。

檢查複寫伺服器的 EBS 磁碟區的彙總輸送量和 IOPS

如果 Amazon Elastic Block Store (Amazon EBS) 磁碟區的彙總輸送量和 IOPS 超出限制,則複寫伺服器效能可能會受到限流。如果發生限流,請變更複寫伺服器執行個體類型,以滿足您的複寫需求,並在不受限流的情況下維持效能。最佳實務是針對複寫伺服器使用最新一代的 EBS 最佳化執行個體類型。在不支援 EBS 最佳化輸送量的執行個體上,網路流量會與執行個體和 EBS 磁碟區之間的流量爭用。在 EBS 最佳化執行個體上,這兩種類型的流量會分開保持不同。監控複寫伺服器網路和 EBS CloudWatch 指標。如需詳細資訊,請參閱下列內容:

監控所有複寫 EBS 磁碟區的指標

當複寫伺服器的磁碟區寫入速度無法符合來源伺服器上的變更速率時,延遲和待辦項目會累積。若要避免複寫延遲,請使用具有較高 IOPS 和頻寬的更快速磁碟區類型。為了獲得最佳效能 EBS 磁碟區效能,最佳實務是監控每個複寫 EBS 磁碟區的 CloudWatch 指標

檢查從快照建立的 EBS 磁碟區

具有從快照建立 EBS 磁碟區的複寫伺服器可能會在第一次存取每個區塊時增加 I/O 作業延遲。此延遲可能會導致延遲增長或停滯,直到重新掃描程序完成。如需詳細資訊,請參閱從快照初始化磁碟區時注意效能降低

驗證目標區域中的快照配額

確保您的 AWS 帳戶在複寫來源伺服器的 AWS 區域中未達到快照配額限制。使用下列 AWS Command Line Interface (AWS CLI) 命令來確認是否已達到該區域的快照配額。在下列範例中,將 region 取代為您的目標 AWS 區域:

# aws service-quotas get-service-quota --service-code ebs --quota-code L-309BACF6 --region region --query "Quota.Value"
# aws ec2 describe-snapshots --owner-ids self --region region --query "length(Snapshots)"

**注意:**如果您在執行 AWS CLI 命令時收到錯誤訊息,請確定您使用的是最新版本的 AWS CLI

相關資訊

識別使用 AWS 應用程式遷移服務時的複寫瓶頸

AWS 官方
AWS 官方已更新 1 年前