PG数据库优化概述

0    62    3

👉 本文共约17423个字,系统预计阅读时间或需66分钟。

PostgreSQL数据库优化参考一:优化概述

优化方向(方向)

1. 设计优化:硬件选型、架构设计(单机、主从、集群)、应用设计(模块设计)。

2. 操作系统优化:共享内存段大小、文件缓存大小、网络配置、文件系统、存储缓存、异步IO等。

3. I/O优化:使用表空间、存储对象分布,文件存储分布等。

4. 内存优化:数据库共享内存、维护工作内存、工作内存、临时内存。

5. 应用优化:应用存储对象调优、代码调优、SQL调优(慢SQL,TopSQL)。

6. 对象优化:表分区、物化视图、碎片整理、索引重建等。

7. 竞争优化:锁等待。

优化目标(目标)

1.性能稳定、高效

2.改善用户的使用体验

3.帮助客户省钱

性能目标:CPU利用率或IOPS需要降到多少;

响应时间RT需要从多少毫秒降低到多少;每秒处理的SQL数或QPS/TPS需要提高到多少。

思考:更安全是不是优化?

优化思路(方法)

主要有以下两种思路

\1. “The fastest way to do something is don‘t do it”,把一些无用的步骤或用处不大的步骤去掉。

\2. 就是做同样的一件事情,能够更快地做。

ü 最简单的方法:换硬件,让数据库跑在更快的硬件上。但换硬件,一般都是最后的选择;

ü 最有效的方法:优化算法,如让SQL走到更优的执行计划上。

设计优先原则

一个已运行的数据库系统中,如果前期设计不合理,性能不高,后期在优化时,会很痛苦的,有可能永远无法达到高性能。因此,在新建一套数据库系统前,最先做的事应是设计优化。良好的设计能最大限度地发挥系统的性能。

衡量指标

响应时间RT:衡量数据库系统与用户交互式多久能够发出响应。

吞吐量QPS/TPS:衡量在单位时间里可以完成的数据库任务。

常见依赖因素

环境:机器配置、网络带宽和时延、HA架构(同步/异步复制)、数据库参数(刷盘参数等)。

业务场景:表定义、数据量、SQL、事务隔离级别、并发度。

调优类型

预定义的:DBA制定调优的目标,来达到预定的效果;

主动式的:周期性去采集信息,目标不明确,主要范围是集中在数据库实例级别;

被动式的:客户抱怨出现问题,这类优化主要集中在SQL语句级。

主动式性能调优的基本步骤

\1. 详细了解业务特性和优化需求,调优应用;

\2. 设计合理的性能优化目标;

\3. 收集并记录当前性能信息(包括数据库和操作系统);

\4. 确定当前操作系统和数据库的性能瓶颈;

\5. 结合性能指标、用户描述和性能信息分享瓶颈原因;

\6. 确定合适的优化方法优化相关性能问题;

\7. 逐步实施优化方法,记录实施更改过程及场景;

\8. 在业务稳定运行后重新收集性能信息,确定是否达到优化要求;

\9. 如果没有成功,重复前面的步骤,直到满足优化目标。

平衡性能与数据库健壮性的需求

1.Raid方式(读多,可使用raid5,写多,可使用raid10)

2.频繁的检查点

3.备份数据文件

4.执行归档

5.异地容灾等

PostgreSQL数据库优化参考二:硬件、操作系统优化

说明:以下主要内容适用于Redhat\Centos,理论知识具有一定通用性。

CPU

优化建议:

1. 高的CPU 主频可以提供更快的运算速度,更多的核心数则能大大提高并发能力

2. 使用超线程、多路服务器,充分发挥并行计算性能

注意:有一些服务器在BIOS 中可以设置CPU 的性能模式,可能的模式有高性能模式、普通模式和节能模式,在数据库服务器中,不建议使用节能模式。这种模式会在系统比较空闲的时候对CPU 主动降频,达到降温和节电的目的,但对于数据库来说,则会产生性能波动

内存和网络通常比较充裕不会是瓶颈,但是需要密切监控

原文链接:https://blog.csdn.net/longailk/article/details/120349607

相关知识:

1. 超线程

超线程技术把多线程处理器内部的两个逻辑内核模拟成两个物理芯片,让单个处理器就能使用线程级的并行计算,进而兼容多线程操作系统和软件。超线程技术充分利用空闲CPU资源,在相同时间内完成更多工作。

2. 多路服务器

单路服务器:服务器的主板上面只能安装一块cpu,以后不能再加cpu了;

双路服务器(DP CPU):可上二个CPU服务器;

四路的cpu、双路的cpu比单路CPU很大的区别在于多了SMP,对称多处理技术,能把处理的内容平衡到两个CPU上。

内存

优化建议:

1 使用大内存,充分利用内存缓存快速读写优势、*提升数据缓存命中率。*

2. 禁用swap

