内容


IBM Power Systems 的 EnterpriseDB Postgres Advanced Server 解决方案

本文将介绍基于 IBM POWER8 处理器的服务器上运行 Linux 的 PostgreSQL 和 EnterpriseDB Postgres Advanced Server - IBM Power 服务器的安装和调优最佳实践

Comments

本文主要将介绍使用、配置和优化在 IBM® Power Systems™ 服务器(包含最新的 IBM POWER8® 处理器技术)上运行的 PostgreSQL 和 EnterpriseDB Postgres Advanced Server。

备注:我们使用了 Red Hat Enterprise Linux (RHEL) 7.2 操作系统。本文不但会介绍如何构建和设置开源的 PostgreSQL 数据库,还会介绍如何在 IBM Power® 服务器上安装和配置 EnterpriseDB Postgres Advanced Server,以便更方便地使用它。运行 Linux® 的 IBM Power Systems 上的 EnterpriseDB Postgres Advanced Server 基于开源数据库 PostgreSQL,能够处理各种各样的高事务性和报告密集型工作负载。

一般建议

一般建议在单独的物理磁盘或独立磁盘冗余阵列 (RAID) 上拥有一个根磁盘和数据磁盘。为了消除不同存储技术之间的性能差异的影响,该数据库保留在一个 tmpfs 虚拟文件系统的内存中。

运行 Linux 的 IBM Power Systems 上的 EnterpriseDB Postgres Advanced Server

EnterpriseDB (EDB) Postgres Advanced Server 构建于 PostgreSQL 之上,后者是最先进的开源数据库之一,在以下领域拥有更多的功能和能力:

  • 性能
  • 兼容性
  • 安全性
  • 工具

借助 EDB Postgres Advanced Server 的 Oracle 兼容性特性,您可以在一个低成本、高性能的基于 PostgreSQL 的平台上使用现有的基于 Oracle 的应用程序,或者运行与您的任务关键型数据库无缝集成的邻近应用程序,而无需额外的 Oracle 许可。

请始终确保 EDB Postgres Advanced Server 安装了来自 EDB 网站的最新服务包,网址为:
https://www.enterprisedb.com/downloads/postgres-postgresql-downloads

前提条件

参阅 EDB 手册了解需要提前安装的软件。

  • 确认 /tmp 和 /(根)文件系统上有足够的分页空间和空闲空间。
  • 使用 ulimit –a 命令验证每个产品的 ulimits 设置。
  • 参阅 EnterpriseDB 调优指南和最佳实践指南。
  • EDB Postgres Advanced Server 设置需要 Java™。从 IBM developerWorks 网站下载 Java SE 版本。按照以下网站的说明安装 Java:
    https://www.ibm.com/developerworks/java/jdk/linux/download.html

设置 PostgreSQL 和 EnterpriseDB Postgres Advanced Server

EDB Postgres Advanced Server 可以使用 rpm 命令行或 yum 安装程序进行安装。推荐使用 yum 工具执行安装。

首先,需要确保已经为 RHEL 定义了一个存储库。另外,可以为 EDB rpms 定义一个 yum 存储库,以方便执行一站式安装。为基础操作系统和软件安装包定义一个 yum 存储库,可以让软件安装程序自动抓取 rpm 包(这些包是必备的)。

配置 yum 存储库

确认为基础操作系统定义的 yum 存储库,因为它很有帮助。要定义 RHEL yum 存储库,可指向一个 CD/DVD 媒体、共享网络位置或包含 RHEL 安装媒体的本地目录。测试团队使用一个本地目录定义它。yum 配置文件位于 /etc/yum.repos.d/ 目录。

可以在以下网站找到 yum 存储库的更多信息:
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/sec-Configuring_Yum_and_Yum_Repositories.html

安装 EnterpriseDB Postgres Advanced Server

可以在以下地址找到安装 EDB Postgres Advanced Server 的详细信息:
https://www.enterprisedb.com/products-services-training/products/documentation/enterpriseedition

开始安装之前,请参阅以下地址上的信息:
https://www.ibm.com/developerworks/linux/library/l-edb-getstart-trs/

将 EDB Postgres Advanced Server 安装在 Linux on Power 上,此操作可使用 EDB 提供的 yum 存储库定义 来完成。在系统中定义 yum 存储库后,使用一个简单的 install 命令安装 EDB Postgres Advanced Server。例如:
yum install ppas95-server

此命令会自动安装所有需要的必备资源,还会创建一个数据库管理员用户 enterprisedb(如果没有)。

在继续创建和配置数据库实例之前,最好先进行一下调优。在本练习中,测试团队执行了各种各样的系统调优,包括内核调优。

