IBM Power Systems 的 EnterpriseDB Postgres Advanced Server 解决方案-2
 
- UID
- 1066743
|

IBM Power Systems 的 EnterpriseDB Postgres Advanced Server 解决方案-2
内核调优和操作系统调优根据内部测试,以下内核参数具有最好的效果。需要以根用户身份来应用这些内核参数设置。请谨慎执行该操作,依据系统的硬件规格和操作系统实现来设置值。
- 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。
- 在 Postgresql 源代码目录中输入以下命令。
cd postgresql - 在
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 数据库基准测试本节将讨论在初始化工作负载后,在数据库上运行的基准测试。
每次运行不需要重新初始化数据库,但推荐这么做,因为这会刷新数据库。
基准测试工具 pgbenchpgbench 是一个在 EDB Postgres Advanced Server 或 PostgreSQL 上运行基准测试的简单实用程序。可在以下地址找到此实用程序的更多信息:
pgbench 提供了不同的只读(select only 查询)和读/写(select, update 和 insert 查询)模式。对于本练习,使用了 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 工具的示例结果输出 |
|
|
|
|
|