当内存不足时,linux会自动使用swap,将部分内存数据存放到磁盘中,这样会使性能下降,为了性能考虑推荐关掉。

3. 关闭透明大页、关闭NUMA

透明大页( Transparent HugePages )在运行时动态分配内存,而运行时的内存分配会有延误,对于数据库管理系统来说并不友好,建议关闭透明大页;

NUMA 架构会优先在请求线程所在的CPU 的local 内存上分配空间,如果local 内存不足,优先淘汰local 内存中无用的页面,这会导致每个CPU 上的内存分配不均,虽然可以通过配置NUMA 的轮询机制缓解,但对于数据库管理系统仍不又好,建议关闭NUMA 。

4. 配置大页Hugepage

5. 配置共享内存参数

SHMALL:用于定义系统范围的共享内存页总页数的内核参数,以字节为单位。如果SHMMAX配置错误,则在尝试使用initdb命令初始化PostgreSQL集群以及使用pg_ctl这类操作时可能会出错。

kernel.shmall = physical RAM size / pagesize #### Pagesize is got from "getconf PAGESIZE" command

SHMMAX:用于定义一个Linux进程可以分配的单个共享内存段的最大大小的内核参数,以字节为单位。

kernel.shmmax = 1/2 of physical RAM

SHMMNI:定义了系统级别的共享内存段的最大数量,采用默认值4096即可。每个PG数据库集群至少2个共享内存段\

kernel.shmmni = 4096 #默认值

5. 配置共享内存参数\

相关知识:

1. Huge Pages和Transparent Huge Pages

Linux 下的大页分为两种类型:标准大页(Huge Pages)和透明巨页(Transparent Huge Pages)。

\1) 标准大页(Huge Pages)是从 Linux Kernel 2.6 后被引入的。目的是用更大的内存页面(memory page size)以适应越来越大的系统内存,让操作系统可以支持现代硬件架构的大页面容量功能

\2) 透明巨页(Transparent Huge Pages)缩写为 THP,透明超大页面(THP)在 RHEL 6 中默认情况下对所有应用程序都是启用的。内核试图尽可能分配巨大的页面,主内核地址空间本身被映射为巨大的页面,减少了内核代码的 TLB 压力。内核将始终尝试使用巨页来满足内存分配。如果没有可用的巨大页面(例如由于物理连续内存不可用),内核将回退到正常的 4KB 页面。THP 也是可交换的(不像 hugetlbfs)。这是通过将大页面分成更小的 4KB 页面来实现的,然后这些页面被正常地换出。

两者区别在于大页的分配机制,标准大页管理是预分配方式,而透明巨页管理则是动态分配方式。目前透明巨页与传统大页混合使用会出现一些问题,导致性能问题和系统重启。ORACLE 官方不建议在使用 RedHat 6, OEL 6, SLES 11 and UEK2 kernels 时开启透明巨页(THP),因为透明巨页存在一些问题。

Oracle也是重度内存使用应用,当SGA配置较大时,建议设置HUGEPAGE。Oracle 建议当SGA大于或等于8GB时,使用huge page。

传统4kb大小的页管理方式有什么问题?

通过我们上面的分析可以看出,linux的默认页大小是4k,也就意味着如果物理内存很大,则页表的条目会很多,因为页表是在内存中维护的,也就意味着占用的内存会比较大,同时也会影响CPU的检索效率。

Hugepage的优势是什么?

\1) 页表的条目会减少,内存占用更少,提供访问速度。

\2) cpu的TLB可以缓存的物理地址空间更大,提升了TLB的命中率,降低了CPU的负载。

\3) hugepage还有一个比较重要的优势就是它是No Swappable(不可交换的)的。也就是常驻内存,不会被交换出去的,这对于重度依赖内存的应用,对于数据库是十分重要的。