构建和安装 PostgreSQL Server

为了更好地使用 IBM POWER8 功能和优化编译版,推荐使用最新版的 IBM Advance Toolchain for PowerLinux。可通过一个工具下载 Advance Toolchain,该工具名为 AT Downloader。AT Downloader 是一个脚本,用于为支持的发行版下载最新版的 Advance Toolchain 包。
ftp://ftp.unicamp.br/pub/linuxpatch/toolchain/at/at_downloader/

然后,手动将 Advance Toolchain 包安装在系统上。

确认设置的路径包含 AT 随带的 gcc 编译器。通常,它位于 /opt/atX/bin,其中 X 是 Advance Toolchain 的版本。

可以在 www.postgresql.org 上找到所有 Postgres 源代码和相关材料。然后可以下载和提取内容。

  • 为源代码配置针对 CFLAGS、CPPFLAGS 和 LDFLAGS 的附加选项,命令为 “-Wl,-q -mcpu=power8 -mtune=power8 -O3 -m64”。例如:
    ./configure CFLAGS='-Wl,-q -mcpu=power8 -mtune=power8 -O3 -m64' CPPFLAGS='-Wl, -q -mcpu=power8 -mtune=power8 -O3 -m64' LDFLAGS='-Wl,-q -mcpu=power8 -mtune=power8 -O3 -m64'
  • 此外,根据配置流程,可能必须从基础操作系统媒体安装额外的从属包。
  • 在编译过程中,确保指定了 make allcontrib 文件夹还包含其他包,比如 pgbench 等。

Power Systems 配置

本练习使用了以下设置。

  • 设置单分区模式 [non-virtualized logical partition (LPAR)] – 将整个系统分配给一个分区,该分区中的所有核心都是专用 的。需要能访问 Hardware Management Console (HMC) 才能创建此 LPAR。这是系统上唯一的 LPAR。
  • 禁用以下针对基于 POWER8 处理器的系统的节能选项。
    • 关闭 Idle Power Saver 选项。
    • Dynamic Power Saver 模式设置为 enabled, favor performance

此设置更改只能通过 Advanced System Management Interface (ASMI) 进行,可以使用 HMC 或使用托管系统的 IP 直接通过浏览器访问 ASMI。

备注:如果设置了 IBM PowerVM® 以外的固件,比如 OPAL,ASMI 选项可能不可用。在这些情况下,可使用 cpupower util 通过 Linux 命令行设置处理器模式,将 governor 选项设置为 performance mode。此设置必须应用于系统上的所有核心。

例如: cpupower frequency-set --governor performance

可在以下地址了解更多的信息:
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Power_Management_Guide/cpufreq_governors.html

从特定系统的 HMC 启动 ASMI。下面的屏幕截图仅供参考。

图 1. 从 HMC 访问 ASMI

要关闭 the Idle Power Saver 选项,可以先登录,然后依次单击 System Configuration -> Power Management-> Idle Power Saver

图 2. ASMI – Idle Power Saver 页面

要启用动态节能模式,请执行以下步骤:

  1. 单击左侧窗格中的 Power Mode Setup,选择右侧窗格中的 Enable Dynamic Power Saver (favor performance) mode
  2. 单击 Continue
图 3. ASMI – Power Mode Setup 页面

这些设置有助于提高处理器速度。可在 shell 上使用 ppc64_cpu –freq 命令验证这一点。此操作不需要关闭或重新启动系统,它会立即生效。

备注:在未来的固件更新和版本中,这些选项可能改变位置。只需浏览一下即可找到所需的配置。

备注:如果设置了 IBM PowerVM® 以外的固件,比如 OPAL,图 1-3 中所示的 ASMI 设置可能不可用。在这些情况下,可使用 cpupower util 通过 Linux 命令行设置处理器模式,将 governor 选项设置为 performance mode。此设置必须应用于系统上的所有核心。

例如: cpupower frequency-set --governor performance

可在以下地址找到更多的信息:
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Power_Management_Guide/cpufreq_governors.html

内核调优和操作系统调优

根据内部测试,以下内核参数具有最好的效果。需要以根用户身份来应用这些内核参数设置。请谨慎执行该操作,依据系统的硬件规格和操作系统实现来设置值。

  • fs.file-max
  • vm.dirty_background_bytes
  • vm.dirty_ratio
  • vm.dirty_background_ratio
  • vm.hugetlb_shm_group
  • vm.dirty_bytes
  • vm.swappiness
  • vm.hugepages_treat_as_movable
  • vm.zone_reclaim_mode
  • vm.drop_caches
  • kernel.sched_migration_cost
  • kernel.sched_autogroup_enabled
  • kernel.numa_balancing
  • vm.zone_reclaim_mode

