日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

postgresql调优

發布時間:2023/12/19 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 postgresql调优 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://blog.pgaddict.com/posts/performance-since-postgresql-7-4-to-9-4-pgbench


硬件和系統配置

操作系統Ubuntu13.04
系統位數64
CPUIntel(R) Core(TM)2 Duo CPU
內存4G
硬盤Seagate ST2000DM001-1CH164
測試工具PostgreSQL-9.1.11

測試工具

工具名稱pgbench
數據量200W(整個數據庫大小約為300M)
模擬客戶端數4
線程數4
測試時間60秒
  • 準備命令:pgbench -i -s 20 pgbenchdb

  • 測試命令:pgbench -r -j4 -c4 -T60 testdb

配置文件

默認的配置配置文件是保存在/etc/postgresql/VERSION/main目錄下的postgresql.conf文件

  • 如果想查看參數修改是否生效,可以用psql連接到數據庫后,用<show 選項名> 來查看。

  • 如果要修改shared_buffers, 在ubuntu下可能需要執行命令<sysctl -w>Managing Kernel Resources

主要選項

選項默認值說明是否優化原因
max_connections100允許客戶端連接的最大數目因為在測試的過程中,100個連接已經足夠
fsyncon強制把數據同步更新到磁盤因為系統的IO壓力很大,為了更好的測試其他配置的影響,把改參數改為off
shared_buffers24MB決定有多少內存可以被PostgreSQL用于緩存數據(推薦內存的1/4)在IO壓力很大的情況下,提高該值可以減少IO
work_mem1MB使內部排序和一些復雜的查詢都在這個buffer中完成有助提高排序等操作的速度,并且減低IO
effective_cache_size128MB優化器假設一個查詢可以用的最大內存,和shared_buffers無關(推薦內存的1/2)設置稍大,優化器更傾向使用索引掃描而不是順序掃描
maintenance_work_mem16MB這里定義的內存只是被VACUUM等耗費資源較多的命令調用時使用把該值調大,能加快命令的執行
wal_buffer768kB日志緩存區的大小可以降低IO,如果遇上比較多的并發短事務,應該和commit_delay一起用
checkpoint_segments3設置wal log的最大數量數(一個log的大小為16M)默認的48M的緩存是一個嚴重的瓶頸,基本上都要設置為10以上
checkpoint_completion_target0.5表示checkpoint的完成時間要在兩個checkpoint間隔時間的N%內完成能降低平均寫入的開銷
commit_delay0事務提交后,日志寫到wal log上到wal_buffer寫入到磁盤的時間間隔。需要配合commit_sibling能夠一次寫入多個事務,減少IO,提高性能
commit_siblings5設置觸發commit_delay的并發事務數,根據并發事務多少來配置減少IO,提高性能

測試數據

  • 測試的數據是運行3次,取平均值。

  • 關閉fsync是為了更好的體現出其他參數對PostgreSQL的影響。

參數修改值事務總數tps(包括建立連接)tps(不包括建立連接)
默認設置
8464140.999792141.016182
fsyncoff925711479.9697551480.163355
shared_buffers1GB1000551635.7592751635.977823
work_mem10MB1012091665.8048121666.04082
effective_cache_size2GB982091636.7331521636.970271
maintenance_work_mem512MB929301548.0292331548.223108
checkpoint_segments321959823265.9953266.471064
checkpoint_completion_target0.91943903239.4064933239.842596
wal_buffer8MB1986393310.2414583310.724067
恢復fsyncoff11157185.883542185.909849
commit_delay && commit_siblings10 && 411229187.103538187.131747

總結


事務總數tps(包括建立連接)tps(不包括建立連接)
優化前8464140.999792141.016182
優化后(fsync=on)11229187.103538187.131747
優化后(fsync=off)1986393310.2414583310.724067

在fsync打開的情況下,優化后性能能夠提升30%左右。因為有部分優化選項在默認的SQL測試語句中沒有體現出它的優勢,如果到實際測試中,提升應該不止30%。 測試的過程中,主要的瓶頸就在系統的IO,如果需要減少IO的負荷,最直接的方法就是把fsync關閉,但是這樣就會在掉電的情況下,可能會丟失部分數據。

-------------------------------------------------------------------------------

pg中性能相關常調參數

??

?

參數名稱參數意義優化思路
shared_buffers數據庫服務器將使用的共享內存緩沖區大小,該緩沖區為所有連接共用。從磁盤讀入的數據(主要包括表和索引)都緩存在這里。提高該值可以減少數據庫的磁盤IO。
work_mem聲明內部排序和哈希操作可使用的工作內存大小。該內存是在開始使用臨時磁盤文件之前使用的內存數目。數值以kB為單位的,缺省是?1024 (1MB)。請注意對于復雜的查詢,可能會同時并發運行好幾個排序或者哈希操作,每個都會使用這個參數聲明的這么多內存,然后才會開始求助于臨時文件。同樣,好幾個正在運行的會話可能會同時進行排序操作。因此使用的總內存可能是?work_mem?的好幾倍。ORDER BY, DISTINCT?和mergejoin都要用到排序操作,而哈希操作在哈希連接、哈希聚集和以哈希為基礎的?IN?子查詢處理中都會用到。該參數是會話級參數。執行排序操作時,會根據work_mem的大小決定是否將一個大的結果集拆分為幾個小的和?work_mem差不多大小的臨時文件寫入外存。顯然拆分的結果是導致了IO,降低了排序的速度。因此增加work_mem有助于提高排序的速度。通常設置時可以逐漸調大,知道數據庫在排序的操作時不會有大量的寫文件操作即可。該內存每個連接一份,當并發連接較多時候,該值不宜過大。
effective_cache_size優化器假設一個查詢可以使用的最大內存(包括pg使用的和操作系統緩存),和shared_buffer等內存無關,只是給優化器生成計劃使用的一個假設值。設置稍大,優化器更傾向使用索引掃描而不是順序掃描,建議的設置為可用空閑內存的25%,這里的可用空閑內存指的是主機物理內存在運行pg時得空閑值。
maintenance_work_mem這里定義的內存只是在CREATE INDEX, VACUUM等時用到,因此用到的頻率不高,但是往往這些指令消耗比較多的資源,因此應該盡快讓這些指令快速執行完畢。在數據庫導入數據后,執行建索引等操作時,可以調大,比如512M。
wal_buffers日志緩沖區,日志緩沖區的大小。