2. VM参数(内存与换页策略

vm.swappiness:可能影响数据库性能的内核参数。此参数用于控制Linux系统上将页面在swap分区和内存间进行交换的行为。此参数值值的范围为0到100。0表示禁用交换,最大限度使用物理内存,然后才使用swap分区,100表示积极使用swap分区进行交换。通过将此参数设置为较低的值可以获得良好的性能,推荐将此值设置为10。要永久设置此参数值,同样需要在/etc/sysctl.conf中进行修改。\

RHEL 5 and 6上,该参数默认值为60。在 RHEL 7上,该参数默认值为30,可以通过以下命令查看:

cat /proc/sys/vm/swappiness

60

这种情况下,内存在使用到40%的时候,就开始使用交换分区。这样会导致系统I/O增大,同时出现大量页面的交换,极大影响系统的性能,所以应该对该参数进行调整。

注:将vm.swappiness的值设置为1可以在不禁用交换的条件下进行最少量的交换。

vm.overcommit_memory和vm.overcommit_ratio

应用程序获取内存并在不再需要时释放内存。但在某些情况下,一个应用程序会获取大量内存并且不会释放它,这可能会唤醒OOM killer。

vm.overcommit_memory:表示overcommit检查和分配策略。值可以是0(default)、1、2,以下是vm.overcommit_memory参数可能取到的值数的说明:

ü 0:用户申请更多内存时,系统会判断剩余可用内存大小,如果可用内存不足就会失败。(试探性分配)

ü 1:用户申请内存时,系统不进行任何检查,允许超量使用内存,直到内存用完为止。(超分配)

ü 2:用户一次申请的内存大小不允许超过可用内存的大小。设置为2可以更加精确地了解内存overcommitting的情况。(超分配时做检查)

通常情况下设置vm.overcommit_memory=2,即不让系统超申请。如果该值为0,表示申请的内存可以超过物理机内存。当大家都开始使用的时候,则会发生OOM,将一些进程给kill掉,这在数据库中是比较危险的情况,因此建议将 vm.overcommit_memory设为2。

vm.overcommit_ratio:表示文件缓存脏块回写策略,决定了系统可用内存的大小。其值为0到100,表示允许内核分配的内存超过实际物理内存的百分比。

除此之外,需要设置vm.overcommit_ratio= 90,需要根据实际情况设置。当设置完这两个值后,可以申请的内存不超过Commit的值,见下面的公式:

RHEL5:

Commit = swap + (overcommit_ratio/100) * physical memory

RHEL6, 7:

Commit = swap + (overcommit_ratio/100) * (physical memory - hugepage tlb)

当内存使用率达到此数字时,将无法分配内存。/proc/meminfo 中Committed_AS显示了当前系统中已经committed 的内存大小。

公式内容参考链接:https://access.redhat.com/solutions/20985

例如:一个256G内存的机器,16G Swap,应该把vm.overcommit_ratio= 95,这样256*95%+16=254G,内存申请不可超过254G,如果超过的话则申请失败。

这两个参数的值可通过以下命令查看:

$ cat /proc/sys/vm/overcommit_memory

0

$ cat /proc/sys/vm/overcommit_ratio

50

操作参考:

1. 禁用swap

swapoff - a

2. 关闭透明大页(transparent_hugepage)、numa,加上前面的默认IO调度

vim /boot/grub.conf

elevator=deadline numa=off transparent_hugepage=never

示例:在环境Centos 7.8,关闭numa和透明大页

# cat /etc/default/grub

GRUB_TIMEOUT=5

GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"

GRUB_DEFAULT=saved

GRUB_DISABLE_SUBMENU=true

GRUB_TERMINAL_OUTPUT="console"

GRUB_CMDLINE_LINUX="spectre_v2=retpoline rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet numa=off transparent_hugepage=never ipv6.disable=1"

GRUB_DISABLE_RECOVERY="true"

# grub2-mkconfig -o /etc/grub2.cfg --重新生成启动配置文件

# reboot --重启生效

# dmesg | grep -i numa --验证1

# cat /proc/cmdline --验证2

3. 配置大页(Hugepage)

1)查看Linux hugepage的页大小。

# grep Hugepage proc/meminfo

Hugepagesize: 2048 kB

2)估算PostgreSQL实例需要的Huge Page使用量。

vm.nr_hugepages=shared_buffers/Hugepagesize=128GB/2M

3)设置Linux huge page页数。

sysctl -w vm.nr_hugepages=67537

将此设置添加到/etc/sysctl.conf,以便在重启后重新应用它。

echo 65537> /proc/sys/vm/nr_hugepagescat >> /etc/sysctl.conf <<'EOF'vm.nr_hugepages=65537EOF

sysctl -p

\4) postgresql开启大页配置。

huge_pages = on # on, off, or try

# 设置为try的话,会先尝试huge page,如果启动时无法锁定给定数目的大页,则不会使用huge page

#PostgreSQL中大页面的默认行为是尽可能使用它们并且在失败时转回到正常页面。要强制使用大页面,你可以在postgresql.conf中把huge_pages设置成on。注意此设置下如果没有足够的大页面可用,PostgreSQL将会启动失败。一般建议默认值try即可。

5)启动数据库。

pg_ctl start

\6) 查看当前使用了多少huge page。

cat /proc/meminfo |grep -i huge

AnonHugePages: 6144 kB

HugePages_Total: 67537 ## 设置的HUGE PAGE

HugePages_Free: 66117 ## 这个是当前剩余的,但是实际上真正可用的并没有这么多,因为被PG锁定了65708个大页

HugePages_Rsvd: 65708 ## 启动PG时申请的HUGE PAGE

HugePages_Surp: 0

Hugepagesize: 2048 kB ## 当前大页2M

4. 配置共享内存参数(SHMALL、SHMMAX)

方法一:

永久设置参数值,请在/etc/sysctl.conf中进行修改。

vi /etc/sysctl.conf

根据公式计算赋予的值:

kernel.shmall = physical RAM size / pagesize

kernel.shmmax = 1/2 of physical RAM

#其它参数配置参考\

