為什麼在將 Amazon RDS for PostgreSQL 執行個體升級到版本 11 或更高版本之後,每五分鐘就會看到寫入延遲激增?

2 分的閱讀內容
0

我已將 Amazon Relational Database Service (Amazon RDS) for PostgreSQL 升級到版本 11 或更高版本。我每五分鐘就會在 Amazon CloudWatch 中看到寫入延遲激增。

解決方法

使用閒置 Amazon RDS for PostgreSQL 執行個體時,您可能會注意到 Amazon CloudWatch 指標寫入延遲每五分鐘就會激增。這與升級至 PostgreSQL 11 版或更新版本之後「增強型監控」指標寫入總計激增至大約 64 MB 相關。在升級之後,wal_segment_size 參數的值會變成 64 MB。這些激增在版本 10 或更早版本中可能不明顯,因為 wal_segment_size 的值是 16 MB。如需詳細資訊,請參閱 Amazon RDS – 文件歷史記錄中的 2018 年 9 月 7 日更新。

Amazon RDS for PostgreSQL 中的 archive_timeout 組態設定為 5 分鐘。透過此設定,封存程序會每五分鐘複製一次預寫日誌記錄 (WAL) 區段,以封存至 Amazon Simple Storage Service (Amazon S3)。在閒置系統中,此複製程序通常是唯一的 I/O 操作,因此此操作在 CloudWatch 圖形中可能具有明顯的優勢。但是,您可能無法在忙碌的系統中看到此模式。例如,假設您在 db.t3.small 執行個體上執行下列工作負載 30 分鐘。此範例會模擬具有 20 GB Amazon Elastic Block Store (Amazon EBS) 磁碟區的 RDS for PostgreSQL 執行個體上的忙碌系統:

#pgbench --host=$HOST --username=$USER --port=$PORT --protocol=simple  --progress=2  --client=1 --jobs=1 $DB -T 1800
#pgbench --initialize --fillfactor=90 --scale=100  --port=$PORT --host=$HOST --username=$USER $DB

使用此工作負載,您不會 CloudWatch 寫入延遲指標出現激增。

但是,假設您具有下列使用案例:

  • 您的 I/O 請求需要 10 毫秒才能完成,而其他九個 I/O 請求各需要 1 毫秒才能完成。這些請求的平均延遲的計算方式如下所示:
    平均延遲 = (10 + (9 * 1)) / 10 = 1.9 毫秒
  • 您的 I/O 請求需要 10 毫秒才能完成,而且沒有其他 I/O 請求。在這種情況下,平均延遲的計算方式如下所示:
    平均延遲 = 10 / 1 = 10 毫秒

這兩種使用案例都包含相同的 I/O 請求,需要 10 毫秒才能完成。但是,在您計算平均延遲時,慢速請求就顯得突出。這是因為第二個使用案例與慢速請求一起執行的 I/O 請求較少。如果閒置系統因為區塊大小較大而有一個慢速 I/O 請求,則只會透過此請求計算延遲。在具有多個 I/O 請求的忙碌系統中,大多數 I/O 請求的區塊大小較小,透過所有這些請求計算平均延遲。

在這些情況下,您可能會在閒置的 Amazon RDS for PostgreSQL 系統中每五分鐘看到寫入延遲激增一次。如果您的資料庫執行個體執行忙碌的工作負載,您可能看不到這些激增。

**範例:**假設您有兩個 t2.small Amazon Elastic Compute Cloud (Amazon EC2) 執行個體,每個執行個體都有八個 gp2 磁碟區。

在 crontab 上執行下列命令。此命令每五分鐘在第一個 Amazon EC2 執行個體中建立一個區塊大小為 64 MB 的 64 MB 檔案:

*/5 * * * * dd if=/dev/zero of=/tmp/big_file.txt bs=64MB count=1 oflag=dsync ; rm -rf /tmp/big_file.txt

注意: 將命令中的 big_file.txt 取代為您的檔案名稱。

此外,在 crontab 上執行下列命令。此命令每一分鐘在第二個 Amazon EC2 執行個體中建立 100 個區塊大小為 8 KB 的檔案:

* * * * * for i in {1..100} ; do dd if=/dev/zero of=/tmp/small_file.txt bs=8k count=100 oflag=dsync ; rm -rf /tmp/small_file.txt ; done

注意: 將命令中的 small_file.txt 取代為您的檔案名稱。

您可能會注意到,第二個 EC2 執行個體在 CloudWatch 中顯示的寫入器延遲激增高於第一個 EC2 執行個體。

相關資訊

使用 PostgreSQL 的最佳實務

AWS 官方
AWS 官方已更新 9 個月前