SlideShare ist ein Scribd-Unternehmen logo
1 von 24
PostgreSQL Internals
- Buffer Management -
    Satoshi Nagayasu
    snaga@snaga.org
bufmgr関連データ
• 1つ以上のバックエンドによって参照されて
  いるバッファ(プール)のハッシュテーブル
     – SharedBufHash
• どこからも参照されていない(されなくなっ
  た)バッファのリスト(環状リスト)
     – SharedFreeList
• いずれも共有メモリ内の領域

2003/06/20              Satoshi Nagayasu
BufferDescriptor
• BufferDescriptorメンバ(抜粋)
     –   Buffer freeNext, freePrev
     –   SHMEM_OFFSET data
     –   int buf_id
     –   BufFlags flags
     –   unsigned refcount



2003/06/20               Satoshi Nagayasu
初期化直後のBufferDescriptorリスト(NBuffers=8)
                                                                 freeNext                       freeNext

                                   freeNext

                   freeNext       freeNext       freeNext       freeNext       freeNext
                                                                                               freeNext


                                                                                                                 SharedFreeList
0              1              2              3              4              5              6              7      8


    freePrev       freePrev       freePrev       freePrev       freePrev       freePrev       freePrev


                                     freePrev
               freePrev
                                                                                                             InitBufferPool()
                                                                                                             InitFreeList()

       NBuffers(GUC)+1のBufferDescriptorを確保する。
       最後の1個を空きバッファリストの先頭要素とする。
       freeNextを辿ると、「8→1→2→3→4→5→6→7→0→8」
    2003/06/20                                         Satoshi Nagayasu
ディスクからバッファへの読込み
• バッファに読み込むディスクブロックの指定
     – BufferTag
             • fileNode(テーブルOID)とブロック番号
• バッファプールの中に存在するか?
     – BufTableLookup()
             • BufferPoolのHashテーブルを検索
• 存在しなければディスクから読み込み
     – GetFreeBuffer() & smgrread()
2003/06/20              Satoshi Nagayasu
ディスクからバッファへの読込み
• ReadBuffer() / ReadBufferInternal()
     – BufferAlloc()
             • BufTableLookup() でHashテーブルを検索
             • 見つからなければ GetFreeBuffer() でバッファ取得
             • Hashテーブルに追加
     – Hash 内にあれば BufferDescriptorGetBuffer()
     – 無ければ smgrread()


2003/06/20              Satoshi Nagayasu
GetFreeBuffer()

                                                                 freeNext                       freeNext

                                   freeNext

                   freeNext       freeNext       freeNext       freeNext       freeNext
                                                                                               freeNext


                                                                                                             SharedFreeList
0              1              2              3              4              5              6              7   8


    freePrev       freePrev       freePrev       freePrev       freePrev       freePrev       freePrev


                                     freePrev
               freePrev




                buf = &(BufferDescriptors[SharedFreeList->freeNext]);
    2003/06/20                                         Satoshi Nagayasu
GetFreeBuffer()

                                                                 freeNext                       freeNext

                                   freeNext

                   freeNext       freeNext       freeNext       freeNext       freeNext
                                                                                               freeNext


                                                                                                             SharedFreeList
0              1              2              3              4              5              6              7   8


    freePrev       freePrev       freePrev       freePrev       freePrev       freePrev       freePrev


                                     freePrev
               freePrev




                BufferDescriptors[buf->freeNext].freePrev = buf->freePrev;
    2003/06/20                                         Satoshi Nagayasu
GetFreeBuffer()

                                                                 freeNext                       freeNext

                                   freeNext

                   freeNext       freeNext       freeNext       freeNext       freeNext
                                                                                               freeNext


                                                                                                             SharedFreeList
0              1              2              3              4              5              6              7   8


    freePrev       freePrev       freePrev       freePrev       freePrev       freePrev       freePrev


                                     freePrev
               freePrev




                BufferDescriptors[buf->freePrev].freeNext = buf->freeNext;
    2003/06/20                                         Satoshi Nagayasu