#此参数限制并发未完成的异步请求数目,应该设置避免I/O子系统故障\

fs.aio-max-nr = 1048576\

#该参数决定了系统中所允许的文件句柄最大数目,文件句柄设置代表linux系统中可以打开的文件的数量\

fs.file-max = 76724600\

kernel.sem = 20 13000 20 650

# 信号量, ipcs -l 或 -u 查看,每16个进程一组,每组需要17个信号量。从左至右依次是 #SEMMSL SEMMNS SEMOPM SEMMNI

SEMMSL 单个信号集中容纳最大信号数量

SEMMNS 整个系统中所有信号的最大数量

SEMOPM 在单个信号集中可操作的最大信号数量

SEMMNI 信号集的最大值:进程数/16

net.core.netdev_max_backlog = 10000

net.core.rmem_default = 262144

# The default setting of the socket receive buffer in bytes.

net.core.rmem_max = 4194304

# The maximum receive socket buffer size in bytes

net.core.wmem_default = 262144

# The default setting (in bytes) of the socket send buffer.

net.core.wmem_max = 4194304

设置参数值,然后执行以下指令生效

sysctl -p

方法二:

方法三:

sysctl命令可用于临时更改参数的值。

举例如下:

# 获取SHMMAX值

$ sudo sysctl kernel.shmmax

kernel.shmmax = 4278190079

# 获取SHMALL值

$ sudo sysctl kernel.shmall

kernel.shmall = 4278190079

# 设置SHMMAX值

$ sudo sysctl -w kernel.shmmax=16777216

kernel.shmmax = 16777216

可以使用ipcs命令来查看当前值

ipcs -lm

------ Shared Memory Limits --------

max number of segments = 4096

max seg size (kbytes) = 4177919

max total shared memory (kbytes) = 17112760316

min seg size (bytes) = 1

存储

优化建议:

1. 利用存储阵列的缓存提升数据读写效率;

2. 使用Raid5,发挥连续写方面的性能优势。

相关知识:

1. 写cache

cache(写入缓存), cache已经是整个存储的核心所在,就是中低端存储,也有很大的cache存在,包括最简单的raid卡,一般都包含有几十,甚至几百兆的Raid cache。

如果作为写,一般存储阵列只要求写到cache就算完成了写操作,所以,阵列的写是非常快速的,在写cache的数据积累到一定程度,阵列才把数据刷到磁盘,可以实现批量的写入,至于cache数据的保护,一般都依赖于镜相与电池(或者是UPS)。

如果读能在cache中命中的话,将减少磁盘的寻道,因为磁盘从寻道开始到找到数据,一般都在6ms以上,而这个时间,对于那些密集型io的应用可能不是太理想。但是,如果cache能命中,一般响应时间则可以在1ms以内。两者应该相差3个数量级(1000倍)。

2. Raid10 VS Raid 5

RAID 1+0 : RAID 1+0也称为RAID 10,它使用磁盘镜像和条带化的组合。数据通常先镜像,然后条带化。先条带化再镜像也可以完成相同的任务,但它的容错性不如前者。

img

RAID 5 : RAID 5使用奇偶校验磁盘条带化。这些数据在RAID组中的所有磁盘上都有条带,并带有在磁盘故障时重建数据所需的奇偶性信息。RAID 5是最常见的RAID方法,因为它在性能和可用性之间取得了良好的平衡。RAID 5至少需要三个物理磁盘。

img

\3. RAID10和RAID5性能的区别:

1)RAID10的利用率是50%,而RAID5的利用率是75%;

2)RAID10的安全性高于RAID5;

3)在连续写方面的性能,RAID5比RAID10会更好一些。

硬盘

优化建议:

1. 使用SAS接口磁盘,发挥读写双通道性能优势。*SAS硬盘支持双向全双工模式,为同时发生的读写操作提供了两路活动通道。*

2. 使用SSD高速固态硬盘,读写热数据,提升数据库事务处理效率。譬如事务日志利用SSD盘存储。

最先到达瓶颈的,通常是磁盘IO

1. 建议使用固定存储SSD

如目前使用广泛的SATA SSD 和PCie SSD注意区分消费级SSD和企业级SSD

2. 使用外部存储设备加载到服务器也是比较常见的,例如SAN (存储区域网络)和NAS (网络接入存储) 。

使用SAN 设备时通过块接口访问,对服务器来说就像访问本地磁盘一样;

NAS 则是使用标准文件协议进行访问,例如NFS 等。

原文链接:https://blog.csdn.net/longailk/article/details/120349607\

相关知识:

1. SATA接口:SATA是Serial AT Attachment的缩写,即串行ATA接口,是将主机总线适配器连接到大容量存储设备(如硬盘驱动器,光驱和固态驱动器)的计算机总线接口。Serial ATA采用串行连接方式,串行ATA总线使用嵌入式时钟信号,具备了更强的纠错能力,还具有结构简单、支持热插拔的优点。

