基於linux(CentOS7)數據庫性能優化(Postgresql)


基於CentOS7數據庫性能優化(Postgresql)

1、  磁盤

a)         Barriers IO

                         i.              通過查看linux是否加載libata,確定是否開啟(一般操作系統都是默認開啟)

[root@localhost ~]# dmesg |grep libata

[    2.063756] libata version 3.00 loaded.

b)         禁止atime,讀文件時不再更新atime,修改/etc/fstab 對應的磁盤,可以用cat命令檢查是否生效。(傳說作用很大,待證實)

                         i.              配置如下

[root@localhost ~]# cat /etc/fstab

 

/dev/mapper/centos-root       /    xfs     noatime,nodiratime        0 0

 

                       ii.              檢查是否生效

[root@localhost postgres]# date

2019年 06月 27星期四 09:05:19 CST

[root@localhost postgres]# cat logfile >/dev/null

[root@localhost postgres]# stat logfile

  文件:"logfile"

  大小:1562            塊:8          IO 塊:4096   普通文件

設備:fd00h/64768d      Inode:51924132    硬鏈接:1

權限:(0600/-rw-------)  Uid:( 1001/postgres)   Gid:( 1001/postgres)

環境:unconfined_u:object_r:user_home_t:s0

最近訪問:2019-06-26 17:07:33.536434918 +0800

最近更改:2019-06-20 13:31:55.101630817 +0800

最近改動:2019-06-20 13:31:55.101630817 +0800

c)         調整磁盤預讀大小

                         i.              查看預讀大小

[root@localhost postgres]# blockdev --getra /dev/sda

4096(每個扇區512bytes, 4096*512=2M)

                       ii.              調整預讀大小

[root@localhost postgres]# blockdev --setra  8192/dev/sda

d)         IO調度器(影響不大)

Linux 2.6 內核包含4個IO調度器,分別是Noop IO scheduler、Anticipatory IO scheduler、Deadline IO scheduler 與 CFQ IO scheduler。

 

Noop IO scheduler 是一個簡化的調度程序,它只作基本的合並與排序。

 

Anticipatory IO scheduler是目前內核中默認的IO調度器,它擁有非常好的性能,在Linux2.5內核中它就相當引人注意,在與Linux2.4內核(無該調度器)進行對比測試中,Linux2.4內核中多項以分鍾為單位完成的任務,它則是以秒為單位來完成的,正因為如此它成為了目前Linux 2.6內核中的默認的IO調度器。Anticipatory IO scheduler的缺點是比較龐大與復雜,在一些特殊的情況下,特別是在數據吞吐量非常大的數據庫系統中它會變得比較緩慢。

 

Deadline IO scheduler是針對Anticipatory IO scheduler的缺點進行改善而來的,表現出的性能幾乎與Anticipatory IO scheduler一樣好,但是比Anticipatory 要小巧。

 

CFQ IO schedule為系統內的所有任務分配相同的帶寬,提供一個公平的工作環境,它比較適合桌面環境。事實上在測試中它也有不錯的表現,mplayer、xmms等多媒體播放器與它配合的相當好,回放平滑,幾乎沒有因訪問磁盤而出現的跳幀現象。

 

數據庫常用:Deadline IO scheduler

 

查看修改命令:

 

$ cat /sys/block/sda1/queue/scheduler

[noop] anticipatory deadline cfq

 

#修改為cfq

$ echo 'cfq'>/sys/block/sda1/queue/scheduler

 

#立刻生效

$ cat /sys/block/sda1/queue/scheduler

noop anticipatory deadline [cfq]

2、  內存

a)         關閉虛擬內存

[root@localhost postgres]# cat /proc/sys/vm/swappiness

0

范圍(0-100),值越大虛擬內存越大,所以此處設置為0,但是是單次生效。

永久生效,修改/etc/sysctl.conf,最后添加:

vm.swappiness = 0

然后執行sysctl –p,配置生效。

b)         調整overcommit

查看命令cat /proc/sys/vm/overcommit_memory

 

可選值:0、1、2。
0, 表示內核將檢查是否有足夠的可用內存供應用進程使用;如果有足夠的可用內存,內存申請允許;否則,內存申請失敗,並把錯誤返回給應用進程。
1, 表示內核允許分配所有的物理內存,而不管當前的內存狀態如何。
2, 表示內核允許分配超過所有物理內存和交換空間總和的內存。(例如:vm.overcommit_memeory=2 vm.overcommit_ratio=95(配對參數,默認為1)  可分配內存為 虛擬內存+0.95*物理內存)

 

三種修改方式如下:

(1)編輯/etc/sysctl.conf ,改vm.overcommit_memory=1,然后sysctl -p使配置文件生效

 (2)sysctl vm.overcommit_memory=1

 (3)echo 1 > /proc/sys/vm/overcommit_memory

 

 

3、  Postgresql配置優化

a)         Shared_buffers,共享緩存區大小,1/4到1/2

b)         Work_mem ,每個進程單獨分配的內存,用於排序和hash等操作。     

c)         Maintence_work_mem,也是為進程分配內存,主要用於 vacuum.

d)         Huge_pages = try,開啟PG大頁內存。

                         i.              配置linux大頁內存大小,首先查看大頁每頁大小:

[root@localhost postgres]# grep Huge /proc/meminfo 

AnonHugePages:     65536 kB

HugePages_Total:       0

HugePages_Free:        0

HugePages_Rsvd:        0

HugePages_Surp:        0

Hugepagesize:       2048 kB(每頁2M)

 

配置大頁緩存大小,/etc/sysctl.conf

vm.nr_hugepages= Shared_buffers/ Hugepagesize(可以適當大一些。)

 

sysctl –p 生效。

 

cat /proc/sys/vm/nr_hugepages 檢查是否生效

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM