国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

PostgreSQL進程和內存淺析

IT那活兒 / 3049人閱讀
PostgreSQL進程和內存淺析

點擊上方“IT那活兒”公眾號,關注后了解更多內容,不管IT什么活兒,干就完了!!!   




    本文主要是對 PostgreSQL 中的進程架構和內存架構做下簡單介紹,適用于初學者閱讀。

 


PART1

PostgreSQL的進程結構
PostgreSQL是具有多進程體系結構的客戶端/服務器類型的關系數據庫管理系統。
協作管理一個數據庫集群的多個進程的集合稱為“PostgreSQL服務器”,它主要包含以下3種類型的進程:
  • postgres server process:Postgres服務器進程,即守護進程,是數據庫集群管理的所有進程的父進程。
  • backend processes:后端進程,每個后端進程處理連接進來的客戶端發出的所有查詢和語句。
  • backgroud processes:后臺進程,每個后臺進程分別執行相應的功能(例如VACUUM和CHECKPOINT進程)以進行數據庫管理。
下面將分別對這三種進程進行介紹:
1.1.PostgreSQL進程結構示意圖
1.1 postgres server process
postgres server process,即postgres服務器進程,也叫守護進程,它是所有進程的父進程,早期的版本叫postmaster。其執行文件位于安裝目錄的bin目錄下:
當執行pg_ctl start,postgres服務器進程將會啟動。
然后,它從內存中分配一個shared memory area,啟動各種background processes后臺進程,并等待來自客戶端的連接請求,必要時還會啟動與復制相關的進程和后臺工作進程。每當接收到一個來自客戶端的連接請求時,它就會啟動(forks)一個backend process后端進程,啟動的后端進程將處理連接進來的客戶端發出的所有查詢。
1.2 backend processes
backend process,即后端進程(也稱為postgres),由postgres服務器進程啟動,并處理由一個連接的客戶端發出的所有查詢。它通過TCP協議與客戶端建立通信,并在客戶端斷開連接時終止。
PostgreSQL允許多個客戶端同時連接,連接數由max_connections參數控制(默認為100)。
PostgreSQL不具備本地連接池功能,如果許多客戶端(例如WEB應用程序)頻繁重復與PostgreSQL服務端進行連接和斷開連接,會增加數據庫的開銷,這會對數據庫服務器的性能產生負面影響,為了避免這種情況,通常使用中間件(pgbouncer 或pgpool-II)。
1.3 backgroud processes
下面是對相關的服務端后臺進程的介紹:
  • background writer(后臺寫進程):定期將shared buffer pool中的臟數據寫到磁盤上的進程,checkpoint也會觸發這個過程,類似Oracle的dbwn進程。當插入或更新數據時,并不會馬上把數據持久化至數據文件中。
    這是基于提高插入、更新及刪除數據的性能考慮的,畢竟寫內存比寫硬盤會快很多。BgWriter會周期性的將內存中的臟塊刷新至磁盤,刷臟塊既不能太快也不能太慢。
    如果一個數據庫短時間內被修改多次,當刷新過快的情況下,它每次的修改都會保存至磁盤,這會導致I/O增加,從而影響性能。刷新過慢時,對于繁忙的數據庫而言,內存中存放大量的臟塊未刷新至磁盤,假設此時無可用內存,當有新的更新需要使用內存來保存從磁盤中讀取的數據塊時,需要等待臟塊刷新至磁盤把內存騰挪出來。
    這樣會導致更新需要等更長的時間。并且如果出現異常宕機的情況,重啟時需要恢復的那部分沒有刷新至磁盤的臟塊,也影響其故障恢復的時間。其機制由如下參數來控制:
  • Checkpointer進程:執行checkpoint,類似Oracle的ckpt
    autovacuum launcher進程:為vacuum process周期性的調用autovacuum work processes,用于舊數據的清除。
  • wal writer進程:將wal buffer的數據刷新到磁盤,WAL log另稱為預寫式日志。即在事務提交之前,必須將這些修改操作記錄到磁盤中。這樣就不需要實時地將臟數據持久化到磁盤。
    即便服務器突然宕機或數據庫異常宕掉,導致一部分內存中的臟塊未刷新至文件,在數據庫重啟后,通過讀取WAL日志,將這部分事務重放一遍就可以將數據庫恢復至宕機的時刻。
  • stats collector進程:收集統計信息,例如pg_stat_activity 和pg_stat_database的統計信息。
  • logging collector (logger)進程:將錯誤信息寫入到日志。
  • Archiver進程:將WAL log歸檔。
下面的示例展示PostgreSQL服務器的進程信息,一個postgres server process守護進程,backend processes以及幾個background processes后臺進程正在運行。
一次PostgreSQL會話過程分解如下:
--客戶端調用libpq(數據庫應用連接接口庫,如JDBC,ODBC),將連接請求發送給守護進程;
--守護進程啟動(forks)一個新的后端進程postgres與客戶端應用連接;
--后端進程postgres直接與用戶通信,不再通過守護進程;
--后端進程postgres接收客戶端的查詢請求,完成并返回結果;
--客戶端每創建一個數據庫連接,守護進程就生成一個后端進程pstogres。

 


PART2

PostgreSQL的內存結構
PostgreSQL的內存結構分為兩部分:
  • Local memory area由每個backend process后端進程分配以供其自己使用。

  • Shared memory area,由PostgreSQL server的所有服務進程共享使用的內存。

圖 2.1. PostgreSQL的內存結構
2.1 Local memory area 
每一個backend process后端進程都會分配一個local memory area, 每個local memory area又分為三部分:

2.2 Shared memory area 
shared memory area由PostgreSQL server的所有服務進程共享使用,這個區域在PostgreSQL server啟動的時候分配,它包括三個主要的緩沖區:

除此之外,PostgreSQL還在Shared memory area分配一些其他的內存區域:
  • 為各種訪問控制機制分配的子區域,例如輕量級鎖,共享鎖和排他鎖等。
  • 各種后臺進程的子區域,例如checkpointer和autovacuum。
  • 為事務處理提供的子區域,比如事務中的save-point,和二階段事務提交。
  • 其他。

 


END




本文作者:魏 斌

本文來源:IT那活兒(上海新炬王翦團隊)

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/129502.html

相關文章

  • OptaPlanner - 把example運行起來(運行并淺析Cloud balancing)

    摘要:后來我用的示例可以正常運行起來了。運行示例我們選擇一個比較經典的示例運行一下看看。軟性要求任何一臺一旦有任務分配進去,即表示該被占用,需計算這臺的成本。討論組屬于郵件列表,國內網絡可能較難訪問,需自行解決 經過上面篇長篇大論的理論之后,在開始講解Optaplanner相關基本概念及用法之前,我們先把他們提供的示例運行起來,好先讓大家看看它是如何工作的。OptaPlanner的優點不僅僅...

    Half 評論0 收藏0
  • 【Swoole源碼研究】淺析swoole中server的實現

    摘要:的部分是基于以及協議的。例如父進程向中寫入子進程從中讀取子進程向中寫入父進程從中讀取。默認使用對進程進行分配交給對應的線程進行監聽線程收到某個進程的數據后會進行處理值得注意的是這個線程可能并不是發送請求的那個線程。 作者:施洪寶 一. 基礎知識 1.1 swoole swoole是面向生產環境的php異步網絡通信引擎, php開發人員可以利用swoole開發出高性能的server服務。...

    rainyang 評論0 收藏0

發表評論

0條評論

IT那活兒

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<