因为SATA技术的飞速发展以及多方面的优势,才会让更多的人考虑能否存在一种方式可以将SATA与SCSI两者相结合,这样就可以同时发挥两者的优势了。在这种情况下SAS应运而生。

2. SAS接口:(Serial Attached SCSI)即串行连接SCSI,是新一代的SCSI技术,连接小型计算机系统接口,采用串行技术以获得更高的传输速度,并通过缩短连结线改善内部空间等。SAS是并行SCSI接口之后开发出的全新接口。此接口的设计是为了改善存储系统的效能、可用性和扩充性,并且提供与SATA硬盘的兼容性。

3. SATA VS SAS

性能: 相比SATA,SAS在磁盘性能上更占优势。主要得益于强大SCSI指令集(包括SCSI指令队列)、双核处理器,以及对硬件顺序流处理的支持。SAS硬盘支持双向全双工模式,为同时发生的读写操作提供了两路活动通道。SATA只能提供单通道和半双工模式,无疑弱了不少。

应用场景: SATA盘多为民用、家用类,也有企业用,不过多用于入门级。 因此SAS盘多属于企业级(服务器),提供15k和10k的产品,连续读取和iops都比较高,而SATA则主要民用,企业级只有入门的近线盘采用。

容量: SATA盘多用于大容量(4T) SAS盘多用于小容量(600G)当然也有容量上T的但是价格就比较昂贵。 SAS接口中是包含供电线(一体式)

4. SSD固态硬盘

SATA接口的SSD

PCIE接口的SSD

NVME:NVM代表非易失性存储器(non-volatile memory)的首字母缩略字,这是固态硬盘(SSD)的常见的闪存形式。

文件系统

优化建议:

1. XFS更多适用的特大文件的系统快速存储,ext4在小文件的系统或系统存储带宽有限的情况下表现的更好。

2. 禁用ext4的日志功能后有少许的性能提升。Ext3及Ext4日志模式:data=writeback,ordered, journal,建议使用:data=ordered

动态关闭和打开日志功能后可能需要对文件系统进行fsck检查,避免出错:

fsck.ext4 -f /dev/sdd1

3. 如果你需要超高的性能,那么你可以用挂载选项-o barrier=0来关闭barrier功能,比如:mount /dev/sda2 -o barrier=0 /data。

4. 为了提高系统的性能,我们可以在读取文件时不修改文件的atime属性。

相关知识:

\1. Linux 文件系统列表

文件系统

描 述

Ext

Linux 中最早的文件系统,由于在性能和兼容性上具有很多缺陷,现在已经很少使用

Ext2

是 Ext 文件系统的升级版本,Red Hat Linux 7.2 版本以前的系统默认都是 Ext2 文件系统。于 1993 年发布,支持最大 16TB 的分区和最大 2TB 的文件(1TB=1024GB=1024x1024KB)

Ext3

是 Ext2 文件系统的升级版本,最大的区别就是带日志功能,以便在系统突然停止时提高文件系统的可靠性。支持最大 16TB 的分区和最大 2TB 的文件

Ext4

是 Ext3 文件系统的升级版。Ext4 在性能、伸缩性和可靠性方面进行了大量改进。Ext4 的变化可以说是翻天覆地的,比如向下兼容 Ext3、最大 1EB 文件系统和 16TB 文件、无限数量子目录、Extents 连续数据块 概念、多块分配、延迟分配、持久预分配、快速 FSCK、日志校验、无日志模式、在线碎片整理、inode 增强、默认启用 barrier 等。它是 CentOS 6.3 的默认文件系统

xfs

被业界称为最先进、最具有可升级性的文件系统技术**,由 SGI 公司设计,目前最新的 CentOS 7 版本默认使用的就是此文件系统。意外宕机时可以快速恢复可能被破坏的系统;强大的日志功能只要花费极地的计算和存储性能;**最大可以支持18EB的存储容量

swap

swap 是 Linux 中用于交换分区的文件系统,swap分区在系统的物理内存不够用的时候,把硬盘内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap分区中,等到那些程序要运行时,再从Swap分区中恢复保存的数据到内存中

NFS

NFS 是网络文件系统(Network File System)的缩写,是用来实现不同主机之间文件共享的一种网络服务,本地主机可以通过挂载的方式使用远程共享的资源

iso9660

光盘的标准文件系统。Linux 要想使用光盘,必须支持 iso9660 文件系统

fat

就是 Windows 下的 fatl6 文件系统,在 Linux 中识别为 fat

vfat

就是 Windows 下的 fat32 文件系统,在 Linux 中识别为 vfat。支持最大 32GB 的分区和最大 4GB 的文件

NTFS

就是 Windows 下的 NTFS 文件系统,不过 Linux 默认是不能识别 NTFS 文件系统的,如果需要识别,则需要重新编译内核才能支持。它比 fat32 文件系统更加安全,速度更快,支持最大 2TB 的分区和最大 64GB 的文件

