PostgreSQL 15: stats collector程式最佳化掉了
PostgreSQL 15: stats collector程式最佳化掉了
PG15對統計進行了重大改進。將stats collector程式最佳化掉了,不再將統計資料放入臨時檔案中,而是放到共享記憶體中,在shutdown前由checkpoint程式將其持久化,啟動時由startup程式將其載入。減少了IO和程式間通訊,從而改進效能。
正文
嘗試使用 PG15的使用者都會發現有一個後臺程式消失了:
postgres 1710 1 0 04:03 ? 00:00:00 /usr/pgsql-15/bin/postmaster -D /var/lib/pgsql/15/data/ postgres 1711 1710 0 04:03 ? 00:00:00 postgres: logger postgres 1712 1710 0 04:03 ? 00:00:00 postgres: checkpointer postgres 1713 1710 0 04:03 ? 00:00:00 postgres: background writer postgres 1715 1710 0 04:03 ? 00:00:00 postgres: walwriter postgres 1716 1710 0 04:03 ? 00:00:00 postgres: autovacuum launcher postgres 1717 1710 0 04:03 ? 00:00:00 postgres: logical replication launcher
PG14及其之前的版本:
postgres 1751 1 0 04:04 ? 00:00:00 /usr/pgsql-14/bin/postmaster -D /var/lib/pgsql/14/data/ postgres 1752 1751 0 04:04 ? 00:00:00 postgres: logger postgres 1754 1751 0 04:04 ? 00:00:00 postgres: checkpointer postgres 1755 1751 0 04:04 ? 00:00:00 postgres: background writer postgres 1756 1751 0 04:04 ? 00:00:00 postgres: walwriter postgres 1757 1751 0 04:04 ? 00:00:00 postgres: autovacuum launcher postgres 1758 1751 0 04:04 ? 00:00:00 postgres: stats collector postgres 1759 1751 0 04:04 ? 00:00:00 postgres: logical replication launcher
是的, “stats collector”消失了。主要瓶頸一去不復返了。
Stats collector程式作用?
新手使用者可能想知道這個程式是什麼?為什麼 PG14及之前版本需要。有一些使用者可能還會和對用於查詢計劃的表級統計資訊採集(ANALYZE)感到迷惑。但這是不同的。PG跟蹤每個程式的所有活動以獲得累積統計資訊,例如掃描表或索引的次數,或者最後一次vacuum或自動vacuum在表上的執行時間,或者自動vacuum在表上執行次數。所有資訊統計收集的資料可以透過不同的pg_stat_*檢視獲得。
有什麼問題?
會話的每個後臺程式都是一個獨立的 PG程式,採集統計資訊和傳輸不是一個簡單的任務。每個後臺程式將他們的活動資訊傳送給單獨的“stats collector”程式。透過UDP包進行通訊。這種方法有很多問題,不是一個可擴充套件的模型。使用者經常報告不同型別的問題,如1)過時的統計資訊,2)stats collector未執行,3)autovacuum無法工作/啟動等。
如果 stats collector在某一個機器上發生問題,很難解釋理解出了什麼問題。
Stats collector另一個缺點是它引起的IO。如果啟用DEBUG級別2,可以在日誌中看到:
2022-08-22 03:49:57.153 UTC [736] DEBUG: received inquiry for database 0 2022-08-22 03:49:57.153 UTC [736] DEBUG: writing stats file "pg_stat_tmp/global.stat" 2022-08-22 03:49:57.153 UTC [736] DEBUG: writing stats file "pg_stat_tmp/db_0.stat" 2022-08-22 03:49:57.168 UTC [1278] DEBUG: autovacuum: processing database "postgres" 2022-08-22 03:49:57.168 UTC [736] DEBUG: received inquiry for database 13881 2022-08-22 03:49:57.168 UTC [736] DEBUG: writing stats file "pg_stat_tmp/global.stat" 2022-08-22 03:49:57.168 UTC [736] DEBUG: writing stats file "pg_stat_tmp/db_13881.stat" 2022-08-22 03:49:57.169 UTC [736] DEBUG: writing stats file "pg_stat_tmp/db_0.stat"
可能導致資料目錄所在的掛載點產生大量 IO。由引數stats_temp_directory控制,許多系統上將pg_stat_tmp位於資料目錄中。在ubuntu/debian上位於/var/run/postgresql,例如:
postgres=# show stats_temp_directory ; stats_temp_directory ----------------------------------------- /var/run/postgresql/14-main.pg_stat_tmp (1 row)
PG15新功能
現在,統計資訊不再使用檔案和檔案系統,而是使用動態共享記憶體 。可以參考 Andres Freund的commit摘要:
以前, stats collector透過UDP接收統計更新,並透過定期將統計資料寫入臨時檔案來共享統計資料。這些檔案可以達到數十兆位元組,冰箱每秒最多寫入2次。這就一再阻止我們新增其他有用的統計資料。
現在統計資料儲存在共享記憶體。 variable-numbered物件統計資訊儲存在以dshash雜湊表中(動態共享記憶體)。Fixed-numbered統計儲存在普通共享記憶體中。
Pgstat.c的標頭檔案中有架構的概述。Stats collector不再需要了,可以移除。
利用事務統計丟掉 infrastructure(之前commit統計條目引入)不能再洩漏。之前透過pg_stat_vacuum_stat()刪除洩漏的統計(被[auto-]vacuum呼叫)。在有許多小表的系統中pgstat_vacuum_stat()代價非常昂貴。
現在對於刪除的物件,副本刪除統計資訊條目,當從一個乾淨的 shut down副本開始就不再需要進行統計重置。
很明顯, stats_temp_directory引數棄用了。我們不再需要pg_stat_tmp目錄。但是,保留這個目錄不會破壞pg_stat_statements類似的外掛使用。他們依賴於這個目錄。例如,我們載入pg_stat_statements庫,目錄中會出現一個檔案:
$ ls pg_stat_tmp/ pgss_query_texts.stat
新架構中,大多數統計更新首先在每個程式中累積為 “待處理”(每個後端都有一個本地雜湊表)。“待定”是指他們已累積,但尚未提交到共享統計系統。稍後會在提交或超時後重新整理到共享記憶體。
由於統計資料會在有人嘗試閱讀時同時更新。因此就出現了讀取一致性問題。所以 PG15引入了一個新引數stats_fetch_consistency,可以取值none,cache或snapshot。
“none”是最高效的,但不會提供一致性讀。“cache”確保欄位能夠重複訪問到相同值,在self-join相關的查詢中非常必要。“snapshot”在互動式檢查統計資訊時很有用,但開銷較大。預設是“cache”。
如果他在共享記憶體,如果在重啟後沿用
關機前由 checkpoint整合寫出到檔案系統,並在啟動程式啟動期間再次載入。像往常一樣,如果發生崩潰,統計資訊將會被丟棄。
會影響我的監控工具 /指令碼嗎
所有統計資料監控檢視 pg_stat_*繼續按原樣工作。但請確保為stat_fetch_consistency。如上所述,保留pg_stat_tmp目錄不會破壞使用這種方法開發的外掛。但是外掛開發人員需要針對PG15徹底進行測試。
還有什麼
像我這樣使用 PG wait events來了解PG和他的會話在哪裡花費了時間。我們在日常生活中使用pg_gather類似的資料採集分析工具。引入了3個新的等待事件:
PgStatsDSA |
Waiting for stats dynamic shared memory allocator access |
PgStatsHash |
Waiting for stats shared memory hash table access |
PgStatsData |
Waiting for shared memory stats data access |
隨著 stats collector的所有開銷及維護的消失,其他子程式例如autovacuum要做的工作就更少了。
原文
https://www.percona.com/blog/postgresql-15-stats-collector-gone-whats-new/
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31493717/viewspace-2913367/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- PostgreSQL 15 stats collector 在取消後是如何實現的原有功能的SQL
- 【PostgreSQL 】PostgreSQL 15對distinct的優化SQL優化
- 又被逼著最佳化程式碼,這次我幹掉了出入參 Log日誌
- Oracle vs PostgreSQL Develop(15) - DISTINCT ONOracleSQLdev
- PostgreSQL-15的 \watch命令SQL
- java GC CollectorJavaGC
- Opentelemetry collector用法
- 《PostgreSQL》 索引與最佳化SQL索引
- PostgreSQL IO最佳化技巧SQL
- PostgreSQL 原始碼解讀(237)- 後臺程式#15(rebuild_database_list)SQL原始碼RebuildDatabase
- postgresql配置引數最佳化SQL
- PostgreSQL DBA(15) - WAL檔案結構SQL
- rockyLinux 初體驗(教程)PostgreSQL15LinuxSQL
- [20200214]Printing all table preferences affecting dbms_stats.gather_table_stats
- 掉了錢包了
- dbms_stats(zt)
- Understanding Linux CPU statsLinux
- dbms_stats(轉)
- 【Mongodb】db.stats() 與 db.serverStats() 與 db.collection.stats()MongoDBServer
- PostgreSQL15開啟遠端連線SQL
- PostgreSQL 15釋出 HashData貢獻關鍵力量SQL
- PostgreSQL 元組統計與 pgstattuple 最佳化SQL
- 檢視V$DATAGUARD_STATS
- PostgreSQL:程式結構SQL
- 如何將PostgreSQL查詢最佳化100倍 - VadimSQL
- 程式設計師必知必會:MySQL上15個常見SQL最佳化技巧程式設計師MySql
- Appdash原始碼閱讀——Recorder與CollectorAPP原始碼
- Movie Collector pro for Mac入門介紹Mac
- PostgreSQL版的身份證號碼15位轉18位SQL
- CentOS7安裝PostgreSQL15以及PostGIS3.3CentOSSQLS3
- PostgreSQL 原始碼解讀(263)- PG 14(Improving connection scalability)#15SQL原始碼
- git_stats安裝及使用Git
- 透過預熱來最佳化POSTGRESQL的查詢SQL
- 大咖帶你解讀 PostgreSQL 15 新特性 | 直播預告SQL
- PostgreSQL 15 新特性解讀 | 墨天輪優質文章合集SQL
- Movie Collector for Mac電影資訊收集管理Mac
- PostgreSQL-14版本snapshot的幾點最佳化SQL
- 系統監控工具:MenuBar Stats for macMac