> 文章列表 > POSTGRESQL LINUX 与 PG有关的内存参释义

POSTGRESQL LINUX 与 PG有关的内存参释义

POSTGRESQL  LINUX 与 PG有关的内存参释义

POSTGRESQL  LINUX 与 PG有关的内存参释义

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共700多人左右 1 + 2)。

POSTGRESQL 与LINUX 系统是密切联系的,与其他的数据库相比对于操作系统的依赖可以加更加二字。那么关于POSTGRESQL 与LINUX 在内存方面的内存参数有什么关联性,今天这篇需要说一说。

多进程间通信常用的技术手段包括共享内存、消息队列、信号量等等基于POSTGRESQL 需要操作系统提供IPC 的功能,来进行信息的共享内存和信号量的共享,在PG 9.3之前的版本是使用system v 的信号量,所以以下的设置对于PG 来说是比较重要的,但在后续的版本中,使用system_v 的方式被转移到了 POSIX 信号量。

而在使用system_v 的时候是需要操作系统支持的,如果POSTGRESQL 超过使用这个在操作系统中的限制的情况下,POSTGRESQL 数据库会产生错误。

所以这里为了避免在POSTGRESQL 工作中产生报错等问题对于 LINUX 的操作系统的 system V IPC 的配置进行一些调整。

这里有一个通用性的设置,对于部分其他的数据库也有效

kernel.shmmax =物理内存的一半   

kernel.shmmni = 4096 这个内核参数用于设置系统范围内共享内存段的最大数量

kernel.shmall = 其值应不小于shmmax/page_size缺省值就是2097152

通过 ipcs -lm

举例 32G 内存的主机可以将上面的配置参数设置为

kernel.shmmax =17179869184

kernel.shmall = 4194304

或者使用命令将参数打入到配置文件中

sudo sysctl -w kernel.shmmax=17179869184

sudo sysctl -w kernel.shmall=4194304

POSTGRESQL  LINUX 与 PG有关的内存参释义

下面的脚本可以对于这两个值,进行自动的计算,根据两个值,将值填入到/etc/systcl.conf 中

#!/bin/bash

# simple shmsetup script

page_size=`getconf PAGE_SIZE`

phys_pages=`getconf _PHYS_PAGES`

shmall=`expr $phys_pages / 2`

shmmax=`expr $shmall \\* $page_size`

echo kernel.shmmax = $shmmax

echo kernel.shmall = $shmall

Simple shmsetup script for PostgreSQL · GitHub

在Linux 使用中 overcommit 的含义是允许操作系统分配超出自身物理内存的内存给应用进行使用,在超分内存的情况下,主要使用的概念就是虚拟内存,这里超分的内存包括了物理内存和 swap的内存,这意味着进程可以启动,分配比可用内存更多的内存,并且一切都正常工作。一旦分配了大量内存的进程开始在内存中分页,从而开始增加其实际内存占用,它将强制使用超过可用内存的内存交换量,如果它已经耗尽了交换,那么就没有更多的内存了,那就不得不求助于内存耗尽杀手(OOM杀手)来释放内存。与之有关的两个参数是

Overcommit_memory

Overcommit_ratio

Overcommit_memory

  • 0 –     overcommit  0 是默认值默认情况下,内核通过估计可用内存量和过大的失败请求来执行启发式内存过度使用处理。但是,由于内存是使用启发式而不是精确算法分配的,因此使用此设置可能会导致内存过载。

  • cat     /proc/sys/vm/overcommit_memory 

  • 通过如上的命令来对当前的overcommit进行值的确认

  • 1 –     always overcommit  

  • 如果值为1 的情况下,不会考虑内存的实际情况,而是一直进行分配,这样很可能会超分,导致问题。当该参数设置为1时,内核不执行内存过度使用处理。这增加了内存过载的可能性,但提高了内存密集型任务的性能

  • 2 –     never overcommit  当该参数设置为2时,内核将拒绝大于或等于总可用交换空间和overcommit_ratio中指定的物理RAM百分比之和的内存请求。这可以降低内存过度使用的风险,但仅建议交换区域大于物理内存的系统使用。

  • 如果设置为2 ,内存进行超分也是可以的,实际就要看第二个参数了 Overcommit_memory  , overcommit_memory 才是是否可以进行超分的关键和限制

