1.预留系统内存:SYSTEM_POOL= Runtime.getRuntime().maxMemory() * 0.4
2.最大可用内存 maxMemory =
3.预留内存: RESERVED_POOL = query.max-memory-per-node ,
4.普通内存: GENERAL_POOL = maxMemory – RESERVED_POOL
预留系统内存 | 内存空间 | 大小 | 默认 |
---|---|---|---|
最大可用内存 | SYSTEM_POOL | Runtime.getRuntime().maxMemory() * 0.4 | 系统的buffer内存 |
最大可用内存 | maxMemory | Runtime.getRuntime().maxMemory() – SYSTEM_POOL | |
大作业预留内存 | RESERVED_POOL | query.max-memory-per-node | 大作业消耗的内存,默认只允许一个作业运行 |
普通内存 | GENERAL_POOL | maxMemory – RESERVED_POOL | 普通作业消耗的内存 |
RESERVED_POOL 这块内存触发的条件
1.GENERAL_POOL 不够用了,有作业block
2.RESERVED_POOL 还没有被使用
从集群纬度看
当满足以下两个条件时候,认为集群的资源不够了,在当前的查询条件下
1.GENERAL_POOL 出现block
2.RESERVED_POO被使用了
对于超出内存有两种方式
1.查询当前查询是否超出了query.max-memory的大小,若是超过了,那么就kill
2.如果query.max-memory设置的不合理,非常的大,那么就一直不会触发第一个条件。超过5秒就会进入下一个判断,根据LowMemoryKillerPolicy策略来判断是否杀掉作业. 具体配置是 query.low-memory-killer.policy
2.1 total-reservation :杀掉集群里面最消耗资源最大的作业
2.2 total-reservation-on-blocked-nodes : 杀死内存不足节点上,消耗资源最大的作业
参考资料:
http://armsword.com/2018/05/22/the-memory-management-and-tuning-experience-of-presto/
https://prestodb.io/docs/current/release/release-0.191.html
http://qubole.com/wp-content/uploads/2016/01/PrestoTuning-QuickReferenceGuide.pdf
https://qubole.zendesk.com/hc/en-us/articles/210266303-How-To-Presto-Tuning