兩種情況下要酌情調大:1.單事務的數據修改量很大,產生的日志大于wal_buffers,為了避免多次IO,調大該值。

2.系統中并發小數據量修改的短事務較多,并且設置了commit_delay,此時wal_buffers需要容納多個事務(commit_siblings個)的日志,調大該值避免多次IO。
commit_delay事務提交后,日志寫到wal_buffer上到wal_buffer寫到磁盤的時間間隔。如果并發的非只讀事務數目較多,可以適當增加該值,使日志緩沖區一次刷盤可以刷出較多的事務,減少IO次數,提高性能。需要和commit_sibling配合使用。
commit_siblings觸發commit_delay等待的并發事務數,也就是系統的并發活躍事務數達到了該值事務才會等待commit_delay的時間才將日志刷盤,如果系統中并發活躍事務達不到該值,commit_delay將不起作用,防止在系統并發壓力較小的情況下事務提交后空等其他事務。應根據系統并發寫的負載配置。例如統計出系統并發執行增刪改操作的平均連接數,設置該值為該平均連接數。
fsync設置為on時,日志緩沖區刷盤時,需要確認已經將其寫入了磁盤,設置為off時,由操作系統調度磁盤寫的操作,能更好利用緩存機制,提高IO性能。該性能的提高是伴隨了數據丟失的風險,當操作系統或主機崩潰時,不保證刷出的日志是否真正寫入了磁盤。應依據操作系統和主機的穩定性來配置。
autovacuum是否開啟自動清理進程(如開啟需要同時設置參數stats_start_collector = on,stats_row_level = on,),整理數據文件碎片,更新統計信息。如果系統中有大量的增刪改操作,建議打開自動清理進程,這樣一方面可以增加數據文件的物理連續性,減少磁盤的隨機IO,一方面可以隨時更新數據庫的統計信息,使優化器可以選擇最優的查詢計劃得到最好的查詢性能。如果系統中只有只讀的事務,那么關閉自動清理進程。
autovacuum_naptime自動清理進程執行清理分析的時間間隔應該根據數據庫的單位時間更新量來決定該值,一般來說單位時間的更新量越大該時間間隔應該設置越短。由于自動清理對系統的開銷較大,該值應該謹慎配置(不要過小)。
bgwriter_delay后臺寫進程的自動執行時間后臺寫進程的作用是將shared_buffer里的臟頁面寫回到磁盤,減少checkpoint的壓力,如果系統數據修改的壓力一直很大,建議將該時間間隔設置小一些,以免積累的大量的臟頁面到checkpoint,使checkpoint時間過長(checkpoint期間系統響應速度較慢)。
bgwriter_lru_maxpages后臺寫進程一次寫出的臟頁面數依據系統單位時間數據的增刪改量來修改
bgwriter_lru_multiplier后臺寫進程根據最近服務進程需要的buffer數量乘上這個比率估算出下次服務進程需要的buffer數量,在使用后臺寫進程寫回臟頁面,使緩沖區能使用的干凈頁面達到這個估計值。依據系統單位時間數據的增刪改量來修改。



?

2。 tpcc/壓力測試時pg常調參數示例:

?

max_connections = 200

?

#根據數據量盡量調大shared_buffer值,把所有數據都放到內存中更好,

#曾經在32G內存的服務器上把shared_buffert調到了26G?

#wal_buffers根據產生的wal日志量也適當設大點

shared_buffers=1200MB?
wal_buffers = 2000kB

#work_mem要適可而止,每個連接都要用這么大的

work_mem = 1024kB

#一般做做檢查點的時間長于壓力測試的時間,這樣性能數據會更好,等壓力測試完了再去做檢查點吧。

Checkpoint_timeout=120min
?

bgwriter_delay = 10ms??
bgwriter_lru_maxpages = 75
full_page_writes = off
log_min_messages = fatal

#壓力測試時由于高并發等鎖的時間可以長一些

deadlock_timeout = 3s

?

#平時實踐有些應用中把位圖掃描和順序掃描關了性能會更好?

enable_bitmapscan = off
enable_seqscan = off

?

#如果是只讀的壓力測試,還可以關掉沒事的后臺寫進程等


轉載于:https://blog.51cto.com/shuizhuan/1660632

總結

以上是生活随笔為你收集整理的postgresql调优的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。