ufs

Sun 公司的操作系统 Solaris 和 SunOS 所采用的文件系统

proc

Linux 中基于内存的虚拟文件系统,用来管理内存存储目录 /proc

sysfs

和 proc —样,也是基于内存的虚拟文件系统,用来管理内存存储目录 /sysfs

tmpfs

也是一种基于内存的虚拟文件系统,不过也可以使用 swap 交换分区

Swap

swap分区在系统的物理内存不够用的时候,把硬盘内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap分区中,等到那些程序要运行时,再从Swap分区中恢复保存的数据到内存中

2. XFS局限性

\1) XFS是一个单节点文件系统,如果需要多节点同时访问需要考虑使用GFS2文件系统

\2) XFS支持16EB文件系统,而redhat仅支持100TB文件系统

\3) XFS较少的适用在单线程元数据密集的工作负荷,在单线程创建删除巨大数量的小文件的工作负荷下,其他文件系统(ext4)表现的会更好一些

\4) xfs文件在操作元数据时可能会使用2倍的CPU资源,在CPU资源有限制的情况下可以研究使用不同文件系统

\5) xfs更多适用的特大文件的系统快速存储,ext4在小文件的系统或系统存储带宽有限的情况下表现的更好

3. Barrier

大多数当前流行的Linux文件系统,包括EXT3和EXT4,都将文件系统barrier作为一个增强的安全特性。**barrier功能在EXT4文件系统中是默认启用的(除非你的操作系统更改了这个默认设置)。**

该功能背后的思路很简单:在写入新的数据块到磁盘之前,会先将元数据写入日志。预先将元数据写入日志可以保证在写入真实数据前后一旦发生错误,日志功能能很容易地回滚到更改之前的状态。这个方法确保了不会发生文件系统崩溃的情况。

Barriers请求之前的所有在队列中的请求必须在Barries请求开始前被结束,并持久化到非易失性介质中。Barriers请求之后的I/O需要等到其写入完成后才能得到执行。

可以通过/proc/mounts文件来监控文件系统barrier的当前状态;对于每一个挂载的文件系统,打开这个文件都能看到所有的挂载选项。如果你看到barrier=1,那么你的文件系统就正在使用barrier功能。

示例:

/dev/sda1 /boot ext4 rw,seclabel,relatime,barrier=1,data=ordered 0 0/dev/mapper/luks-3e67401f-44c6-4a27-a1bf-cdf0dcf45f65 /home ext4 rw,seclabel,noatime,barrier=1,data=ordered 0 0

使用barrier保护的风险之一是,在系统中断时,数据会留在缓存中,而永不会写入文件系统。一个简单的电池备份控制器可以避免这个问题。当服务器使用的这个控制器出故障了,磁盘控制器仍然能保证变更操作,这充分排除了barrier使用的需要。

使用barrier的另一个不利之处在于,你需要付出降低性能的代价。

另外,XFS有个写入屏障,在有缓存的情况下开启barrier功能,保证数据安全,如果没有缓存可以关闭这个参数 mount -o nobarrier /dev/device /mount/point

关闭方式

ext3/ext4 mount -o barriers=0 /dev/sdb1 /data/pgdata

XFS mount -o nobarrier /dev/sdb1 /data/pgdata

Barrier的问题在于:它不能应用于所有条件下。如果设备映射器作为存储层的优先级使用,那么文件系统barrier就无法工作了,因为设备映射器不支持barrier。

所以,哪怕你的文件系统默认支持barrier,还是无法在逻辑卷、软RAID或者多路径磁盘上运行该功能(RED HAT和所有相关的Linux版本都将barrier作为默认选项)。

4. Noatime

当文件被创建,修改和访问时,Linux系统会记录这些时间信息。

当系统的读文件操作频繁时,记录文件最近一次被读取的时间信息,将是一笔不少的开销。

可以通过在加载文件系统时使用notime选项来做到这一点。

使用noatime,可以编辑/etc/fstab文件,示例如下:

proc /proc proc defaults 0 0

none /dev/pts devpts gid=5,mode=620 0 0

/dev/md0 /boot ext3 defaults 0 0

/dev/md1 none swap sw 0 0

/dev/md2 / ext3 defaults,noatime 0 0

要使设置立即生效,可运行:

mount -o remount /

/dev/sdd1 / xfs *noatime**,errors=remount -ro 0 1*

IO scheduler(调度)

优化建议:

1. 许多 Linux 发行版的默认调度器,CFQ是内核默认选择的I/O调度器。对于通用的服务器是最好的选择,CFQ均匀地分布对I/O带宽的访问。如果是SSD的话,建议使用NOOP。

查看设备当前的 I/O 调度器:

假设磁盘名称是 /dev/sdc

# cat /sys/block/sdc/queue/scheduler

noop anticipatory deadline [cfq]

本人提供Oracle、MySQL、PG等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!

