基於CentOS7資料庫性能優化(Postgresql) 1、 磁碟 a) Barriers IO i. 通過查看linux是否載入libata,確定是否開啟(一般操作系統都是預設開啟) [root@localhost ~]# dmesg |grep libata [ 2.063756] libat ...
基於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 檢查是否生效