GetFreeBuffer()

                                                             freeNext                       freeNext

                               freeNext

                              freeNext       freeNext       freeNext       freeNext
                                                                                           freeNext


                                                                                                         SharedFreeList
0              1          2              3              4              5              6              7   8


    freePrev                  freePrev       freePrev       freePrev       freePrev       freePrev


                                 freePrev
               freePrev




                buf->freeNext = buf->freePrev = INVALID_DESCRIPTOR;
    2003/06/20                                     Satoshi Nagayasu
SharedBufHash
• ハッシュテーブルの操作(buf_table.c)
     – BufTableInsert()
     – BufTableDelete()
     – BufTableLookup()




2003/06/20           Satoshi Nagayasu
PinBuffer()/UnpinBuffer()
• PrivateRefCount (ローカル変数)
     – ひとつのバックエンド内で、そのバッファが何
       回参照(Pin)されているか
• BufferDesc->refcount (共有メモリ内変数)
     – いくつのバックエンドにそのバッファが参照さ
       れているか(複数バックエンド間での話)。



2003/06/20            Satoshi Nagayasu
SharedFreeList
• バッファを取得する場合には、freelistの先
  頭(SharedFreeListの次)から取る
     – GetFreeBuffer()
• バッファを開放する場合には、freelistの最
  後尾(SharedFreeListの前)に追加
     – BufferDesc->refcountが0になると、freeListに
       追加される。
     – UnpinBuffer(), AddBufferToFreeList()
2003/06/20               Satoshi Nagayasu
SharedFreeList
• 有効なブロックが読み込まれているバッ
  ファは、ハッシュテーブルに登録される
• どのバックエンドにも参照されていないバッ
  ファは、freelistの最後尾に登録される
• freelistから取り出したものが、以前使われ
  ていたdirtyなバッファの場合は、前のデー
  タをまずディスクにwriteしてから使われる

2003/06/20       Satoshi Nagayasu
AddBufferToFreeList ()

                                                             freeNext                       freeNext

                               freeNext

                              freeNext       freeNext       freeNext       freeNext
                                                                                           freeNext


                                                                                                         SharedFreeList
0              1          2              3              4              5              6              7   8


    freePrev                  freePrev       freePrev       freePrev       freePrev       freePrev


                                 freePrev
               freePrev



                   bf->freePrev = SharedFreeList->FreePrev;
    2003/06/20                                     Satoshi Nagayasu
AddBufferToFreeList ()

                                                             freeNext                       freeNext

                               freeNext

                              freeNext       freeNext       freeNext       freeNext
                                                                                           freeNext


                                                                                                         SharedFreeList
0              1          2              3              4              5              6              7   8


    freePrev                  freePrev       freePrev       freePrev       freePrev       freePrev


                                 freePrev
               freePrev



                   bf->freeNext = Free_List_Descriptor;
    2003/06/20                                     Satoshi Nagayasu
AddBufferToFreeList ()

                                                             freeNext                       freeNext

                               freeNext

                              freeNext       freeNext       freeNext       freeNext
                                                                                           freeNext


                                                                                                         SharedFreeList
0              1          2              3              4              5              6              7   8


    freePrev                  freePrev       freePrev       freePrev       freePrev       freePrev


                                 freePrev
               freePrev



                   BufferDescriptors[bf->freeNext].freePrev = bf->buf_id;
    2003/06/20                                     Satoshi Nagayasu
AddBufferToFreeList ()

                                                             freeNext                       freeNext

                               freeNext

                              freeNext       freeNext       freeNext       freeNext
                                                                                           freeNext


                                                                                                         SharedFreeList
0              1          2              3              4              5              6              7   8


    freePrev                  freePrev       freePrev       freePrev       freePrev       freePrev


                                 freePrev
               freePrev



                   BufferDescriptors[bf->freePrev].freeNext = bf->buf_id;
    2003/06/20                                     Satoshi Nagayasu
