内存池
Presto有三种内存池,分别为GENERAL_POOL、RESERVED_POOL、SYSTEM_POOL。这三个内存池占用的内存大小是由下面算法进行分配的:
1 | builder.put(RESERVED_POOL, new MemoryPool(RESERVED_POOL, config.getMaxQueryMemoryPerNode())); |
梳理这块代码对应的逻辑和配置文件,得出RESERVED_POOL大小由config.properties里的query.max-memory-per-node指定;SYSTEM_POOL由config.properties里的resources.reserved-system-memory指定,如果不指定,默认值为Runtime.getRuntime().maxMemory() * 0.4,即0.4 * Xmx值;而GENERAL_POOL值为 总内存(Xmx值)- 预留的(max-memory-per-node)- 系统的(0.4 * Xmx)。
而这三种内存池分别用于不同的地方,分析代码和阅读Presto开发手册,大体可以定位出:
- GENERAL_POOL is the memory pool used by the physical operators in a query.
- SYSTEM_POOL is mostly used by the exchange buffers and readers/writers.
- RESERVED_POOL is for running a large query when the general pool becomes full.