最好基于系统内存大小来设置以下设置,需要对它们进行相应的调整:

  • shmall
    shmall=$(( `grep MemTotal /proc/meminfo |awk '{print $2}'` * 1024 * 9 / (`getconf PAGE_SIZE` * 10)))
    sysctl -w kernel.shmall=$shmall
  • shmmax
    shmmax=$(( `grep MemTotal /proc/meminfo |awk '{print $2}'` * 1024 * 8 / 10 ))
    sysctl -w kernel.shmmax=$shmmax

应用以下操作系统更改。根据 pgbench 测试,这些调优更改很有好处。

  • 使用以下命令将处理器的同时多线程 (SMT) 睡眠延迟设置得高一点(这仅适用于 IBM POWER7® 和 IBM POWER7+™ 硬件,在 POWER8 硬件上不需要这样设置)。
    ppc64_cpu --smt-snooze-delay=16777215

    默认值为 100。这是一个针对延迟进入 nap 状态的可调优参数。

  • 使用以下命令关闭 I/O 抢占 (I/O preemption)。
    mount -t debugfs debugfs /sys/kernel/debug
    echo NO_WAKEUP_PREEMPT > /sys/kernel/debug/sched_features

    抢占调度程序会在更高优先级进程想要使用处理器时释放处理器时间。所以,如果有许多具有类似优先级的进程,处理器时间可能被这种交换操作消耗掉。在某些情况下,以下设置很有效。

    LATENCY=$(cat /proc/sys/kernel/sched_latency_ns)
    echo $((LATENCY/2)) > /proc/sys/kernel/sched_min_granularity_ns
  • 在 Linux 系统上运行以下命令,禁用硬件数据预取(通常用于提高 Postgresql 性能)。
    ppc64_cpu -dscr=1
  • 运行以下命令来恢复默认值。
    ppc64_cpu -dscr=0

PostgreSQL (open source)

可选:当将在 Power 服务器上使用大页面时,可考虑执行以下操作说明。

  • 大页面大小在 PostgreSQL 源代码 (sysv_shmem.c) 中被硬编码为 2 MB(Intel® 规定的大小)。应该更改此大小,因为 IBM Power Architecture® 使用的大页面大小为 16 MB。
    1. 在 Postgresql 源代码目录中输入以下命令。
      cd postgresql

    2. src/backend/port/sysv_shmem.c:360 中手动将大页面大小更改为 16 MB

使用以下内核值设置一个 32 GB (16 MB * 2000) 的大页面池(必须根据 postgresql.org 配置来调整大小)
vm.nr_hugepages=2000
vm.nr_overcommit_hugepages=512

修改 postgresql.conf,告诉 Postgres 使用大页面。

huge_page = try #it will use huge pages if exists

huge_page=on #it will force to use huge pages

EDB Postgres Advanced Server

将以下更改应用于 EDB Postgres Advanced Server。根据 pgbench 测试,这些调优更改很有好处。

  • 将以下条目添加到 EDB 用户(或相应的 Postgres 用户)/etc/security/limits.conf 的 limits.conf 文件中
    enterprisedb soft memlock 68719476736
    enterprisedb hard memlock 68719476736

    这会限制锁定在内存中的地址空间的最大容量。

  • 可选:通过在 EDB 用户 shell 配置文件中添加以下行,为 EDB Postgres Advanced Server 启用大页面。
    HUGETLB_SHM=yes
    LD_PRELOAD='/usr/lib64/libhugetlbfs.so'
    export HUGETLB_SHM
    export LD_PRELOAD

    如果在 EDB Postgres Advanced Server 使用大页面时遇到麻烦,可采用根用户身份运行此命令来解决问题。
    hugeadm --pool-pages-min DEFAULT:16M

    备注:确认 EDB for Power 中的大页面是否设置为 16 MB,而不是 2 MB。请参阅 PostgreSQL(开源)的上一节。

将数据库文件系统固定到内存中

本练习使用的文件系统名为 tmpfs。在测试实验中,为 EDB 或 PostgreSQL 用途分配了 20 GB 内存。根据观察,对于 pgbench 比例系数 1000,运行期间使用的总空间为 15 GB 到 19 GB。

运行以下命令来创建 tmfs 文件系统:
mkdir -p /media/tmp
mount -t tmpfs -o size=20G tmpfs /media/tmp

