PostgreSQL數據庫安裝參數優化

配置Linux內核參數

  1. sysctl

注意某些參數,根據內存實際大小配置

<code># vi /etc/sysctl.conf 
 
# add by digoal.zhou
fs.aio-max-nr = 1048576
fs.file-max = 76724600
 
# 可選:kernel.core_pattern = /data01/corefiles/core_%e_%u_%t_%s.%p
# /data01/corefiles 事先建好,權限777,如果是軟鏈接,對應的目錄修改為777
 
kernel.sem = 4096 2147483647 2147483646 512000
# 信號量, ipcs -l 或 -u 查看,每16個進程一組,每組信號量需要17個信號量。
 
kernel.shmall = 107374182
# 所有共享內存段相加大小限制 (建議內存的80%),單位為頁。
kernel.shmmax = 274877906944
# 最大單個共享內存段大小 (建議為內存一半), >9.2的版本已大幅降低共享內存的使用,單位為字節。
kernel.shmmni = 819200
# 一共能生成多少共享內存段,每個PG數據庫集群至少2個共享內存段
 
net.core.netdev_max_backlog = 10000
net.core.rmem_default = 262144
# The default setting of the socket receive buffer in bytes.
net.core.rmem_max = 4194304
# The maximum receive socket buffer size in bytes
net.core.wmem_default = 262144
# The default setting (in bytes) of the socket send buffer.
net.core.wmem_max = 4194304
# The maximum send socket buffer size in bytes.
net.core.somaxconn = 4096
net.ipv4.tcp_max_syn_backlog = 4096

net.ipv4.tcp_keepalive_intvl = 20
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_time = 60
net.ipv4.tcp_mem = 8388608 12582912 16777216
net.ipv4.tcp_fin_timeout = 5
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syncookies = 1
# 開啟SYN Cookies。當出現SYN等待隊列溢出時,啟用cookie來處理,可防範少量的SYN攻擊
net.ipv4.tcp_timestamps = 1
# 減少time_wait
net.ipv4.tcp_tw_recycle = 0
# 如果=1則開啟TCP連接中TIME-WAIT套接字的快速回收,但是NAT環境可能導致連接失敗,建議服務端關閉它
net.ipv4.tcp_tw_reuse = 1
# 開啟重用。允許將TIME-WAIT套接字重新用於新的TCP連接
net.ipv4.tcp_max_tw_buckets = 262144
net.ipv4.tcp_rmem = 8192 87380 16777216
net.ipv4.tcp_wmem = 8192 65536 16777216
 
net.nf_conntrack_max = 1200000
net.netfilter.nf_conntrack_max = 1200000
 
vm.dirty_background_bytes = 409600000
# 系統髒頁到達這個值,系統後臺刷髒頁調度進程 pdflush(或其他) 自動將(dirty_expire_centisecs/100)秒前的髒頁刷到磁盤
# 默認為10%,大內存機器建議調整為直接指定多少字節
 
vm.dirty_expire_centisecs = 3000
# 比這個值老的髒頁,將被刷到磁盤。3000表示30秒。
vm.dirty_ratio = 95
# 如果系統進程刷髒頁太慢,使得系統髒頁超過內存 95 % 時,則用戶進程如果有寫磁盤的操作(如fsync, fdatasync等調用),則需要主動把系統髒頁刷出。

# 有效防止用戶進程刷髒頁,在單機多實例,並且使用CGROUP限制單實例IOPS的情況下非常有效。
 
vm.dirty_writeback_centisecs = 100
# pdflush(或其他)後臺刷髒頁進程的喚醒間隔, 100表示1秒。
 
vm.swappiness = 0
# 不使用交換分區
 
vm.mmap_min_addr = 65536
vm.overcommit_memory = 0
# 在分配內存時,允許少量over malloc, 如果設置為 1, 則認為總是有足夠的內存,內存較少的測試環境可以使用 1 .
 