bufmgrイメージ
• ブロックが読み込まれてるバッファは
  SharedBufHashに
• 参照されなくなったバッファはSharedFreeList
  に
• 両方に存在することも     shmem

                                                                SharedBufHash
                postgres
    postgres                                   SharedFreeList

                                                          Buffer
               postgres                                    Buffer
                                                            Buffer
2003/06/20                                                    Buffer
                           postgres Nagayasu
                                Satoshi
bufmgr - InitFreeList()
• 最初はSharedFreeListにある




              SharedFreeList                      SharedBufHash



                                   Buffer

2003/06/20                     Satoshi Nagayasu
bufmgr - GetFreeBuffer()
• ディスクからブロックが読み込まれると、
  SharedFreeListの先頭から取り出され、
  SharedBufHashに登録される
  (GetFreeBuffer()&BufTableInsert())。

               SharedFreeList                      SharedBufHash



                                    Buffer

2003/06/20                      Satoshi Nagayasu
bufmgr - UnpinBuffer()
• どこからも参照されなくなる(refcount==0)と、
  SharedFreeListの最後尾に登録される。この
  段階では、SharedBufHashの中でも見つかる
  し、SharedFreeListにも含まれる。

              SharedFreeList               SharedBufHash



                                  Buffer
                                     参照されてない。でもdirty(かもしれない)。
2003/06/20                     Satoshi Nagayasu
bufmgr - PinBuffer()
• 再度参照されると、SharedFreeListから切り
  離される。



             SharedFreeList                      SharedBufHash



                                  Buffer

2003/06/20                    Satoshi Nagayasu
bufmgr - BufTableDelete()
• そのまま参照されずに、再度別ブロックの
  バッファとして取得されると、以前のdirtyな
  データをディスクに反映させて、
  SharedBufHashから一旦削除される(新しい
  ブロックとして再登録)。
             SharedFreeList                      SharedBufHash



                                  Buffer

2003/06/20                    Satoshi Nagayasu

Weitere ähnliche Inhalte

Mehr von Satoshi Nagayasu

データウェアハウスモデリング入門(ダイジェスト版)(事前公開版)
データウェアハウスモデリング入門(ダイジェスト版)(事前公開版) データウェアハウスモデリング入門(ダイジェスト版)(事前公開版)
データウェアハウスモデリング入門(ダイジェスト版)(事前公開版) Satoshi Nagayasu
 
Oracle対応アプリケーションのDockerize事始め
Oracle対応アプリケーションのDockerize事始めOracle対応アプリケーションのDockerize事始め
Oracle対応アプリケーションのDockerize事始めSatoshi Nagayasu
 
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会Satoshi Nagayasu
 
In-Database Analyticsの必要性と可能性
In-Database Analyticsの必要性と可能性In-Database Analyticsの必要性と可能性
In-Database Analyticsの必要性と可能性Satoshi Nagayasu
 
10 Reasons to Start Your Analytics Project with PostgreSQL
10 Reasons to Start Your Analytics Project with PostgreSQL10 Reasons to Start Your Analytics Project with PostgreSQL
10 Reasons to Start Your Analytics Project with PostgreSQLSatoshi Nagayasu
 
A Story Behind the Conference, or How pgDay Asia was born
A Story Behind the Conference, or How pgDay Asia was bornA Story Behind the Conference, or How pgDay Asia was born
A Story Behind the Conference, or How pgDay Asia was bornSatoshi Nagayasu
 
データベースエンジニアがデータヘルスの2年間で見たもの(仮)
データベースエンジニアがデータヘルスの2年間で見たもの(仮)データベースエンジニアがデータヘルスの2年間で見たもの(仮)
データベースエンジニアがデータヘルスの2年間で見たもの(仮)Satoshi Nagayasu
 
