mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-11-21 14:44:00 +00:00
app/vmselect: parallelize q1 <binary_op> q2
queries by running q1
and q2
in parallel
This should reduce query execution times.
This commit is contained in:
parent
4e645a5fd3
commit
985c3e301d
2 changed files with 40 additions and 8 deletions
|
@ -284,14 +284,45 @@ func evalExpr(ec *EvalConfig, e metricsql.Expr) ([]*timeseries, error) {
|
||||||
return rv, nil
|
return rv, nil
|
||||||
}
|
}
|
||||||
if be, ok := e.(*metricsql.BinaryOpExpr); ok {
|
if be, ok := e.(*metricsql.BinaryOpExpr); ok {
|
||||||
left, err := evalExpr(ec, be.Left)
|
// Execute left and right sides of the binary operation in parallel.
|
||||||
if err != nil {
|
// This should reduce execution times for heavy queries.
|
||||||
return nil, err
|
// On the other side this can increase CPU and RAM usage when executing heavy queries.
|
||||||
}
|
// TODO: think on how to limit CPU and RAM usage while leaving short execution times.
|
||||||
right, err := evalExpr(ec, be.Right)
|
var left, right []*timeseries
|
||||||
if err != nil {
|
var mu sync.Mutex
|
||||||
return nil, err
|
var wg sync.WaitGroup
|
||||||
|
var errGlobal error
|
||||||
|
wg.Add(1)
|
||||||
|
go func() {
|
||||||
|
defer wg.Done()
|
||||||
|
tss, err := evalExpr(ec, be.Left)
|
||||||
|
mu.Lock()
|
||||||
|
if err != nil {
|
||||||
|
if errGlobal == nil {
|
||||||
|
errGlobal = err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
left = tss
|
||||||
|
mu.Unlock()
|
||||||
|
}()
|
||||||
|
wg.Add(1)
|
||||||
|
go func() {
|
||||||
|
defer wg.Done()
|
||||||
|
tss, err := evalExpr(ec, be.Right)
|
||||||
|
mu.Lock()
|
||||||
|
if err != nil {
|
||||||
|
if errGlobal == nil {
|
||||||
|
errGlobal = err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
right = tss
|
||||||
|
mu.Unlock()
|
||||||
|
}()
|
||||||
|
wg.Wait()
|
||||||
|
if errGlobal != nil {
|
||||||
|
return nil, errGlobal
|
||||||
}
|
}
|
||||||
|
|
||||||
bf := getBinaryOpFunc(be.Op)
|
bf := getBinaryOpFunc(be.Op)
|
||||||
if bf == nil {
|
if bf == nil {
|
||||||
return nil, fmt.Errorf(`unknown binary op %q`, be.Op)
|
return nil, fmt.Errorf(`unknown binary op %q`, be.Op)
|
||||||
|
|
|
@ -2,7 +2,8 @@
|
||||||
|
|
||||||
# tip
|
# tip
|
||||||
|
|
||||||
* FEATURE: optimize searching for time series by label filters where individual filters match big number of time series (more than a million). For example, the query `up{job="foobar"}` should work faster if `{job="foobar"}` matches a million of time series, while `up{job="foobar"}` matches much lower number of time series.
|
* FEATURE: optimize searching for matching metrics for `metric{<label_filters>}` queries if `<label_filters>` contains at least a single filter. For example, the query `up{job="foobar"}` should find the matching time series much faster than previously.
|
||||||
|
* FEATURE: reduce execution times for `q1 <binary_op> q2` queries by executing `q1` and `q2` in parallel.
|
||||||
* FEATURE: single-node VictoriaMetrics now accepts requests to handlers with `/prometheus` and `/graphite` prefixes such as `/prometheus/api/v1/query`. This improves compatibility with [handlers from VictoriaMetrics cluster](https://victoriametrics.github.io/Cluster-VictoriaMetrics.html#url-format).
|
* FEATURE: single-node VictoriaMetrics now accepts requests to handlers with `/prometheus` and `/graphite` prefixes such as `/prometheus/api/v1/query`. This improves compatibility with [handlers from VictoriaMetrics cluster](https://victoriametrics.github.io/Cluster-VictoriaMetrics.html#url-format).
|
||||||
* FEATURE: expose `process_open_fds` and `process_max_fds` metrics. These metrics can be used for alerting when `process_open_fds` reaches `process_max_fds`. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/402 and https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1037
|
* FEATURE: expose `process_open_fds` and `process_max_fds` metrics. These metrics can be used for alerting when `process_open_fds` reaches `process_max_fds`. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/402 and https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1037
|
||||||
* FEATURE: vmalert: add `-datasource.appendTypePrefix` command-line option for querying both Prometheus and Graphite datasource in cluster version of VictoriaMetrics. See [these docs](https://victoriametrics.github.io/vmalert.html#graphite) for details.
|
* FEATURE: vmalert: add `-datasource.appendTypePrefix` command-line option for querying both Prometheus and Graphite datasource in cluster version of VictoriaMetrics. See [these docs](https://victoriametrics.github.io/vmalert.html#graphite) for details.
|
||||||
|
|
Loading…
Reference in a new issue