PostgreSQL如何调整linux服务器参数

内核参数 内存管理 kernel.shmaxSHMMAX 是一个内核参数,用于定义Linux进程可以分配的单个共享内存段的最大长度。直到9.2版本,PostgreSQL使用的System V (SysV)需要设置 SHMMAX。在9.2之后,...

内核参数

内存管理

  • kernel.shmax

    • SHMMAX 是一个内核参数,用于定义Linux进程可以分配的单个共享内存段的最大长度。直到9.2版本,PostgreSQL使用的System V (SysV)需要设置 SHMMAX。在9.2之后,PostgreSQL切换到POSIX共享内存。所以现在它需要更少的System V共享内存。

    • 在9.3之前,SHMMAX 是最重要的内核参数。SHMMAX 的值以字节为单位。这两参数比较重要,而大于9.3的版本开始使用POSIX共享内存,SHMMAX和SHMALL已经不是那么重要了

    • 最大单个共享内存段大小 (建议为内存一半), >9.2的版本已大幅降低共享内存的使用,单位为字节。

  • kernel.shmall

    • 所有共享内存段相加大小限制 (建议内存的80%),单位为页。

    • max_mem0.8/4k,以64GB内存为例:kernel.shmall=ceil(64102410240.8/4)=13421773

  • kernel.shmmni = 819200

    • 一共能生成多少共享内存段,每个PG数据库集群至少2个共享内存段      

  • vm.overcommit_memory = 0 / vm.overcommit_ratio

     $ cat /proc/meminfo | grep "Commit"
     CommitLimit: 39052780 kB
     Committed_AS: 16235448 kB
    • 设置为2,禁用overcommit,会降低内存的使用效率,浪费内存资源,但是不会发生OOM。

    • 设置为1,不建议使用。

    • 设置为0,默认值,适度超发内存,但也有OOM风险。(这也是数据库经常发生OOM的原因)

    • 其中,CommitLimit指的就是overcommit的阈值,只要超过这个值,在参数设为2的情况下,系统就不允许申请内存。

    • /proc/meminfo中的 Committed_AS 表示目前操作系统所有进程已经申请的内存总大小。(申请不代表已分配)

    • 0、表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。

    • 1、无论如何,允许过度使用

    • 2、表示内核允许分配超过所有物理内存和交换空间总和的内存,但不允许超过虚拟内存限值(CommitLimit)的大小。如果您希望减小内存过度使用的风险,这个设置就是最好的。

    • 在分配内存时,允许少量over malloc,如果设置为 1,则认为总是有足够的内存,内存较少的测试环境可以使用 1

    • 官方文档设置为2是比较保守的做法,避免内存过度分配,防止oom影响Postgres

      参考: https://www.kernel.org/doc/Documentation/vm/overcommit-accounting

      vm.overcommit_ratio是可用于超额分配的内存的百分比。

    • 【CommitLimit = (Physical RAM * vm.overcommit_ratio / 100) + Swap】

    • 查看当前系统的默认阈值

  • vm.swappiness = 1

    • 内核参数vm.swappiness控制换出运行时内存的相对权重,参数值大小对如何使用swap分区有很大联系。值越大,表示越积极使用swap分区,越小表示越积极使用物理内存。默认值swappiness=60,表示内存使用率超过100-60=40%时开始使用交换分区。swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间;swappiness=100的时候表示积极使用swap分区,并把内存上的数据及时搬运到swap空间。(网上有的说,对于3.5以后的内核和RedHat 2.6.32之后的内核,设置为0会禁止使用swap,从而引发out of memory,这种情况可以设置为1。)

      需要根据服务器运行的程序类型,来设置不同的参数值。例如,对于Oracle一般设置为10;对于MySQL一般设置为1,尽可能不用swap分区。

    • 对于pg也是尽量不使用swap分区,较小的值有助于提高PostgreSQL的性能。

    • 将其设置为0,标识关闭交换分区

  • vm.min_free_kbytes = 102400

    • 确保在内存分配高峰期间 Postgres 的可用内存。

    • vm.min_free_kbytes 建议每32G内存分配1G vm.min_free_kbytes

  • Huge Pages

    • PostgreSQL仅在Linux上支持更大的页面。默认情况下,Linux使用4K的内存页,因此在内存操作太多的情况下,需要设置更大的页。通过使用大小为2 MB到1 GB的大页,可以观察到性能的提升。超大页的大小可以设置启动时间。您可以使用 cat /proc/meminfo | grep -i huge 命令在您的Linux机器上轻松检查大页的设置和利用率。

    • 配置参考

    • 对于内存超过64GB的建议设置HugePages