PostgreSQL 9.4, 9.5 and Beyond @ COSCUP 2015 Taipei
PostgreSQL 9.4, 9.5 and Beyond @ COSCUP 2015 TaipeiPostgreSQL 9.4, 9.5 and Beyond @ COSCUP 2015 Taipei
PostgreSQL 9.4, 9.5 and Beyond @ COSCUP 2015 TaipeiSatoshi Nagayasu
 
PostgreSQL 9.4 and Beyond @ FOSSASIA 2015 Singapore
PostgreSQL 9.4 and Beyond @ FOSSASIA 2015 SingaporePostgreSQL 9.4 and Beyond @ FOSSASIA 2015 Singapore
PostgreSQL 9.4 and Beyond @ FOSSASIA 2015 SingaporeSatoshi Nagayasu
 
PostgreSQL Community in Japan
PostgreSQL Community in JapanPostgreSQL Community in Japan
PostgreSQL Community in JapanSatoshi Nagayasu
 
海外の技術カンファレンスに行こう! Let’s go tech conferences overseas!
海外の技術カンファレンスに行こう! Let’s go tech conferences overseas!海外の技術カンファレンスに行こう! Let’s go tech conferences overseas!
海外の技術カンファレンスに行こう! Let’s go tech conferences overseas!Satoshi Nagayasu
 
Django/Celeyを用いたデータ分析Webアプリケーションにおける非同期処理の設計と実装
Django/Celeyを用いたデータ分析Webアプリケーションにおける非同期処理の設計と実装Django/Celeyを用いたデータ分析Webアプリケーションにおける非同期処理の設計と実装
Django/Celeyを用いたデータ分析Webアプリケーションにおける非同期処理の設計と実装Satoshi Nagayasu
 
映画「マネーボール」に学ぶデータ分析と組織行動論
映画「マネーボール」に学ぶデータ分析と組織行動論映画「マネーボール」に学ぶデータ分析と組織行動論
映画「マネーボール」に学ぶデータ分析と組織行動論Satoshi Nagayasu
 
統計勉強会 分割表とカイ二乗検定
統計勉強会 分割表とカイ二乗検定統計勉強会 分割表とカイ二乗検定
統計勉強会 分割表とカイ二乗検定Satoshi Nagayasu
 
PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方Satoshi Nagayasu
 
遊休リソースを用いた 相同性検索処理の並列化とその評価
遊休リソースを用いた相同性検索処理の並列化とその評価遊休リソースを用いた相同性検索処理の並列化とその評価
遊休リソースを用いた 相同性検索処理の並列化とその評価Satoshi Nagayasu
 

Mehr von Satoshi Nagayasu (20)

データウェアハウスモデリング入門(ダイジェスト版)(事前公開版)
データウェアハウスモデリング入門(ダイジェスト版)(事前公開版) データウェアハウスモデリング入門(ダイジェスト版)(事前公開版)
データウェアハウスモデリング入門(ダイジェスト版)(事前公開版)
 
Oracle対応アプリケーションのDockerize事始め
Oracle対応アプリケーションのDockerize事始めOracle対応アプリケーションのDockerize事始め
Oracle対応アプリケーションのDockerize事始め
 
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
 
In-Database Analyticsの必要性と可能性
In-Database Analyticsの必要性と可能性In-Database Analyticsの必要性と可能性
In-Database Analyticsの必要性と可能性
 
10 Reasons to Start Your Analytics Project with PostgreSQL
10 Reasons to Start Your Analytics Project with PostgreSQL10 Reasons to Start Your Analytics Project with PostgreSQL
10 Reasons to Start Your Analytics Project with PostgreSQL
 
pgDay Asia 2016 & 2017
pgDay Asia 2016 & 2017pgDay Asia 2016 & 2017
pgDay Asia 2016 & 2017
 
A Story Behind the Conference, or How pgDay Asia was born
A Story Behind the Conference, or How pgDay Asia was bornA Story Behind the Conference, or How pgDay Asia was born
A Story Behind the Conference, or How pgDay Asia was born
 
