暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

PostgreSQL数据库Linux内核参数调优

原创 贺晓群 2020-01-09
3268

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
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
1人已赞赏
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论