设置noop方式:

echo noop> /sys/block/sda/queue/scheduler

以上设置重启后会失效,如果永久设置,需编辑grub文件修改块设备调度策略

vi /boot/grub.conf

elevator=noop

相关知识:

Linux整体I/O体系可以分为七层,它们分别是:

1. VFS虚拟文件系统:内核要跟多种文件系统打交道,内核抽象了这VFS,专门用来适配各种文件系统,并对外提供统一操作接口。

2. 磁盘缓存:磁盘缓存是一种将磁盘上的一些数据保留着RAM中的软件机制,这使得对这部分数据的访问可以得到更快的响应。磁盘缓存在Linux中有三种类型:Dentry cache ,Page cache , Buffer cache。

3. 映射层:内核从块设备上读取数据,这样内核就必须确定数据在物理设备上的位置,这由映射层(Mapping Layer)来完成。

4. 通用块层:由于绝大多数情况的I/O操作是跟块设备打交道,所以Linux在此提供了一个类似vfs层的块设备操作抽象层。下层对接各种不同属性的块设备,对上提供统一的Block IO请求标准。

5. I/O调度层:大多数的块设备都是磁盘设备,所以有必要根据这类设备的特点以及应用特点来设置一些不同的调度器。

6. 块设备驱动:块设备驱动对外提供高级的设备操作接口。

7. 物理硬盘:这层就是具体的物理设备。

I/O调度层:Linux 从2.4内核开始支持I/O调度器,到目前为止有5种类型:Linux 2.4内核的 Linus Elevator、Linux 2.6内核的 Deadline、 Anticipatory、 CFQ、 Noop,其中Anticipatory从Linux 2.6.33版本后被删除了。目前主流的Linux发行版本使用Deadline、 CFQ、 Noop三种I/O调度器。

主要调度器概要:

Deadline - 针对延迟的调度器,每一个 I/O,都有一个最晚执行时间。

cfq - 完全公平调度器。进程平均使用IO带宽。

noop - 通常用于内存存储的设备。

Anticipatory - 启发式调度,类似 Deadline 算法,但是引入预测机制提高性能。

Deadline

Deadline翻译成中文是截止时间调度器,是对Linus Elevator的一种改进,它避免有些请求太长时间不能被处理。另外可以区分对待读操作和写操作。DEADLINE额外分别为读I/O和写I/O提供了FIFO队列。

CFQ

CFQ全称Completely Fair Scheduler ,中文名称完全公平调度器,它是现在许多 Linux 发行版的默认调度器,CFQ是内核默认选择的I/O调度器。

它将由进程提交的同步请求放到多个进程队列中,然后为每个队列分配时间片以访问磁盘。对于通用的服务器是最好的选择,CFQ均匀地分布对I/O带宽的访问。*CFQ为每个进程和线程,单独创建一个队列来管理该进程所产生的请求,以此来保证每个进程都能被很好的分配到I/O带宽,I/O调度器每次执行一个进程的4次请求。**该算法的特点是按照I/O请求的地址进行排序,而不是按照先来后到的顺序来进行响应。简单来说就是给所有同步进程分配时间片,然后才排队访问磁盘。*

NOOP

NOOP全称No Operation,中文名称电梯式调度器,该算法实现了最简单的FIFO队列,所有I/O请求大致按照先来后到的顺序进行操作。NOOP实现了一个简单的FIFO队列,它像电梯的工作主法一样对I/O请求进行组织。它是基于先入先出(FIFO)队列概念的 Linux 内核里最简单的I/O 调度器。此调度程序最适合于固态硬盘。 --最好的食材,用最简单的烹饪方式。

vm.dirty_background_ratio和vm.dirty_background_bytes

什么是dirty pagecache?

当操作系统想读取已经写在hard-disk上的数据时,首先需要从disk读取数据,然后保存内存中,为这些数据分配的内存就叫做pagecache。

当想要修改disk上的数据时,首先仅仅在内存中进行修改,并将pagecahe中的各个page标记为dirty

什么是dirty writeback?

显然,如上所做的修改必须写入disk中,否则,操作系统关机会丢失这些更改。将dirty page中的修改写回disk的行为称为dirty writeback 或者flushing.

Writeback如何工作?

从硬盘读取数据或向硬盘写入数据的I / O操作通常被认为是耗时的。因此,内核不会浪费资源立即进行writeback,而是要等到有更多数据后才能立即刷新它们。

有几个参数可控制何时以及如何执行writeback。

最重要的是:

dirty_bytes / dirty_ratio

dirty_background_bytes / dirty_background_ratio

dirty_writeback_centisecs

dirty_expire_centisecs

writeback通常可以分为3个阶段:

第一阶段:定期:

负责flushing dirty data的kernel thread会被定期唤醒去flush那些至少或者超过dirty_expire_centisecs的dirty data,

第二阶段:Background

