CentOS7系统下PostgreSQL数据库内核参数调优参考,可以把以下代码保存为shell脚本,使用root运行。
#!/bin/bash
#此参数限制并发未完成的异步请求数目,应该设置避免I/O子系统故障。
sysctl fs.aio-max-nr='1048576'
echo "fs.aio-max-nr=1048576" >> /etc/sysctl.conf
#该参数决定了系统中所允许的文件句柄最大数目,文件句柄设置代表linux系统中可以打开的文件的数量
sysctl fs.file-max='76724600'
echo "fs.file-max=76724600" >> /etc/sysctl.conf
#设置单个进程可分配的最大文件数
sysctl fs.nr_open='20480000'
echo "fs.nr_open=20480000" >> /etc/sysctl.conf
sysctl vm.mmap_min_addr='65536'
echo "vm.mmap_min_addr=65536" >> /etc/sysctl.conf
#第一列,表示每个信号集中的最大信号量数目,PG至少需要17
#第二列,表示系统范围内的最大信号量总数目,ceil((max_connections + autovacuum_max_workers + 4) / 16) * 17加上用于其它应用的空间
#第三列,表示每个信号发生时的最大系统操作数目。
#第四列,表示系统范围内的最大信号集总数目,PG至少需要ceil((max_connections + autovacuum_max_workers + 4) / 16)
#(第一列)*(第四列)=(第二列)
sysctl kernel.sem='4096 2097152000 2097152 512000'
echo "kernel.sem=4096 2097152000 2097152 512000" >> /etc/sysctl.conf
#设置系统范围内共享内存段的最大数量
sysctl kernel.shmmni='819200'
echo "kernel.shmmni=819200" >> /etc/sysctl.conf
#发送套接字缓冲区大小的默认值(以字节为单位)。
sysctl net.core.wmem_default='262144'
echo "net.core.wmem_default=262144" >> /etc/sysctl.conf
#接收套接字缓冲区大小的默认值(以字节为单位)。
sysctl net.core.rmem_default='262144'
echo "net.core.rmem_default=262144" >> /etc/sysctl.conf
#发送套接字缓冲区大小的最大值(以字节为单位)。
sysctl net.core.wmem_max='4194304'
echo "net.core.wmem_max=4194304" >> /etc/sysctl.conf
#接收套接字缓冲区大小的最大值(以字节为单位)。
sysctl net.core.rmem_max='4194304'
echo "net.core.rmem_max=4194304" >> /etc/sysctl.conf
#用来限制监听(LISTEN)队列最大数据包的数量,超过这个数量就会导致链接超时或者触发重传机制。
sysctl net.core.somaxconn='4096'
echo "net.core.somaxconn=4096" >> /etc/sysctl.conf
#当网卡接收数据包的速度大于内核处理的速度时,会有一个队列保存这些数据包。这个参数表示该队列的最大值。
sysctl net.core.netdev_max_backlog='10000'
echo "net.core.netdev_max_backlog=10000" >> /etc/sysctl.conf
#表示允许重用TIME_WAIT状态的套接字用于新的TCP连接,默认为0,表示关闭。
sysctl net.ipv4.tcp_tw_reuse='1'
echo "net.ipv4.tcp_tw_reuse=1" >> /etc/sysctl.conf
#表示允许系统打开的端口范围。
sysctl net.ipv4.ip_local_port_range='40000 65535'
echo "net.ipv4.ip_local_port_range=40000 65535" >> /etc/sysctl.conf
#防火墙相关配置,最大跟踪连接数,默认 nf_conntrack_buckets * 4
#如果关闭防火墙,参数可以直接忽略。
sysctl net.netfilter.nf_conntrack_max='1200000'
echo "net.netfilter.nf_conntrack_max=1200000" >> /etc/sysctl.conf
sysctl net.nf_conntrack_max='1200000'
echo "net.nf_conntrack_max=1200000" >> /etc/sysctl.conf
#以下是TCP socket的读写缓冲区的设置,每项里面都有三个值,第一个值是缓冲区最小值,中间值是缓冲区的默认值,最后一个是缓冲区的最大值,
#虽然缓冲区的值不受core缓冲区的值的限制,但是缓冲区的最大值仍旧受限于core的最大值。
sysctl net.ipv4.tcp_rmem='8192 87380 16777216'
echo "net.ipv4.tcp_rmem=8192 87380 16777216" >> /etc/sysctl.conf
sysctl net.ipv4.tcp_wmem='8192 87380 16777216'
echo "net.ipv4.tcp_wmem=8192 87380 16777216" >> /etc/sysctl.conf
#用来定义内存管理的范围,第一个值的意思是当page数低于该值时,TCP并不认为他为内存压力,第二个值是进入内存的压力区域时所达到的页数,
#第三个值是所有TCP sockets所允许使用的最大page数,超过该值后,会丢弃后续报文。
#page是以页面为单位的,为系统中socket全局分配的内存容量。
sysctl net.ipv4.tcp_mem='8388608 12582912 16777216'
echo "net.ipv4.tcp_mem=8388608 12582912 16777216" >> /etc/sysctl.conf
#每一个连接请求(SYN报文)都需要排队,直至本地服务器接收,
#该变量就是控制每个端口的 TCP SYN队列长度的。如果连接请求多于该值,则请求会被丢弃。
sysctl net.ipv4.tcp_max_syn_backlog='4096'
echo "net.ipv4.tcp_max_syn_backlog=4096" >> /etc/sysctl.conf
#表示系统同时保持TIME_WAIT套接字的最大数量。如果超过此数,TIME_WAIT套接字会被立刻清除并且打印警告信息。
#之所以要设定这个限制,纯粹为了抵御那些简单的DoS攻击,不过,过多的TIME_WAIT套接字也会消耗服务器资源,甚至死机。
sysctl net.ipv4.tcp_max_tw_buckets='262144'
echo "net.ipv4.tcp_max_tw_buckets=262144" >> /etc/sysctl.conf
#即允许分配所有的物理内存,而不管当前的内存状态如何。
#使用这个设置会增大内存超载的可能性,但也可以增强大量使用内存任务的性能。
sysctl vm.overcommit_memory='1'
echo "vm.overcommit_memory=1" >> /etc/sysctl.conf
#vm.overcommit_memory='2' 即拒绝等于或者大于CommitLimit
#CommitLimit:最大能分配的内存(个人理解仅仅在vm.overcommit_memory=2时候生效),具体的值是
#SWAP内存大小 + 物理内存 * overcommit_ratio / 100
#vm.overcommit_ratio默认50
sysctl vm.overcommit_ratio='90'
echo "vm.overcommit_ratio=90" >> /etc/sysctl.conf
#默认值为30,代表当剩余物理内存低于70%(70=100-30)时,开始使用交换空间
#vm.swappiness='0'
#最大限度使用物理内存,然后才是swap空间,即在内存不足的情况下–当剩余空闲内存低于vm.min_free_kbytes时,使用交换空间。
#在内存紧张时优先减少RAM里文件系统缓存的大小,而非使用swap空间,这是一种提高数据库性能的推荐做法。
sysctl vm.swappiness='0'
echo "vm.swappiness=0" >> /etc/sysctl.conf
#这个参数控制内核的脏数据刷新进程pdflush的运行间隔。单位是 1/100 秒。缺省数值是500,也就是 5 秒。
#如果你的系统是持续地写入动作,那么实际上还是降低这个数值比较好,这样可以把尖峰的写操作削平成多次写操作。
sysctl vm.dirty_writeback_centisecs='100'
echo "vm.dirty_writeback_centisecs=100" >> /etc/sysctl.conf
#这个参数控制文件系统的文件系统写缓冲区的大小,单位是百分比,表示系统内存的百分比,表示当写缓冲使用到系统内存多少的时候,开始向磁盘写出数据。
#增大会使用更多系统内存用于磁盘写缓冲,也可以极大提高系统的写性能。但是,当你需要持续、恒定的写入场合时,应该降低其数值
sysctl vm.dirty_ratio='95'
echo "vm.dirty_ratio=95" >> /etc/sysctl.conf
#它的真实意义是占(MemFree + Cached - Mapped)的百分比。达到这个上限后会唤醒pdflush把这些脏数据刷新到磁盘,
#在把脏数据输入磁盘之前所有写IO会被阻塞。所以如果这个值设的过大,则会周期的出现一个写IO峰值,
#而且这个峰值持续比较长时间,在这段时间内用户的写IO会被阻塞。对于一些业务场景需要把这个值设置的小写,把峰值写IO平分为多次小的写IO。
sysctl vm.dirty_background_ratio='10'
echo "vm.dirty_background_ratio=10" >> /etc/sysctl.conf
#数据库操作系统用户twdb limits配置
echo "twdb soft core unlimited" >> /etc/security/limits.conf
echo "twdb hard nproc unlimited" >> /etc/security/limits.conf
echo "twdb soft nproc unlimited" >> /etc/security/limits.conf
echo "twdb hard memlock unlimited" >> /etc/security/limits.conf
echo "twdb hard nofile 1024000" >> /etc/security/limits.conf
echo "twdb soft memlock unlimited" >> /etc/security/limits.conf
echo "twdb soft nofile 1024000" >> /etc/security/limits.conf
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。