共计 2163 个字符,预计需要花费 6 分钟才能阅读完成。
丸趣 TV 小编给大家分享一下 PostgreSQL 如何开启 Huge Page 场景,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
1. 大规格 PG 实例内存使用率较高分析
为了保证物理内存能得到充分的利用,避免内存空间浪费,Linux 把进程当前使用的内存部分加载到物理内存里,而不使用的部分则暂不加载。PostMaster 进程注册共享内存时,系统只是分配一个虚拟的地址空间,并不直接分配物理内存。当有实际的内存访问时,CPU 才会将虚拟地址映射到物理内存的一个地址上。维护这个映射关系的就是 PageTable,它负责将虚拟内存地址转换成物理内存地址。
Linux 的内存管理采取的是分页存取机制:把较大的物理内存分为了一个个固定大小(4kB)的内存页进行管理。每块内存页通过 PageTable 中的一个元组来维护虚拟 / 物理内存之间的映射。CPU 为了提高虚拟 / 物理内存之间的转换效率,也会在 TLB 中缓存一定量的 Page Table 元组。
对于 PostgreSQL 这种多进程架构程序来说,当服务端使用的共享内存较大,且并发连接数较多时,由于操作系统对于每个进程都要维护单独的内存映射,PageTable 中的元组数目将会变得非常多,所占用的内存大小也会特别大。
2. Huge Page 改善措施
Linux 为了应对这种场景,降低多进程下 PageTable 的内存消耗。自从 2.6 及以上内核版本提供了内存页大小为 2MB 的管理方式,称为 Huge Page。如果使用 Huge Page 的话,相同物理内存使用量的情况下内存页的数目变少,减少了 PageTable 元组的条目个数,从而降低了系统的内存占用。
作为世界上最先进的开源数据库,PostgreSQL 也适配了 Linux 的 Huge Page 特性,服务端在注册共享内存时,会通过配置参数 huge_pages 来决定是否申请大页内存。
postgresql.conf:
huge_pages = on -- 注册共享内存时必须使用大页
huge_pages = try -- 注册共享内存时首先考虑大页,若系统提供的大页内存不足时,则全部使用普通页
huge_pages = off -- 注册共享内存时不使用大页
真实应用场景:某 PG 用户将实例(shared_buffers = 64GB)部署在一台内存为 256GB 的 ECS 上,业务繁忙时 ECS 内存使用率为 85%,PageTable 占用内存 120GB。而开启 Huge Page 后相同业务场景的内存使用率降低到 50% 以下,PageTable 大小仅 300M!
3. PG 实例开启 Huge Page 操作步骤
(1)查看操作系统的 Huge Page 大小 grep Hugepage /proc/meminfo
(2)估算 PostgreSQL 实例需要的 Huge Page 使用量:128GB/2MB * 1.2 = 78643
(3)/etc/sysctl.conf 中添加:vm.nr_hugepages = 78643
(4)重新加载系统配置参数:sysctl –p
(5)确认是否配置成功。可以看到 Huge Page 总数为 78643
(6)确认 PG 配置文件打开 huge_pages
(7)启动 PostgreSQL 服务端,可以看到系统中的空闲 Huge Page 已经减少,部分大页已经被共享内存使用。
4. Huge Page 使用建议
虽然 Huge Page 在一定场景下可以改善服务端内存使用过高的情况,但不是鼓励所有的 PG 实例都使用大页,盲目的开启 Huge Page 可能引起服务端的性能下降。下面我们根据 Huge Page 的优缺点来分析下使用场景。
Huge Page 优势:
(1)CPU 的 TLB 可以缓存的物理地址空间更大,从而提升 TLB 的命中率,降低 CPU 负载;
(2)Huge Page 使用的内存是不可交换(swap)的,没有内存空间换入 / 换出的开销;
(3)极大的减少了系统维护 PageTable 的内存开销。
Huge Page 劣势:
(1)Huge Page 使用的内存需要预先分配;
(2)Huge Page 使用固定大小的内存区域,不会被释放;
(3)对于写密集型的场景,Huge Page 会加大 Cache 写冲突的发生概率。
所以强烈推荐 PG 实例开启 Huge Page 的场景:共享内存使用较大(=8GB)且连接数较多(= 500),并且热点数据分散。不推荐 PG 实例开启 Huge Page 的场景:写业务密集,热点数据集中且内存使用较小。
5.PG 开启 Huge Page 时的注意事项
(1)当配置参数 huge_pages 设置为 on 时,若 PG 启动时需要注册的共享内存大于操作系统提供的 Huge Page 大小时,数据库将无法启动。推荐将 huge_pages 参数设置为 try,在此种场景下,PostMaster 将会改为申请普通内存。
(2)修改 shared_buffers/wal_buffers 等共享内存相关的 GUC 参数时,需要重新计算操作系统所需的 Huge Page 数,以防服务端无法启动或者部分大页内存没有被使用且无法释放而造成浪费。
以上是“PostgreSQL 如何开启 Huge Page 场景”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!