宣布 Flux(之前称为 IFQL)v0.0.3 版本发布

导航至

Flux(之前称为 IFQL)团队每两周发布一个新版本。我们希望快速将我们的更改应用到社区中,以便我们能够尽早了解您的体验。请在 仓库 上提交问题和 PR。查看 Flux 发布公告 了解 Flux 背后的愿景。

在过去的两周里,我们专注于性能和资源管理(即管理 CPU 和内存资源,以确保单个查询不会使 Flux 进程过载)。

基准测试

我们准备了一系列比较 Flux 和 InfluxQL 的基准测试。这些基准测试已经提前设置,以确保我们未来可以继续维持良好的性能。以下是一些初步图表,展示了 Flux 与等效的 InfluxQL 查询的对比。

在两个系统上运行了五个代表性的查询1。要查看基准测试的详细信息,请查看 PR。

以下是五个查询

查询 #1

IFQL - from(db:"db").range(start:2017-11-01T00:00:00Z, stop:2017-11-02T00:00:00Z).filter(exp:{"_measurement" == "m0" and "_field" == "v0" and $ > 0}).sum()
InfluxQL - SELECT sum(v0) FROM m0 WHERE time >= 2017-11-01T00:00:00Z AND time < 2017-11-02T00:00:00Z AND v0 > 0 GROUP BY *

查询 #2

IFQL - from(db:"db").range(start:2017-11-01T00:00:00Z, stop:2017-11-05T00:00:00Z).filter(exp:{"_measurement" == "m0" and "_field" == "v0" and $ > 0}).sum()
InfluxQL - SELECT sum(v0) FROM m0 WHERE time >= 2017-11-01T00:00:00Z AND time < 2017-11-05T00:00:00Z AND v0 > 0 GROUP BY *

查询 #3

IFQL - from(db:"db").range(start:2017-11-01T00:00:00Z, stop:2017-11-05T00:00:00Z).filter(exp:{"_measurement" == "m0" and "_field" == "v0" and $ > 0}).group(by:["tag0"]).sum()
InfluxQL - SELECT sum(v0) FROM m0 WHERE time >= 2017-11-01T00:00:00Z AND time < 2017-11-05T00:00:00Z AND v0 > 0 GROUP BY tag0

查询 #4

IFQL - from(db:"db").range(start:2017-11-01T00:00:00Z, stop:2017-11-13T00:00:00Z).filter(exp:{"_measurement" == "m0" and "_field" == "v0" and $ > 0}).sum()
InfluxQL - SELECT sum(v0) FROM m0 WHERE time >= 2017-11-01T00:00:00Z AND time < 2017-11-13T00:00:00Z AND v0 > 0 GROUP BY *

查询 #5

IFQL - from(db:"db").range(start:2017-11-01T00:00:00Z, stop:2017-11-13T00:00:00Z).filter(exp:{"_measurement" == "m0" and "_field" == "v0" and $ > 0}).group(by:["tag0"]).sum()
InfluxQL - SELECT sum(v0) FROM m0 WHERE time >= 2017-11-01T00:00:00Z AND time < 2017-11-13T00:00:00Z AND v0 > 0 GROUP BY tag0

首先,让我们看看执行时间,因为在考虑查询引擎性能时,执行时间是最重要的。

对于大多数查询,Flux 已经比 InfluxQL 快。注意,查询 #4 未使用 InfluxQL 完成,因此没有时间。我们已经在 问题 上打开了应该改进查询 #5 的 PR。

接下来,检查进程的堆使用情况,我们可以看到 Flux 在其使用上要高效得多。

与 InfluxQL 的堆使用相比,ifql 进程的堆使用几乎可以忽略不计。注意,有两个 ifql 进程,ifqld 可以是任意数量的辅助进程,以及运行新 IFQL API 的 influxd。

资源管理

在版本 v0.0.3 中,现在可以限制查询消耗的资源。我们的目标是确保一个特别贪婪的查询不会使进程崩溃,其次,贪婪的查询将根据其优先级与其他并发查询公平地共享资源。

现在有了这些限制,如果查询尝试消耗过多内存,它将被终止并返回适当的错误,而不是允许查询使进程崩溃。

我们还对v0.0.2与v0.0.3进行了比较测试。测试中提交的查询数量超过了进程拥有的资源。然后我们比较了查询的执行时间,可以看到v0.0.3将总体执行时间减少了15%。这是通过排队和调度工作来实现的,而不是让所有查询同时争夺资源。由于排队,v0.0.3中的长尾延迟增加,但我们有计划稍后解决这个问题。

总的来说,v0.0.3是一个坚实的迭代版本,两周后我们将再次与您见面,带来另一个版本。有关所有变更的完整列表,请参阅CHANGELOG。

脚注

[1] 注意,InfluxDB主分支现在有一个Prometheus的“/metrics”端点,我们用它来收集这些统计信息。我们还使用了一个新的工具ingen来创建测试数据集。