一旦有足够多的脏数据超过了dirtybackground *参数阈值,内核将尝试尽可能多的刷新或至少刷新到低于background参数阈值的水平。

请注意,这是在kernel flusher threads中异步完成的,虽然会产生一些开销,但不一定会影响其他应用程序的运行。(因此,名称:background)

第三阶段:Active

如果超过了基于dirty_*参数的阈值,则意味着应用程序产生的脏数据比 flusher threads设法及时回写的速度更快。为了防止内存用完,会在write()系统调用(及类似调用)中阻塞产生脏数据的tasks,并主动等待刷新数据。

Note: In RHEL 5 and earlier, the flusher threads were named pdflush. In RHEL 6 and later they are named flush-XX.

控制参数:

dirty_writeback_centisecs:

指定kernel flusher threads 被周期性唤醒的时间间隔,此参数的单位是百分之一秒,也就是厘秒(centisecond,简称cs)。也就是每隔多少厘秒kernel flusher threads 会被周期性唤醒。

dirty_expire_centisecs:

指定超过多少厘秒dirty data被视为足够老而被kernel flusher threads 周期性的writeback。

也就是超过多少厘秒dirty data会被writeback。

dirty_background_bytes / dirty_background_ratio:

指定kernel flusher threads更主动的去flush dirty data的阈值。

刷新操作在后台完成。该参数的取值范围为0到100,但是低于5的值可能无效。

大多数Linux系统上的默认值为10。

可以通过以下命令查看这两个参数的值:

postgres@hyl:/pgdata/10.2$ cat /proc/sys/vm/dirty_background_ratio

10

postgres@hyl:/pgdata/10.2$ cat /proc/sys/vm/dirty_background_bytes

0

您需要根据磁盘的速度设置vm.dirty_background_bytes的值。

这两个参数没有固定的建议取值,因为两者都取决于硬件的配置。

但是,在大多数情况下,将vm.dirty_background_ratio设置为5并将vm.dirty_background_bytes设置为磁盘速度的25%可将性能提高大约25%。

vm.dirty_ratio和dirty_bytes

这与vm.dirty_background_ratio以及dirty_background_bytes参数类似,只是刷新操作是在前台完成的,而且会阻塞应用程序。

所以vm.dirty_ratio的参数值应该设置为高于vm.dirty_background_ratio参数的值。

这将确保后台进程在前台进程之前启动,以尽可能避免阻止应用程序。

可以根据磁盘I/O负载调整两个比率之间的差异。

默认值为20,可通过以下命令进行查看:

postgres@hyl:/pgdata/10.2$ cat /proc/sys/vm/dirty_ratio

20

本节中介绍的参数并非全部适用于所有应用程序类型。某些应用程序通过调整部分参数可以获得更好的性能提升,而另一些应用程序更改相同的参数值却不会获得性能提升。

因此需要在这些参数配置和应用程序的负载之间找到良好的平衡,并且在进行调整时还必须注意操作系统的行为。

安全配置选项

优化建议:

1. 根据需要配置OS防火墙;

2. 如果没有Selinux的需求,建议禁用;

# vim /etc/sysconfig/selinux

SELINUX=disabled

SELINUXTYPE=targeted

3. 关闭不必要的OS服务。

chkconfig --list|grep on

例如 :chkconfig iscsi off

OS资源限制\

vim /etc/security/limits.conf

* soft nofile 1024000

* hard nofile 1024000

* soft nproc unlimited

* hard nproc unlimited

* soft core unlimited

* hard core unlimited

* soft memlock unlimited

* hard memlock unlimited

关注/etc/security/limits.d目录中的文件内容,会覆盖limits.conf的配置。

相关知识:

SELinux是什么?

SELinux叫做“安全增强型 Linux(Security-Enhanced Linux)”,简称 SELinux,它是 Linux 的一个安全子系统。SELinux是2.6版本的 Linux 内核中提供的强制访问控制(MAC)系统

从Linux2.6内核之后就将SELinux集成在了内核当中,其配置文件的修改都是需要重新启动操作系统才能生效的。

SELinux有什么用?

其主要作用就是最大限度地减小系统中服务进程可访问的资源(根据的是最小权限原则)。避免权限过大的角色给系统带来灾难性的结果。

该机制为进程和文件加入了除权限之外更多的限制来增强访问条件,这种方式称为强制访问控制(MAC)。

这两种方式最直观的对比就是,采用传统DAC,root可以访问任何文件,而在MAC下,就算是root,也只能访问设定允许的文件。现在主流发现的Linux版本里面都集成了SELinux机制,CentOS/RHEL都会默认开启SELinux机制。

SELinux如何关闭和开启

参考

https://pgfans.cn/a/1939
https://pgfans.cn/a/1940
https://www.modb.pro/db/330950

标签:

头像

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

9 − 8 =

 

嘿,我是小麦,需要帮助随时找我哦
  • 18509239930
  • 个人微信

  • 麦老师QQ聊天
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部
返回顶部