I/O管理

  • vm.dirty_background_bytes = 67108864

    • 设置内核开始在后台将脏数据写入磁盘的阈值。

    • 系统脏页到达这个值,系统后台刷脏页调度进程 pdflush(或其他) 自动将(dirty_expire_centisecs/100)秒前的脏页刷到磁盘        

    • 默认为10%,大内存机器建议调整为直接指定多少字节,

  • vm.dirty_bates = 536870912

    • pdflush进行调整以防止新 Linux 内核出现滞后峰值。如果缓存大小已知,建议估计为 64MB 和控制器缓存大小的 50%。否则为 8MB 和 64MB。查找(硬件 RAID)或(软件 RAID)以确定安装的控制器dmesg。scsimd

  • 另外还可以设置磁盘调度类型,普通磁盘推荐deadline,ssd推荐设置noop

网络管理

  • net.ipv4.ip_local_port_range = 10000 65535

    • 控制本地端口号的范围,运旭处理更多的客户端连接

  • net.core.netdev_max_backlog = 10000

    • 表示当每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许发送到队列的数据包最大数,默认值1000,配置10000以应对处理突发的网络流量而不会丢失数据包

  • net.ipv4.tcp_max_syn_backlog = 8192

    • 端口最大 backlog 内核限制。此参数限制 服务端应用程序 可以设置的端口最大 backlog 值 (对应于端口的 syn_backlog和 backlog 队列长度)。动机是在内存有限的服务器上限制/避免应用程序配置超大 backlog 值而耗尽内核内存。如果应用程序设置 backlog 大于此值,操作系统将自动将之限制到此值。配置为8192以应对高并发

  • net.core.somaxconn = 4096

    • 默认值128,socket监听(listen)的backlog上限。backlog是socket的监听队列:即当一个请求(request)尚未被处理或建立时,其会进入backlog。而socket server可以一次性处理backlog中的所有请求,处理后的请求不再位于监听队列中。当server处理请求较慢,以至于监听队列被填满后,新来的请求会被拒绝。

    • 该内核参数默认值一般是128(该参数限制系统中每一个端口最大的监听队列的长度),对于负载要求很高(并发要求很大)的服务程序的要求是远远不能满足的。因此,为了满足我们实际生产环境的需求,我们需要根据需求,修改该参数的默认值到2048或更多,但不是无限大,需要考虑本地的资源以及处理能力,避免服务响应时间过长影响用户体验。

  • net.ipv4.tcp_tw_reuse = 1

    • 减少高吞吐量 OLTP 应用程序的连接设置时间。

    • 1标识开启重用,允许将time-wait sockets重新用于新的tcp连接,默认0标识关闭

文件管理

  • fs.file-max = 6815744

    • Linux 内核可以分配的最大文件句柄数。在运行像 Postgres 这样的数据库服务器时,拥有足够的文件描述符对于同时处理大量连接和文件至关重要。

  • fs.aio-max-nr = 1048576

    • 可以同时拥有异步I/O请求的数目

  • fs.nr_open = 1048576

    • 单个进程允许打开的文件句柄上限

NUMA配置

  • vm.zone-reclaim_mode = 0

    • 禁用numa,或者在vmlinux中禁用,避免了pg在numa节点间回收内存对性能的影响

  • kernel.numa_balancing = 0

    • 禁用自动NUMA平衡以提高pg的CPU缓存效率

  • kernel.sched_autogroup_enabled = 0

    • 改进了pg的进程调度延迟

信号量

  • kernel.sem = 4096 2147483647 2147483646 512000            

    • 信号量, ipcs -l 或 -u 查看,每16个进程一组,每组信号量需要17个信号量。

sysctl.conf

 
 fs.file-max = 6815744
 fs.aio-max-nr = 1048576
 fs.nr_open = 1048576
 kernel.sem = 4096 2147483647 2147483646 512000
 kernel.shmall=13421773
 kernel.shmmni = 819200
 vm.overcommit_memory = 0
 vm.swappiness = 1
 vm.min_free_kbytes = 102400
 vm.dirty_background_bytes = 67108864
 vm.dirty_bates = 536870912
 net.ipv4.ip_local_port_range = 10000 65535
 net.core.netdev_max_backlog = 10000
 net.ipv4.tcp_max_syn_backlog = 8192
 net.core.somaxconn = 4096
 net.ipv4.tcp_tw_reuse = 1
 vm.zone-reclaim_mode = 0
 kernel.numa_balancing = 0
 kernel.sched_autogroup_enabled = 0
  • 这些参数可以在/etc/sysctl.conf修改然后运行:

    sysctl -p /etc/sysctl.conf

资源限制

  • 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

关闭透明大页

 vi /etc/rc.local
 
 touch /var/lock/subsys/local
 
 if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
  echo never > /sys/kernel/mm/transparent_hugepage/enabled
 fi


  • 发表于 2024-03-09 21:04
  • 阅读 ( 447 )

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
shitian
shitian

662 篇文章

作家榜 »

  1. shitian 662 文章
  2. 石天 437 文章
  3. 每天惠23 33 文章
  4. 小A 29 文章