vm.overcommit_ratio = 90
# 當overcommit_memory = 2 時,用於參與計算允許指派的內存大小。
vm.swappiness = 0
# 關閉交換分區
vm.zone_reclaim_mode = 0
# 禁用 numa, 或者在vmlinux中禁止.
net.ipv4.ip_local_port_range = 40000 65535
# 本地自動分配的TCP, UDP端口號範圍
fs.nr_open=20480000
# 單個進程允許打開的文件句柄上限
 
net.ipv4.tcp_max_syn_backlog = 16384
net.core.somaxconn = 16384
 
# 以下參數請注意
# vm.extra_free_kbytes = 4096000
# vm.min_free_kbytes = 2097152 # vm.min_free_kbytes 建議每32G內存分配1G vm.min_free_kbytes
# 如果是小內存機器,以上兩個值不建議設置

# vm.nr_hugepages = 66536
# 建議shared buffer設置超過64GB時 使用大頁,頁大小 /proc/meminfo Hugepagesize
# vm.lowmem_reserve_ratio = 1 1 1
# 對於內存大於64G時,建議設置,否則建議默認值 256 256 32 /<code>
  1. 使配置生效
<code>sysctl -p /<code>

配置Linux資源限制

<code># vi /etc/security/limits.conf 
 
# nofile超過1048576的話,一定要先將sysctl的fs.nr_open設置為更大的值,並生效後才能繼續設置nofile.
 
* soft nofile 1024000
* hard nofile 1024000
* soft nproc unlimited
* hard nproc unlimited
* soft core unlimited
* hard core unlimited
* soft memlock unlimited
* hard memlock unlimited /<code>

最好再關注一下/etc/security/limits.d目錄中的文件內容,會覆蓋/etc/security/limits.conf的配置。

已有進程的ulimit請查看/proc/pid/limits,例如

<code>Limit Soft Limit Hard Limit Units 
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 10485760 unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 11286 11286 processes
Max open files 1024 4096 files
Max locked memory 65536 65536 bytes

Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 11286 11286 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us /<code>

如果你要啟動其他進程,建議退出SHELL再進一遍,確認ulimit環境配置已生效,再啟動。

配置Linux防火牆

(建議按業務場景設置,這裡先清除全部規則)

<code>iptables -F 
iptables -X/<code>

配置範例:

<code># 私有網段 
-A INPUT -s 192.168.0.0/16 -j ACCEPT
-A INPUT -s 10.0.0.0/8 -j ACCEPT
-A INPUT -s 172.16.0.0/16 -j ACCEPT /<code>

SElinux

如果沒有這方面的需求,建議禁用

<code>## 臨時生效
setenforce 0/<code>
<code>## 永久生效方法,修改配置SElinux文件
# vi /etc/sysconfig/selinux
 
SELINUX=disabled
SELINUXTYPE=targeted /<code>

關閉不必要的系統服務

<code>chkconfig --list|grep on /<code>

關閉不必要的, 例如

<code>chkconfig iscsi off /<code>

配置SSD盤的IO調度策略(注意區分grub1和grub2)

1、grub1代採用這種方法:加上前面的默認IO調度,如下:

如果所有盤都是SSD,可以這樣。

<code>vi /boot/grub.conf 
 
elevator=deadline numa=off transparent_hugepage=never /<code>

2、如果只是某些盤是SSD,那麼只對這些盤設置為deadline。或者如果用的是grub2:

<code>chmod +x /etc/rc.d/rc.local 
vi /etc/rc.local
 
# 追加
 
echo deadline > /sys/block/vda/queue/scheduler
echo deadline > /sys/block/vdb/queue/scheduler
# 其他盤, ...... /<code>

關閉透明大頁

1、grub1代採用這種方法:加上前面的默認IO調度,如下:

<code>vi /boot/grub.conf 
 
elevator=deadline numa=off transparent_hugepage=never /<code>

2、grub2代,可以使用rc.local。

<code>chmod +x /etc/rc.d/rc.local  

vi /etc/rc.local
 
# 追加
 
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi /<code>

立即生效:

<code>echo never > /sys/kernel/mm/transparent_hugepage/enabled 
 
cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never] /<code>

參考文檔:

https://github.com


分享到:


相關文章: