安装配置最佳实践
安装配置最佳实践
本节详细讲解PostgreSQL数据库在CentOS 7.X下的最佳配置实践
1.禁止SELinux
SELinux的限制很多,为了操作方便,我们会关闭SELinux,关闭的方法是修改/etc/selinux/config:
SELINUX=disabled
##该设置需要重启机器才能生效。
检查是否已关闭SELinux的方法是运行“getenforce命令”:
[root@pg01 ~]# getenforce
Disabled
##如果输出是“Disabled”则表示已经关闭。
2.关闭防火墙
关闭防火墙也是为了操作方便。Linux下有两种防火墙,一种是Iptables防火墙,另一种是Firewalld防火墙。
1.禁止Iptables防火墙的方法如下:
systemctl stop iptables
systemctl disable iptables
2.关闭Firewalld防火墙的方法如下:
systemctl stop firewalld
systemctl disable firewalld
3.ulimit的配置
在/etc/security/limits.conf文件中配置ulimit:
* soft nofile 65536
* hard nofile 65536
* soft nproc 131072
* hard nproc 131072
* soft memlock -1
* hard memlock -1
有的时候只是在limits.conf中配置ulimit不一定会生效,这是因为/etc/security/limits.d下的文件如果有相同的配置项,则这些文件中的配置项的优先级更高,这会以该目录下的文件配置为准,所以还需要看该目录下的文件,通常该文件名形式为“XX-nproc.conf”,如“20-nproc.conf”,文件内容通常如下:
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
* soft nproc 4096
root soft nproc unlimited
当发现上面的“* soft nproc 4096”中的值“4096”小于我们在“limits.conf”中配置的“131072”时,可把配置文件“20-nproc.conf”中的值也改成“131072”,文件的内容如下:
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
* soft nproc 131072
root soft nproc unlimited
修改完成后退出终端的窗口,重新登录机器,用ulimit -Ha命令看ulimit的硬限制的设置是否已生效:
[postgres@pg01 ~]$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 3895
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 65536
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 131072
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
上面代码中的“open files”对应着配置文件中的“* hard nofile 65536”,“max user processes”对应着配置文件中的“* hard nproc 131072”,“max locked memory”对应着配置文件中的“* hard memlock -1”,看上面的值与我们配置的值是否一致,如果一致,说明配置已生效,如果不一致,需要检查原因。
用“ulimit -Sa”命令看ulimit的软限制的设置是否已生效:
[postgres@pg01 ~]$ ulimit -Sa
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 3895
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 65536
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 131072
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
上面代码中的“open files”对应着配置文件中的“* soft nofile 65536”,“max user processes”对应着配置文件中的“* soft nproc 131072”,“max locked memory”对应着配置文件中的“* soft memlock -1”,看上面的值与我们配置的值是否一致,如果一致,说明配置已生效,如果不一致,需要检查原因。
4.XFS文件系统的配置
使用XFS文件系统,在/etc/fstab中配置文件系统的示例如下:
/dev/sde /data xfs nodev,discard,noatime,inode64,allocsize=16m 0 0
其中,数据库的数据文件建到“/data”目录下。因为这是一块SSD,所以在mount选项中加了“discard”。
5.块设备的I/O调度策略设置
将块设备的I/O调度策略设置为“deadline”,命令如下:
grubby --update-kernel=ALL --args="elevator=deadline"
该设置需要重新启动机器后才能生效。
6.设置内存大页
CentOS 7.X下禁止透明大页的命令如下:
grubby --update-kernel=ALL --args="transparent_hugepage=never"
设置页面大小为1GB的大页共32GB,命令如下:
grubby --update-kernel=ALL --args="default_hugepagesz=1G hugepagesz=1G hugepages=32"
上述两项设置需要重新启动机器后才能生效。
7.sysctl.conf的配置
sysctl.conf的配置命令如下:
vm.swappiness=0
vm.overcommit_memory=2
vm.overcommit_ratio=85
vm.dirty_background_ratio=1
vm.dirty_ratio=2
kernel.shmmax = 274877906944
kernel.shmall = 67108864
kernel.sem=20 13000 20 650
kernel.sysrq = 1
kernel.core_uses_pid = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.msgmni = 2048
net.ipv4.tcp_syncookies = 1
net.ipv4.ip_forward = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.conf.all.arp_filter = 1
net.ipv4.ip_local_port_range = 1025 65535
net.core.netdev_max_backlog = 10000
net.core.rmem_max = 2097152
net.core.wmem_max = 2097152
net.core.somaxconn = 2048
需要运行“sysctl -p”使上面的配置生效。
上面的一些重要配置项的说明如下。
- ·vm.swappiness=0:让操作系统尽量不要使用SWAP。对于数据库主机来说,尽量不使用SWAP能获得更好的性能。
- ·vm.overcommit_memory=2:将此参数设置为“2”是为了防止OOM。此参数的默认值是“0”,0表示程序分配的内存可以大于实际拥有的物理内存,因为分配内存时,只是分配的虚拟内存,还没有实际分配物理内存。如果分配的总虚拟内存超过物理内存,当所有的程序都马上要使用内存,而物理内存不够时,操作系统只能kill掉一些程序,释放一些内存才能保证其他程序继续运行,这就出现了OOM Kill。如果OOM杀掉的是PostgreSQL数据库的进程,数据库就会宕机。OOM本质上是内存“超售”导致的。如果把该参数设置成“2”,再配合下面的参数vm.overcommit_ratio就可以避免OOM。当此参数配置为“2”时,程序分配内存时,如果内核发现分配的内存超过了限制,则会直接报错,而不会到内存不够用时再kill掉占内存大的进程。如果此参数设置为“2”,内存不够时,PostgreSQL数据库只是无法建立新连接,而不会发生OOM Kill,这就安全了很多。内核认为能允许分配内存的最大值是总共的物理内存×vm.overcommit_ratio%+SWAP空间。我们这台机器的内存是256GB,SWAP空间是32GB,256×0.85+32=249.6GB,算出来的结果没有超过总内存,这是安全的。所以当把该参数设置为“2”时,还需要根据总内存和SWAP空间的大小,设置合理的vm.overcommit_ratio的参数值。
- ·vm.overcommit_ratio=85:见上面的描述。
- ·vm.dirty_background_ratio=1:是一个百分比,默认值是“10%”,当文件系统的缓存中保存的脏页数超过总内存的这个百分比时,开始后台刷脏数据。默认值太大,当内存中有大量的脏数据时,会产生很大的性能抖动。为了保证系统的稳定性,建议把该值设置成一个较小的值。
·vm.dirty_ratio=2:与上一参数类似,只是前台刷脏页的百分比,默认值是“20%”,也太大,建议设置成“1%”。 - ·kernel.shmmax=274877906944:设置成与总内存一样。
- ·kernel.shmall=67108864:设置成总内存的页面数。
- ·kernel.sem=20 13000 20 650 个参数。
8.数据库参数配置
对数据库进行如下参数配置
listen_addresses = '*' # what IP address(es) to listen
on;
port = 5432 # (change requires restart)
max_connections = 3000 # (change requires restart)
superuser_reserved_connections = 10 # (change requires restart)
tcp_keepalives_idle = 5 # TCP_KEEPIDLE, in seconds;
tcp_keepalives_interval = 5 # TCP_KEEPINTVL, in seconds;
tcp_keepalives_count = 3 # TCP_KEEPCNT;
shared_buffers = 32GB
huge_pages = on
# you actively intend to use prepared transactions.
work_mem = 4MB
maintenance_work_mem = 128MB
autovacuum_work_mem = 256MB
wal_writer_delay = 10ms
max_wal_size = 50GB
min_wal_size = 40GB
checkpoint_timeout = 15min
max_locks_per_transaction =256
checkpoint_completion_target = 0.9 # checkpoint target
duration, 0.0 - 1.0
effective_cache_size = 256GB
log_destination = 'csvlog' # Valid values are
combinations of
logging_collector = on # Enable capturing of stderr and
csvlog
log_directory = 'pg_log' # directory where log files
are written,
log_truncate_on_rotation = on # If on, an existing log
file with the
log_rotation_age=3d
log_rotation_size=100MB
autovacuum = on # Enable autovacuum subprocess?
'on'
log_autovacuum_min_duration = 0
autovacuum_max_workers = 10 # max number of autovacuum
subprocesses
autovacuum_naptime = 1min # time between autovacuum
runs
autovacuum_vacuum_threshold = 500 # min number of row updates
before vacuum
autovacuum_analyze_threshold = 500 # min number of row updates
before analyze
autovacuum_vacuum_scale_factor = 0.2 # fraction of table size
before vacuum
autovacuum_analyze_scale_factor = 0.1 # fraction of table size
before analyze
autovacuum_vacuum_cost_delay = 2ms #
autovacuum_vacuum_cost_delay
autovacuum_vacuum_cost_limit = 5000 # default vacuum cost limit
wal_compression = on
lock_timeout=600000
statement_timeout=3600000
log_min_error_statement=error
log_min_duration_statement=5s
temp_file_limit=20G #控制临时表空间size
vacuum_cost_limit = 5000 #sas 盘2000,SSD为10000
vacuum_cost_delay = 2ms
checkpoint_completion_target=0.9
random_page_cost = 1.1
log_checkpoints =on
log_statement = 'ddl'
idle_in_transaction_session_timeout = 600000 # 自动清理 idle session
track_io_timing = on
track_functions = all
shared_preload_libraries = 'pg_stat_statements'
track_activity_query_size = 2048
pg_stat_statements.max = 10000
pg_stat_statements.track = all
pg_stat_statements.track_utility = off
pg_stat_statements.save = on
archive_mode = 'on'
archive_command = '/usr/bin/true'
一些重要配置项的说明如下。
·配置了TCP的keepalive选项,tcp_keepalives_idle、tcp_keepalives_interval、tcp_keepalives_count,让一些已出问题的网络连接能尽快结束。
·shared_buffers=32GB:需要与大页内存配置保持一致。
·huge_pages=on:从默认值“try”改为“on”,这样会强制保证数据使用大页内存,如果操作系统配置的大页有问题,则数据库无法启动,这样可以快速发现问题。
·max_wal_size=50GB:指定WAL日志的空间上限。保证WAL不会占用太多的空间。
·min_wal_size=40GB:该值通常不要设置得太小,容易导致Standby失效。
·checkpoint_timeout=15min:保证能及时发生Checkponit。
·autovacuum_max_workers=10:worker设置得多一些,可以保证AutoVacuum能尽快地完成。
·autovacuum_vacuum_cost_delay=2ms:为防止AutoVacuum对系统产生太大冲击,AutoVacuum每完成一定的工作量,就休眠2ms再重新开始工作。
·autovacuum_vacuum_cost_limit=5000:因为是SSD,所以建议把该值设置得高一些。
·vacuum_cost_limit=5000:因为是SSD,所以建议把该值设置得高一些。
·vacuum_cost_delay=2ms:为防止Vacuum对系统产生冲击,Vacuum每完成一定的工作量后,休眠2ms再开始工作。
·log_destination='csvlog':设置成csv格式,便于分析日志。
·lock_timeout=600000:当锁超过600秒时,则放弃锁,防止长时间持有锁。如果你有长时间的DDL或DML语句操作,请根据实际情况把该参数值改大。
·statement_timeout=3600000:允许SQL最多运行1小时,请根据实际情况调整此参数。
·idle_in_transaction_session_timeout=600000:清理长时间(10分钟)的idle的事务连接,请根据实际情况调整此参数。
·archive_mode='on':打开归档。
·archive_command='/usr/bin/true':这里虽然设置了,但设置的是一个无用的命令,主要是因为修改archive_mode需要重启数据库服务器,而修改
archive_command不需要重启数据库服务器。所以先配置一个无用的命令
“/usr/bin/true”,等真正需要归档时,再把archive_command设置成实际的归档命令,这样就不需要重启机器了。
·random_page_cost=1.1:因为是SSD,将该值调小,以便于执行计划尽量走索引,而不走全表扫描。
·shared_preload_libraries='pg_stat_statements':pg_stat_statements插件可以监控SQL的执行时间等性能统计数据,最好装上。
9.磁盘预读参数
在内存中读取数据比从磁盘中读取数据要快很多,增加linux内核预读,对于大量顺序读
取的操作,可以有效减少I/O的等待时间。
• 查看sda磁盘的预读设置
# /sbin/blockdev --getra /dev/sda
16384 # 16384单位是个,也就是16384个扇区
• 查看sda的预读的大小
# cat /sys/class/block/sda/queue/read_ahead_kb
8192 #单位是kb 16384 * 512 = 8k
注:传统硬盘扇区的大小是512字节。但在高级格式化硬盘中,物理扇区大小是4096字节。
• 查看所有磁盘的预读设置
# blockdev --report
• 动态设置sda的预读为8192个扇区
# /sbin/blockdev --setra 8192 /dev/sda
# /sbin/blockdev --getra /dev/sda
注:当存储环境中用到多路径聚合软件时,请修改多路径聚合软件聚合之后的磁盘名称。

浙公网安备 33010602011771号