合 大页HugePages对PostgreSQL的性能影响
Tags: PostgreSQL性能标准大页透明大页大页
简介
Linux kernel 提供了大量可以影响性能的配置参数。关键是针对你的应用程序和负载选择合适配置参数。像其他数据库一样,PostgreSQL 依赖于最优化的 Linux kernel。糟糕的配置参数会导致糟糕的性能。因此,重要的是:在每次调整配置参数之后都要对数据库做benchmark,来避免性能降低。
在我之前的博文中《Tune Linux Kernel Parameters For PostgreSQL Optimization》 https://www.percona.com/blog/2018/08/29/tune-linux-kernel-parameters-for-postgresql-optimization/
我描述了一些最有用的Linux kernel配置参数以及这些配置参数如何提高你的数据库性能的。本文将会分享打开 Linux 大页之后,不同的工作负载的 benchmark 结果。针对不同大小的负载和并发访问客户端,我做了大量的benchmark。
benchmark 机器配置
1 2 3 4 5 6 7 8 | 超微服务器 CPU: Intel(R) Xeon(R) CPU E5-2683 v3 @ 2.00GHz 2 sockets / 28 cores / 56 threads 内存: 256GB of RAM 存储介质: SAMSUNG SM863 1.9TB Enterprise SSD 文件系统: ext4/xfs 操作系统:Ubuntu 16.04.4, kernel 4.13.0-36-generic PostgreSQL:11版本 |
Linux Kernel 配置
我使用默认的操作系统配置,除了关掉了透明大页(Transparent HugePages)。透明大页是默认打开的,分配页的大小并不可控,对于数据库来说并不太推荐。通常,对于数据库来说,需要固定大小的大页,这个是透明大页所提供不了的。因此,通常推荐的是打开大页,并且要关闭透明大页。
PostgreSQL的配置
我使用固定的PostgreSQL配置来做benchmark,主要是为了获得不同的负载和不同的配置的大页的测试结果。PostgreSQL配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | shared_buffers = '64GB' work_mem = '1GB' random_page_cost = '1' maintenance_work_mem = '2GB' synchronous_commit = 'on' seq_page_cost = '1' max_wal_size = '100GB' checkpoint_timeout = '10min' synchronous_commit = 'on' checkpoint_completion_target = '0.9' autovacuum_vacuum_scale_factor = '0.4' effective_cache_size = '200GB' min_wal_size = '1GB' wal_compression = 'ON' |
benchmark测试方法
做benchmark的时候,测试的方法是非常重要的。所有的 benchmark 都会运行三次,每次都会运行30分钟。我取这三次benchmark的中间值(去掉最低和最高,取中间)。我们使用 PostgreSQL 的benchmark工具 pgbench 来进行测试。pgbench 工作时使用了不同的比例因子 (scaling fatctor),每个比例因子大概使用16M的内存。
大页 (HugePages)
Linux中大页默认使用的页大小是4K。BSD系统有Super Pages,Windows有Large Pages。PostgreSQL 只支持Linux上提供的大页 (HugePages). 在内存使用率比较高的情况下,大页使用的页面大小太小会降低性能。通过设置大页,可以为应用程序指定内存,就可以降低分配内存和swap的操作开销,所以,可以通过使用大页来提高性能。
下面是使用1G大小的大页的配置。你可以通过从/proc获取这些信息。
1 2 3 4 5 6 7 8 | cat /proc/meminfo | grep -i huge AnonHugePages: 0 kB ShmemHugePages: 0 kB HugePages_Total: 100 HugePages_Free: 97 HugePages_Rsvd: 63 HugePages_Surp: 0 Hugepagesize: 1048576 kB |
对于大页更细节的信息,可以看之前的博客:
https://www.percona.com/blog/2018/08/29/tune-linux-kernel-parameters-for-postgresql-optimization/
通常,大页的大小是从2M到1G,因此(实际生产环境中)合理的配置是使用1G的大小而不是更小的2M页面大小。