暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

DB吐槽大会,第81期 - PG 未针对 NUMA 优化

原创 digoal 2022-01-20
857

作者

digoal

日期

2021-10-26

标签

PostgreSQL , numa , arm , 内存访问


视频回放

1、产品的问题点
- PG 未针对 NUMA 优化

2、问题点背后涉及的技术原理
- 《大内存, 大并发应用的NUMA内存管理配置策略 - PostgreSQL numa配置》

3、这个问题将影响哪些行业以及业务场景
- 独占主机的PostgreSQL大实例, 特别是内存大、多物理核的硬件, 包括intel, 更加严重的是ARM芯片的机器.

4、会导致什么问题?
- 1、shared buffer很大, 一次需要申请一大片内存, 由于申请内存时优先使用cpu的local memory, 所以结果就是会集中在某个(或者某一小部分)物理cpu的local memory中.
- 当发生并发访问时, 由于每个会话可能使用不同的CPU在进行处理, 所以访问shared buffer时会发生大量的跨CPU访问, 而且是集中跟第1点所说的那个物理CPU进行inter-connect通信, 所以那个物理CPU就会成为瓶颈.
- 2、当某个cpu下有memallock请求需要分配内存, 并且这个cpu下的local memory的内存不足时, 会优先挤出这个cpu 的local memory. 所以可能会出现频繁的把shared buffer的内存交换到swap分区的动作, 性能抖动严重.

5、业务上应该如何避免这个坑
- 使用huge page, 锁定memory, 直接规避swap.
- 如果不用huge page, 那么可以配置vm.zone_reclaim_mode = 0使得内存不足时去remote memory(其他CPU的local memory)分配优先于swap out local page.
- vm.zone_reclaim_mode:当一个内存区域(zone)内部的内存耗尽时,是从其内部进行内存回收还是可以从其他zone进行回收的选项,0表示可以从下一个zone找可用内存;
- 采用 numactl --interleave=all
- numactl —interleave=all:无视 NUMA 关于 CPU 内存分配的策略,可以使得各个 CPU 区域的内存均匀分配。
- 解决大块内存会被集中分配到单个或少量物理CPU的问题.
- 采用 kernel.numa_balancing=0
- kernel.numa_balancing:是否启用NUMA平衡功能,将任务移动到最近的内存或移动内存到任务执行最近的地方,0表示关闭;
- 数据库是重度(量和频率都重)使用内存的应用, 开启numa平衡只会带来副作用.

总结一下上面三点优化方法:   
采用huge page(推荐)  或  vm.zone_reclaim_mode = 0    
kernel.numa_balancing = 0    
numactl --interleave=all pg_ctl start -D $PGDATA    

如果是小业务, 可以使用 cgroup 绑定物理核, 不同的实例绑定不同的物理核, 同时开启numa, 相当于只用local memory.
- https://github.com/cybertec-postgresql/pg_cgroups

6、业务上避免这个坑牺牲了什么, 会引入什么新的问题
- 管理复杂度增加

7、数据库未来产品迭代如何修复这个坑
- 希望内核层面识别numa架构, 自动进行动态内存分配, (前提可能要OS提供这样的内存分配的lib库).

实际上还有一些可以吐槽的点, 就不展开了:

  • 期望处理kill -9信号, 目前数据库被kill -9会导致崩溃恢复, 恢复时间影响挺大, 特别是大规格实例.
  • 期望 timescale , postgresql, 提供数据自动老化能力(自动有损压缩)。
    • 目前缺乏自适应引擎能力, 例如根据业务负载情况自动学习, 自动切换存储引擎、索引引擎(或给出推荐).
  • 不支持强制绑定变量. 如果不想支持, 那么让业务自己改, 但是怎么发现业务没有使用绑定变量, parser, plan带来了多少额外开销, 如何监控? 有没有指标? awr
  • 不支持内置三节点能力, 需要用户自己部署failover, 方案很多, 复杂度较高.
  • 期望向量距离索引支持自定义距离算法, 方便各个行业和场景自定义算法使用
  • 期望三权分立, 提高系统安全访问控制. 提示: 类似系统级的三权分立:admin、secure、audit
  • 期望支持 memory table 内存表 . 支持配置内存表的异步持久化时间间隔(例如覆盖写一个普通表). 启动时可以选择是否自动加载持久化内容.
    • https://postgrespro.com/docs/enterprise/11/in-memory

期望 PostgreSQL 增加什么功能?

类似Oracle RAC架构的PostgreSQL已开源: 阿里云PolarDB for PostgreSQL云原生分布式开源数据库!

PostgreSQL 解决方案集合

德哥 / digoal's github - 公益是一辈子的事.

digoal's wechat

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论