Postgres間隔大量寫IO的解決辦法

2022-07-13 16:36:12 字數 2986 閱讀 4947

為了保證資料可靠性,同時還要保證好的讀寫效能,以及讀寫的一致性,經過多年的積累,redo日誌,shared buffer等基本成為關係型資料庫的標配。postgres也不例外。

為了保證資料的可靠性,通常在將髒頁面寫入硬碟前,先將wal日誌先寫入硬碟,然後將修改的資料非同步分批寫入。

為了保證好的讀寫效能,修改的資料先寫到shared buffer中,而不是直接寫入硬碟,因為資料頁很離散(修改的資料分布在不同的表中)。資料庫會把wal日誌順序寫入硬碟中。

postgres提供兩種方式寫:write和fsync。區別是:

write:資料庫會將buffer中的髒頁根據寫入策略將老化的髒頁面寫到os,os再根據自己的排程演算法將髒頁寫入硬碟。

fsync:資料庫直接呼叫os的fsync函式,直接寫入硬碟。

涉及到幾個核心引數,同時還涉及到檔案系統。

設定方法

1、修改systctl:vm.dirty_background_ratio

2、修改檔案/proc/sys/vm/dirty_background_ratio

含義

在嘗試執行writeback操作(即os觸發background flush執行緒刷髒頁)之前記憶體髒頁面比例。

控制檔案系統的pdflush程序,在何時重新整理磁碟。

單位是百分比,當寫緩衝使用到系統記憶體多少時,pdflush開始向磁碟寫出資料。

增大之會使用更多系統記憶體用於磁碟寫緩衝,也可以極大提高系統的寫效能。

但當需要持續、恆定的寫入場合時,應該降低其數值。預設值5。

設定方法

1、修改systctl:vm.dirty_writeback_centisecs

2、修改檔案/proc/sys/vm/dirty_expire_centisecs

含義

background flush執行緒將存活時間超過該值的髒頁刷盤(類似lru)。

資料可以保持為dirty狀態的最大時間,超過該值pdflush程序就開始考慮寫到磁碟中去。

單位是1/100s。預設30000,也就是30s。

對於特別過載的寫操作來說,這個值適當縮小也是好的,但也不能縮小太多,因為縮小太多也會導致io提高太快。

建議設定為1500,也就是15秒算舊。

設定方法

1、修改systctl:vm.dirty_ratio

2、修改檔案/proc/sys/vm/dirty_ratio

含義

控制檔案系統的檔案系統寫緩衝區的大小,單位是百分比。

當髒頁比例達到該值,使用者程序在呼叫write時,會觸發flush磁碟的操作。表示當寫緩衝使用到系統記憶體多少時,開始向磁碟寫出資料。

當乙個任務(或者程序)在髒頁面過多的環境中執行檔案寫操作時,如果髒頁面占用總記憶體的百分比高於dirty_ratio值,那麼系統就執行髒頁面寫入硬碟操作。

增大會使用更多系統記憶體用於磁碟寫緩衝,也可以極大提高系統的寫效能。

但當需要持續、恆定的寫入場合時,應該降低其數值,預設值10。

設定方法

1、修改systctl:vm.dirty_writeback_centisecs

2、修改檔案/proc/sys/vm/dirty_writeback_centisecs

含義

控制核心的髒資料重新整理程序pdflush的執行間隔,執行background flush執行緒的喚醒間隔。

單位是1/100s。預設值是500,也就是5s。

適當減少該值有寫操作削峰作用,如果系統是持續地寫入動作,那麼降低該值比較好,可以把尖峰寫操作削平成多次寫操作。

該引數值應小於dirty_expire_centisecs,但太小i/o太頻繁,反而使系統效能下降。

據說1:6 (dirty_expire_centisecs: dirty_writeback_centisecs )的比例比較好。

如果記憶體非常大,當觸發後台執行緒刷髒頁時,可能需要刷很多髒頁,導致尖銳的io需求。

可以通過修改核心引數vm.dirtybackgroundbytes達到削尖的目的。

vm.dirtybackgroundbytes

= 102400000 當髒頁數達到了100mb,系統觸發background flush執行緒刷髒頁

fsync = on   

開啟後強制把wal日誌同步更新到磁碟,可以保證資料庫將在os或者硬體崩潰的後恢復到乙個一致的狀態。

雖然關閉,可以提公升資料庫效能,但無法保證資料庫崩潰後資料一致性。

通常情況下需要開啟這個引數,除非能經受掉電或硬體故障帶來的資料丟失,否則不要關閉。

單位:blcksz

當某backend process髒資料超過配置閾值時,觸發呼叫os sync_file_range,告訴os backend flush執行緒非同步刷盤。

從而削減os dirty page堆積。

單位:blcksz

當bgwriter process髒資料超過配置閾值時,觸發呼叫os sync_file_range,告訴os backend flush執行緒非同步刷盤。

從而削減os dirty page堆積。

單位:blcksz

當checkpointer process髒資料超過配置閾值時,觸發呼叫os sync_file_range,告訴os backend flush執行緒非同步刷盤。

從而削減os dirty page堆積。

單位:blcksz

當wal writer process髒資料超過配置閾值時,觸發呼叫os sync_file_range,告訴os backend flush執行緒非同步刷盤。

從而削減os dirty page堆積。

python向Oracle寫大量資料

import bs4 import requests import pandas as pd import cx oracle as cx from datetime import datetime time datetime.now strftime y m d 獲取當前系統時間 並規定格式 n ...

寫io的幾種模式

寫io的幾種模式 buffer write 特點 a 應用程式寫入到page cache b 作業系統 writeback 優缺點 a 大部分情況直接寫記憶體,速度很快 b 資料完整性無法得到嚴格保證 c 小部分寫入受到系統回寫影響,服務質量沒有辦法保證 direct write 特點 a 繞過作業...

用ibatis寫時間間隔的動態查詢

最直接的方法是利用oracle中sql語句中的to date,例如 username username to date fromdate yyyy mm dd hh mi ss 再有方法就是把你的資料用 dateformat格成date傳進去,例如 username username markdat...