データベースエンジニアがデータヘルスの2年間で見たもの(仮)
データベースエンジニアがデータヘルスの2年間で見たもの(仮)データベースエンジニアがデータヘルスの2年間で見たもの(仮)
データベースエンジニアがデータヘルスの2年間で見たもの(仮)
 
PostgreSQL 9.4, 9.5 and Beyond @ COSCUP 2015 Taipei
PostgreSQL 9.4, 9.5 and Beyond @ COSCUP 2015 TaipeiPostgreSQL 9.4, 9.5 and Beyond @ COSCUP 2015 Taipei
PostgreSQL 9.4, 9.5 and Beyond @ COSCUP 2015 Taipei
 
[WIP] pgDay Asia 2016
[WIP] pgDay Asia 2016[WIP] pgDay Asia 2016
[WIP] pgDay Asia 2016
 
PostgreSQL 9.4 and Beyond @ FOSSASIA 2015 Singapore
PostgreSQL 9.4 and Beyond @ FOSSASIA 2015 SingaporePostgreSQL 9.4 and Beyond @ FOSSASIA 2015 Singapore
PostgreSQL 9.4 and Beyond @ FOSSASIA 2015 Singapore
 
PostgreSQL 9.4
PostgreSQL 9.4PostgreSQL 9.4
PostgreSQL 9.4
 
PostgreSQL Community in Japan
PostgreSQL Community in JapanPostgreSQL Community in Japan
PostgreSQL Community in Japan
 
海外の技術カンファレンスに行こう! Let’s go tech conferences overseas!
海外の技術カンファレンスに行こう! Let’s go tech conferences overseas!海外の技術カンファレンスに行こう! Let’s go tech conferences overseas!
海外の技術カンファレンスに行こう! Let’s go tech conferences overseas!
 
Django/Celeyを用いたデータ分析Webアプリケーションにおける非同期処理の設計と実装
Django/Celeyを用いたデータ分析Webアプリケーションにおける非同期処理の設計と実装Django/Celeyを用いたデータ分析Webアプリケーションにおける非同期処理の設計と実装
Django/Celeyを用いたデータ分析Webアプリケーションにおける非同期処理の設計と実装
 
映画「マネーボール」に学ぶデータ分析と組織行動論
映画「マネーボール」に学ぶデータ分析と組織行動論映画「マネーボール」に学ぶデータ分析と組織行動論
映画「マネーボール」に学ぶデータ分析と組織行動論
 
統計勉強会 分割表とカイ二乗検定
統計勉強会 分割表とカイ二乗検定統計勉強会 分割表とカイ二乗検定
統計勉強会 分割表とカイ二乗検定
 
PgAccelerator
PgAcceleratorPgAccelerator
PgAccelerator
 
PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方
 
遊休リソースを用いた 相同性検索処理の並列化とその評価
遊休リソースを用いた相同性検索処理の並列化とその評価遊休リソースを用いた相同性検索処理の並列化とその評価
遊休リソースを用いた 相同性検索処理の並列化とその評価
 

Kürzlich hochgeladen

Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...Toru Tamaki
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Hiroshi Tomioka
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Gamesatsushi061452
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video UnderstandingToru Tamaki
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 

Kürzlich hochgeladen (11)

Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 