我们通过下面的命令可以进行相关overcommit部分的实际分配的监控

free -m | awk '$1 ~/[Mm]em/ {print $2}' ; sysctl -a 2>/dev/null | grep vm.over; grep -i commitlimit /proc/meminfo

POSTGRESQL  LINUX 与 PG有关的内存参释义

Vm.swappiness

Vm.swappiness的意义在于内存和磁盘虚拟文件之间的配比,每种数据库的设置建议值是不一样的,MYSQL 的建议值是 1, ORACLE的建议值在10 ,这里如果你的POSTGRESQL 是基于OLTP 的业务的情况下,不建议此值超过10,建议在5左右。

这里系统默认的值在 30 ,我们可以将这个值进行修改

echo 10 > /proc/sys/vm/swappiness

sysctl vm.swappiness

POSTGRESQL  LINUX 与 PG有关的内存参释义

vm.dirty_background_ratio的主要功能是总体内存的百分比的脏数据可以保留在内存中。

举例如果 vm.dirty_background_ratio = 10  总体内存8G 则800MB 可以驻留脏数据,后面脏数据在写入到磁盘

sysctl -a | grep dirty

vm.dirty_ratio是POSTGRESQL  LINUX 与 PG有关的内存参释义一种强制当脏数据超过设置的百分比,必须将内存的数据刷新到磁盘上,在刷新的过程中其他的IO操作会被暂时停止,直到这些脏数据写入到磁盘上,如果达到这个比率可能会导致IO的卡顿。

POSTGRESQL  LINUX 与 PG有关的内存参释义

POSTGRESQL  LINUX 与 PG有关的内存参释义

__________________________________________________________________

已经连着4期说爱好,目前没有人反馈说去掉这个,所以本期继续说说,汽车知识,今天普及一下汽车油耗高的问题,油耗高的问题和数据库性能的问题其实看似不搭噶,实际上两种问题是相似的地方,这个地方就是,混合型,复杂性的问题导致这样的情况发生。

那么汽车油耗高,原因有那些

1   车型原因,车重,你不能要求沃尔沃 S90的油耗  和  奔驰 SMART 的油耗一样的少,因为车辆的车重不一样,那么油耗必然是不一样得,所以问油耗高,先看看车重

2  迎风面的问题,这个问题可以这样看,同样重量的轿车和SUV ,为什么SUV 的油耗高,这很简单哈,因为汽车在开动的时候,是要和风阻来做抵抗的,所以你的车的迎风面越大,那么就越费油,开的越快,迎风面面积越大,那么你的车越费油

3  轮胎的问题,轮胎的胎压越低,低于铭牌的标准,同时你的车胎越宽,那么必然会越费油 ,同时还有一个问题就是轮胎的软硬度导致你油耗的高低。越硬的轮胎越省油,同时防爆胎是费油的这点毫无疑问。(不明白为什么,自己百度一下什么是防爆胎)

4  脚法的问题,实际上很多车型一样的车,你开 6个油,别人开 10个油,这是很有可能的,这就和驾驶习惯有关,如你喜欢大脚起步,还是和裹着小脚老太太的速度起步,还有刹车的频率,频率越高,油耗越高,所以如果你是小脚老太太的脚法,+ 不怎么使用刹车,那么你很有可能是马路上的一个风景 ---- 马路移动路障

5  车速的控制,每个车都有自己省油的速度,但如果你问什么速度普遍省油,那么一般来说 日系车 在60公里-80公里是省油的可能性大,而欧系的一般在70-90公里是省油的(这是有原因的避免  车系的互喷,就不解释了)

6   开窗,夏天在开车如果车速超过60 开窗户,将会没30分钟,增加你一个油耗。

当然这里说原因还没有总结完,不过你能看完上面的这堆,并理解和执行,那么你的车的油耗会较低。

POSTGRESQL  LINUX 与 PG有关的内存参释义