From a8acad7453365254ae4e59a91bfcd66556d8dfdd Mon Sep 17 00:00:00 2001 From: Nikolay Date: Tue, 8 Feb 2022 17:25:59 +0300 Subject: [PATCH] adds CGO build for arm64 (#2102) * adds CGO build for arm64 it must improve performance for arm64 based deployments of vmstorage and vmsingle for 15-20% it depends on gozstd package update for correct musl gozstd vendoring * typo fixes * docs/CHANGELOG.md: document the change Co-authored-by: Aliaksandr Valialkin --- deployment/docker/Makefile | 23 +++++++++++++++++++++-- deployment/docker/builder/Dockerfile | 7 ++++++- docs/CHANGELOG.md | 1 + 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/deployment/docker/Makefile b/deployment/docker/Makefile index 5e9ec0b5b..c6c9435dc 100644 --- a/deployment/docker/Makefile +++ b/deployment/docker/Makefile @@ -5,7 +5,7 @@ DOCKER_NAMESPACE := victoriametrics ROOT_IMAGE ?= alpine:3.15.0 CERTS_IMAGE := alpine:3.15.0 GO_BUILDER_IMAGE := golang:1.17.6-alpine -BUILDER_IMAGE := local/builder:2.0.0-$(shell echo $(GO_BUILDER_IMAGE) | tr :/ __) +BUILDER_IMAGE := local/builder:2.0.0-$(shell echo $(GO_BUILDER_IMAGE) | tr :/ __)-1 BASE_IMAGE := local/base:1.1.3-$(shell echo $(ROOT_IMAGE) | tr :/ __)-$(shell echo $(CERTS_IMAGE) | tr :/ __) package-base: @@ -94,6 +94,11 @@ app-via-docker-goarch: DOCKER_OPTS='--env CGO_ENABLED=$(CGO_ENABLED) --env GOOS=linux --env GOARCH=$(GOARCH)' \ $(MAKE) app-via-docker +app-via-docker-goarch-arm64: + APP_SUFFIX='-arm64' \ + DOCKER_OPTS='--env CGO_ENABLED=1 --env GOOS=linux --env GOARCH=arm64 --env CC=/opt/cross-builder/aarch64-linux-musl-cross/bin/aarch64-linux-musl-gcc' \ + $(MAKE) app-via-docker + app-via-docker-windows-goarch: APP_SUFFIX='-$(GOARCH)' \ DOCKER_OPTS='--env CGO_ENABLED=0 --env GOOS=windows --env GOARCH=$(GOARCH)' \ @@ -115,7 +120,11 @@ app-via-docker-arm: GOARCH=arm $(MAKE) app-via-docker-goarch-nocgo app-via-docker-arm64: +ifeq ($(APP_NAME),vmagent) GOARCH=arm64 $(MAKE) app-via-docker-goarch-nocgo +else + $(MAKE) app-via-docker-goarch-arm64 +endif app-via-docker-ppc64le: GOARCH=ppc64le $(MAKE) app-via-docker-goarch-nocgo @@ -131,6 +140,11 @@ package-via-docker-goarch: DOCKER_OPTS='--env CGO_ENABLED=$(CGO_ENABLED) --env GOOS=linux --env GOARCH=$(GOARCH)' \ $(MAKE) package-via-docker +package-via-docker-goarch-arm64: + APP_SUFFIX='-arm64' \ + DOCKER_OPTS='--env CGO_ENABLED=1 --env GOOS=linux --env GOARCH=arm64 --env CC=/opt/cross-builder/aarch64-linux-musl-cross/bin/aarch64-linux-musl-gcc' \ + $(MAKE) package-via-docker + package-via-docker-goarch-cgo: CGO_ENABLED=1 $(MAKE) package-via-docker-goarch @@ -147,7 +161,12 @@ package-via-docker-arm: GOARCH=arm $(MAKE) package-via-docker-goarch-nocgo package-via-docker-arm64: +ifeq ($(APP_NAME),vmagent) GOARCH=arm64 $(MAKE) package-via-docker-goarch-nocgo +else + $(MAKE) package-via-docker-goarch-arm64 +endif + package-via-docker-ppc64le: GOARCH=ppc64le $(MAKE) package-via-docker-goarch-nocgo @@ -156,4 +175,4 @@ package-via-docker-386: GOARCH=386 $(MAKE) package-via-docker-goarch-nocgo remove-docker-images: - docker image ls --format '{{.Repository}}\t{{.ID}}' | grep $(DOCKER_NAMESPACE)/ | grep -v /builder | awk '{print $$2}' | xargs docker image rm -f + docker image ls --format '{{.Repository}}\t{{.ID}}' | grep $(DOCKER_NAMESPACE)/ | awk '{print $$2}' | xargs docker image rm -f diff --git a/deployment/docker/builder/Dockerfile b/deployment/docker/builder/Dockerfile index c3af52c50..c718d6ced 100644 --- a/deployment/docker/builder/Dockerfile +++ b/deployment/docker/builder/Dockerfile @@ -1,4 +1,9 @@ ARG go_builder_image FROM $go_builder_image STOPSIGNAL SIGINT -RUN apk add gcc musl-dev make --no-cache \ No newline at end of file +RUN apk add gcc musl-dev make wget --no-cache && \ + mkdir /opt/cross-builder && \ + wget https://musl.cc/aarch64-linux-musl-cross.tgz -O /opt/cross-builder/aarch64-musl.tgz && \ + cd /opt/cross-builder && \ + tar zxf aarch64-musl.tgz -C ./ && \ + rm /opt/cross-builder/aarch64-musl.tgz \ No newline at end of file diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 4f885a569..8d0456bb2 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -14,6 +14,7 @@ sort: 15 * Multi-level binary operations. For example, `foo{a="b"} + bar{x="y"} + baz{z="q"}` is now optimized to `foo{a="b",x="y",z="q"} + bar{a="b",x="y",z="q"} + baz{a="b",x="y",z="q"}` * Aggregate functions. For example, `sum(foo{a="b"}) by (c) + bar{c="d"}` is now optimized to `sum(foo{a="b",c="d"}) by (c) + bar{c="d"}` * FEATURE [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html): optimize joining with `*_info` labels. For example: `kube_pod_created{namespace="prod"} * on (uid) group_left(node) kube_pod_info` now automatically adds the needed filters on `uid` label to `kube_pod_info` before selecting series for the right side of `*` operation. This may save CPU, RAM and disk IO resources. See [this article](https://www.robustperception.io/exposing-the-software-version-to-prometheus) for details on `*_info` labels. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1827). +* FEATURE: all: improve performance for arm64 builds of VictoriaMetrics components by up to 15%. See [this pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/2102). * FEATURE: all: expose `process_cpu_cores_available` metric, which shows the number of CPU cores available to the app. The number can be fractional if the corresponding cgroup limit is set to a fractional value. This metric is useful for alerting on CPU saturation. For example, the following query alerts when the app uses more than 90% of CPU during the last 5 minutes: `rate(process_cpu_seconds_total[5m]) / process_cpu_cores_available > 0.9` . See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2107). * FEATURE: [vmalert](https://docs.victoriametrics.com/vmalert.html): add ability to configure notifiers (e.g. alertmanager) via a file in the way similar to Prometheus. See [these docs](https://docs.victoriametrics.com/vmalert.html#notifier-configuration-file), [this pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/2127). * FEATURE: [vmalert](https://docs.victoriametrics.com/vmalert.html): add support for Consul service discovery for notifiers. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1947).