PostgreSQL Internals - Buffer Management

  • 1. PostgreSQL Internals - Buffer Management - Satoshi Nagayasu snaga@snaga.org
  • 2. bufmgr関連データ • 1つ以上のバックエンドによって参照されて いるバッファ(プール)のハッシュテーブル – SharedBufHash • どこからも参照されていない(されなくなっ た)バッファのリスト(環状リスト) – SharedFreeList • いずれも共有メモリ内の領域 2003/06/20 Satoshi Nagayasu
  • 3. BufferDescriptor • BufferDescriptorメンバ(抜粋) – Buffer freeNext, freePrev – SHMEM_OFFSET data – int buf_id – BufFlags flags – unsigned refcount 2003/06/20 Satoshi Nagayasu
  • 4. 初期化直後のBufferDescriptorリスト(NBuffers=8) freeNext freeNext freeNext freeNext freeNext freeNext freeNext freeNext freeNext SharedFreeList 0 1 2 3 4 5 6 7 8 freePrev freePrev freePrev freePrev freePrev freePrev freePrev freePrev freePrev InitBufferPool() InitFreeList() NBuffers(GUC)+1のBufferDescriptorを確保する。 最後の1個を空きバッファリストの先頭要素とする。 freeNextを辿ると、「8→1→2→3→4→5→6→7→0→8」 2003/06/20 Satoshi Nagayasu
  • 5. ディスクからバッファへの読込み • バッファに読み込むディスクブロックの指定 – BufferTag • fileNode(テーブルOID)とブロック番号 • バッファプールの中に存在するか? – BufTableLookup() • BufferPoolのHashテーブルを検索 • 存在しなければディスクから読み込み – GetFreeBuffer() & smgrread() 2003/06/20 Satoshi Nagayasu
  • 6. ディスクからバッファへの読込み • ReadBuffer() / ReadBufferInternal() – BufferAlloc() • BufTableLookup() でHashテーブルを検索 • 見つからなければ GetFreeBuffer() でバッファ取得 • Hashテーブルに追加 – Hash 内にあれば BufferDescriptorGetBuffer() – 無ければ smgrread() 2003/06/20 Satoshi Nagayasu
  • 7. GetFreeBuffer() freeNext freeNext freeNext freeNext freeNext freeNext freeNext freeNext freeNext SharedFreeList 0 1 2 3 4 5 6 7 8 freePrev freePrev freePrev freePrev freePrev freePrev freePrev freePrev freePrev buf = &(BufferDescriptors[SharedFreeList->freeNext]); 2003/06/20 Satoshi Nagayasu
  • 8. GetFreeBuffer() freeNext freeNext freeNext freeNext freeNext freeNext freeNext freeNext freeNext SharedFreeList 0 1 2 3 4 5 6 7 8 freePrev freePrev freePrev freePrev freePrev freePrev freePrev freePrev freePrev BufferDescriptors[buf->freeNext].freePrev = buf->freePrev; 2003/06/20 Satoshi Nagayasu
  • 9. GetFreeBuffer() freeNext freeNext freeNext freeNext freeNext freeNext freeNext freeNext freeNext SharedFreeList 0 1 2 3 4 5 6 7 8 freePrev freePrev freePrev freePrev freePrev freePrev freePrev freePrev freePrev BufferDescriptors[buf->freePrev].freeNext = buf->freeNext; 2003/06/20 Satoshi Nagayasu
  • 10. GetFreeBuffer() freeNext freeNext freeNext freeNext freeNext freeNext freeNext freeNext SharedFreeList 0 1 2 3 4 5 6 7 8 freePrev freePrev freePrev freePrev freePrev freePrev freePrev freePrev buf->freeNext = buf->freePrev = INVALID_DESCRIPTOR; 2003/06/20 Satoshi Nagayasu
  • 11. SharedBufHash • ハッシュテーブルの操作(buf_table.c) – BufTableInsert() – BufTableDelete() – BufTableLookup() 2003/06/20 Satoshi Nagayasu
  • 12. PinBuffer()/UnpinBuffer() • PrivateRefCount (ローカル変数) – ひとつのバックエンド内で、そのバッファが何 回参照(Pin)されているか • BufferDesc->refcount (共有メモリ内変数) – いくつのバックエンドにそのバッファが参照さ れているか(複数バックエンド間での話)。 2003/06/20 Satoshi Nagayasu
  • 13. SharedFreeList • バッファを取得する場合には、freelistの先 頭(SharedFreeListの次)から取る – GetFreeBuffer() • バッファを開放する場合には、freelistの最 後尾(SharedFreeListの前)に追加 – BufferDesc->refcountが0になると、freeListに 追加される。 – UnpinBuffer(), AddBufferToFreeList() 2003/06/20 Satoshi Nagayasu
  • 14. SharedFreeList • 有効なブロックが読み込まれているバッ ファは、ハッシュテーブルに登録される • どのバックエンドにも参照されていないバッ ファは、freelistの最後尾に登録される • freelistから取り出したものが、以前使われ ていたdirtyなバッファの場合は、前のデー タをまずディスクにwriteしてから使われる 2003/06/20 Satoshi Nagayasu
  • 15. AddBufferToFreeList () freeNext freeNext freeNext freeNext freeNext freeNext freeNext freeNext SharedFreeList 0 1 2 3 4 5 6 7 8 freePrev freePrev freePrev freePrev freePrev freePrev freePrev freePrev bf->freePrev = SharedFreeList->FreePrev; 2003/06/20 Satoshi Nagayasu
  • 16. AddBufferToFreeList () freeNext freeNext freeNext freeNext freeNext freeNext freeNext freeNext SharedFreeList 0 1 2 3 4 5 6 7 8 freePrev freePrev freePrev freePrev freePrev freePrev freePrev freePrev bf->freeNext = Free_List_Descriptor; 2003/06/20 Satoshi Nagayasu
  • 17. AddBufferToFreeList () freeNext freeNext freeNext freeNext freeNext freeNext freeNext freeNext SharedFreeList 0 1 2 3 4 5 6 7 8 freePrev freePrev freePrev freePrev freePrev freePrev freePrev freePrev BufferDescriptors[bf->freeNext].freePrev = bf->buf_id; 2003/06/20 Satoshi Nagayasu
  • 18. AddBufferToFreeList () freeNext freeNext freeNext freeNext freeNext freeNext freeNext freeNext SharedFreeList 0 1 2 3 4 5 6 7 8 freePrev freePrev freePrev freePrev freePrev freePrev freePrev freePrev BufferDescriptors[bf->freePrev].freeNext = bf->buf_id; 2003/06/20 Satoshi Nagayasu
  • 19. bufmgrイメージ • ブロックが読み込まれてるバッファは SharedBufHashに • 参照されなくなったバッファはSharedFreeList に • 両方に存在することも shmem SharedBufHash postgres postgres SharedFreeList Buffer postgres Buffer Buffer 2003/06/20 Buffer postgres Nagayasu Satoshi
  • 20. bufmgr - InitFreeList() • 最初はSharedFreeListにある SharedFreeList SharedBufHash Buffer 2003/06/20 Satoshi Nagayasu
  • 21. bufmgr - GetFreeBuffer() • ディスクからブロックが読み込まれると、 SharedFreeListの先頭から取り出され、 SharedBufHashに登録される (GetFreeBuffer()&BufTableInsert())。 SharedFreeList SharedBufHash Buffer 2003/06/20 Satoshi Nagayasu
  • 22. bufmgr - UnpinBuffer() • どこからも参照されなくなる(refcount==0)と、 SharedFreeListの最後尾に登録される。この 段階では、SharedBufHashの中でも見つかる し、SharedFreeListにも含まれる。 SharedFreeList SharedBufHash Buffer 参照されてない。でもdirty(かもしれない)。 2003/06/20 Satoshi Nagayasu
  • 23. bufmgr - PinBuffer() • 再度参照されると、SharedFreeListから切り 離される。 SharedFreeList SharedBufHash Buffer 2003/06/20 Satoshi Nagayasu
  • 24. bufmgr - BufTableDelete() • そのまま参照されずに、再度別ブロックの バッファとして取得されると、以前のdirtyな データをディスクに反映させて、 SharedBufHashから一旦削除される(新しい ブロックとして再登録)。 SharedFreeList SharedBufHash Buffer 2003/06/20 Satoshi Nagayasu