当我设置Presto集群并尝试进行一些性能调整时,我想知道是否有更全面的Presto配置指南,例如如何控制Presto工作线程可以使用多少CPU内核。如果我在单个服务器上启动多个presto工作器(在这种情况下,我不需要专用服务器来运行协调器),这是很好的做法吗?
此外,我不太明白任务.max内存的论点。presto worker 会为单个查询启动多个任务吗?如果是,也许我可以将任务.max内存与 -Xmx JVM 参数一起使用来控制并行级别?
提前谢谢。
Presto 是一个多线程 Java 程序,在处理查询时努力使用所有可用的 CPU 资源(假设输入表足够大以保证这种并行性)。您可以使用 cgroups、CPU 关联等人为地限制 Presto 在操作系统级别使用的 CPU 资源量。
在一台机器上启动多个 Presto 工人没有任何理由或好处。您不应该这样做,因为它们会不必要地相互竞争资源,并且性能可能比单个进程差。
我们在具有 50+ 台计算机的部署中使用专用协调器,因为我们发现让协调器处理查询会在执行查询协调工作时减慢查询速度,这会对整体查询性能产生负面影响。对于小型集群,将机器专用于协调可能会浪费资源。需要使用自己的群集设置和工作负载运行一些试验,以确定哪种方式最适合你的环境。
您可以让单个 Presto 进程同时充当协调器和工作线程,这对于小型集群或测试目的非常有用。为此,请将以下内容添加到etc/config.properties
文件中:
coordinator=true
node-scheduler.include-coordinator=true
您在与工作进程共享的计算机上启动专用协调器进程的想法很有趣。例如,在具有 16 个处理器的计算机上,可以使用 cgroups 或 CPU 关联将 2 个内核专用于协调进程,并将工作进程限制为 14 个内核。我们从未尝试过这个,但对于小型集群来说,这可能是一个不错的选择。
任务是在工作线程上运行的查询计划中的一个阶段(CLI 在查询运行时显示阶段列表)。对于像 SELECT COUNT(*) FROM t
这样的查询,每个执行表扫描和部分聚合的工作上都会有一个任务,在单个工作线程上会有另一个任务进行最终聚合。具有联接、子查询等的更复杂的查询可能会导致每个工作器节点上针对单个查询执行多个任务。
-Xmx 必须高于任务.max内存,或者至少等于。否则,您可能会看到我以前经历过的 OOM 问题。而且,自 Presto-0.113 以来,他们改变了 Presto 管理查询内存和根据配置的方式。请参考此链接:https://prestodb.io/docs/current/installation/deployment.html
对于您关于"Presto 工作人员可以使用的许多 CPU 内核"的问题,我认为它由参数 task.concurrency
控制,默认情况下为 16