备注:如果系统重新启动,则会删除此文件系统和它的信息,所以应根据需要对它们进行备份。

另外,停止或禁用这次运行不需要或对系统不重要的任何服务或进程。例如,如果未使用 IPV6,可禁用它。可以停用邮件服务器,等等。

EnterpriseDB/PostgreSQL 数据库设置

本节将介绍如何初始化一个数据库集群实例,应用数据库集群参数调优,以及创建一个数据库。

首先,以 enterprise/postgres 用户身份登录,确保在相关路径中定义了服务器实用程序二进制文件。在默认安装位置找到这些二进制文件:

EnterpriseDB - /usr/ppas-X/bin。其中 X 是版本号
PostgreSQL - /usr/local/pgsql/bin

a. 初始化数据库集群实例

initdb 实用程序用于创建数据库集群实例。需要在命令中以参数形式指定数据库文件的位置。在这里,使用了之前创建的 tmpfs 文件系统作为数据库实例文件夹。

initdb -D /media/tmp/data

这会创建一个数据库存储库和一个数据库参数文件 postgresql.conf。

b. 调优数据库服务器参数

在 postgresql.conf 文件中找到默认的数据库集群参数。对于本练习,会根据选定的工作负载 (pgbench),将以下参数更改为推荐值。依据运行的具体工作负载,参数可能会有所不同。

  • shared_buffers = 20 GB(基于分配给 LPAR 的内存来调优此参数)。推荐设置是此参数不得超过 LPAR 内存的 1/4。)
  • maintenance_work_mem = 512 MB
  • checkpoint_completion_target = 0.9
  • effective_cache_size = 64 GB
  • work_mem = 512 MB
  • wal_buffers = 16 MB
  • checkpoint_segments = 300
  • synchronous_commit = off
  • 通过注释掉 edb_dynatune 和 edb_dynatune_profiles,禁用 Dynatune

备注:一些参数调优可能在该产品的未来版本中失效,而且一些参数调优仅对 EDB Postgres Advanced Server 有效。如果任何参数失败或显示错误,可将它注释掉。作为一般建议,如果未找到本节中提供的列表中指定的预定义参数,可跳过它。

c. 启动数据库集群并创建一个数据库

数据库集群使用服务器二进制文件随带的 pg_ctl 实用程序来启动。使用 –l 选项将输出重定向到一个文件。

  • pg_ctl -D /media/tmp/data -l logfile start
    它也可以使用 edb-postgres -D /media/tmp/data 命令启动。
  • 数据库可使用 createdb 命令行实用程序创建。在这里,我们选择了 pgbench 作为数据库名称。
    createdb pgbench

PostgreSQL 和 EnterpriseDB Postgres Advanced Server 数据库基准测试

本节将讨论在初始化工作负载后,在数据库上运行的基准测试。

每次运行不需要重新初始化数据库,但推荐这么做,因为这会刷新数据库。

基准测试工具 pgbench

pgbench 是一个在 EDB Postgres Advanced Server 或 PostgreSQL 上运行基准测试的简单实用程序。可在以下地址找到此实用程序的更多信息:
https://www.postgresql.org/docs/devel/static/pgbench.html

pgbench 提供了不同的只读(select only 查询)和读/写(select, updateinsert 查询)模式。对于本练习,使用了 pgbench 的 select only 选项。此实用程序可与 PostgreSQL 或 EDB Postgres Advanced Server 在同一个系统上运行。此实用程序还可以在网络上的不同计算机上运行。

初始化数据库

首先,必须初始化数据库。使用 -I 选项调用 pgbench 实用程序,并指定一个比例系数。在本练习中,测试团队使用了比例系数 1000。
pgbench -i -s 1000 pgbench

初始化需要一些时间,因为需要填充数据库。1000 的比例系数通常会使用约 16 GB 内存。

运行基准测试工具

传递的参数是 -T,它指定了该工具运行的时长。-S 启用 select only 负载,-c 是客户端数量,-j 是工作者线程数量。此运行针对不同的客户端和线程数量而执行。对于本测试,客户端和线程位于同一个核心上。pgbench 工具运行 5 分钟(300 秒)。要获得稳定的结果,推荐运行 pgbench 5 分钟或更长时间。
pgbench -n -S -c 64 -j 64 pgbench -T 300

运行结束时,此实用程序将会显示包含和不包含链接时每秒处理的事务数 (TPS) 作为结果。

图 4. 来自 pgbench 工具的示例结果输出

相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Linux, Open source
ArticleID=1049371
ArticleTitle=IBM Power Systems 的 EnterpriseDB Postgres Advanced Server 解决方案
publish-date=09062017