Merge pull request #45879 from wojtek-t/workaround_go_performance_regression

Automatic merge from submit-queue (batch tested with PRs 45884, 45879, 45912, 45444, 45874)

Use patched version of Go 1.8.1 to eliminate performance regression

Ref https://github.com/kubernetes/kubernetes/issues/45216

Until this is solved in Go (it's still unclear whether there will be patch release with the fix or not), this is solving the problem on our side.
This commit is contained in:
Kubernetes Submit Queue 2017-05-16 22:18:52 -07:00 committed by GitHub
commit b059116a69
5 changed files with 49 additions and 2 deletions

View File

@ -19,7 +19,7 @@ FROM gcr.io/google_containers/kube-cross:KUBE_BUILD_IMAGE_CROSS_TAG
RUN touch /kube-build-image
# To run as non-root we sometimes need to rebuild go stdlib packages.
RUN chmod -R a+rwx /usr/local/go/pkg
RUN chmod -R a+rwx /usr/local/go/pkg ${K8S_PATCHED_GOROOT}/pkg
# For running integration tests /var/run/kubernetes is required
# and should be writable by user

View File

@ -77,3 +77,22 @@ RUN export ETCD_VERSION=v3.0.17; \
&& cd /usr/local/src/etcd \
&& curl -fsSL https://github.com/coreos/etcd/releases/download/${ETCD_VERSION}/etcd-${ETCD_VERSION}-linux-amd64.tar.gz | tar -xz \
&& ln -s ../src/etcd/etcd-${ETCD_VERSION}-linux-amd64/etcd /usr/local/bin/
# There is a significant performance regression in Go 1.8 comparing to Go 1.7.
# Until this is solved in Go itself, we are patching 1.8.1 version of Go to
# reduce the impact of this regression - for more detailed discussion see:
# https://github.com/kubernetes/kubernetes/issues/45216
#
# TODO: Once this issue is fixed in Go itself, we can get rid of the code below.
ENV K8S_PATCHED_GOLANG_VERSION=1.8.1 \
K8S_PATCHED_GOROOT=/usr/local/go_k8s_patched
RUN mkdir -p ${K8S_PATCHED_GOROOT} \
&& curl -sSL https://github.com/golang/go/archive/go${K8S_PATCHED_GOLANG_VERSION}.tar.gz | tar -xz -C ${K8S_PATCHED_GOROOT} --strip-components=1
COPY go_181_performance_fix.patch ${K8S_PATCHED_GOROOT}/
RUN cd ${K8S_PATCHED_GOROOT} \
&& patch -p1 < go_181_performance_fix.patch \
&& cd src \
&& GOROOT_FINAL=${K8S_PATCHED_GOROOT} GOROOT_BOOTSTRAP=/usr/local/go ./make.bash \
&& for platform in ${KUBE_CROSSPLATFORMS}; do GOOS=${platform%/*} GOARCH=${platform##*/} GOROOT=${K8S_PATCHED_GOROOT} go install std; done

View File

@ -1 +1 @@
v1.8.1-1
v1.8.1-2

View File

@ -0,0 +1,24 @@
diff --git a/src/net/http/h2_bundle.go b/src/net/http/h2_bundle.go
index 4536b2ff5d..84e78534a9 100644
--- a/src/net/http/h2_bundle.go
+++ b/src/net/http/h2_bundle.go
@@ -3536,9 +3536,17 @@ func (sc *http2serverConn) serve() {
sc.idleTimerCh = sc.idleTimer.C
}
- var gracefulShutdownCh <-chan struct{}
+ var gracefulShutdownCh chan struct{}
if sc.hs != nil {
- gracefulShutdownCh = http2h1ServerShutdownChan(sc.hs)
+ ch := http2h1ServerShutdownChan(sc.hs)
+ gracefulShutdownCh = make(chan struct{})
+ go func() {
+ select {
+ case <-sc.doneServing:
+ case <-ch:
+ close(gracefulShutdownCh)
+ }
+ }()
}
go sc.readFrames()

View File

@ -267,6 +267,10 @@ kube::golang::set_platform_envs() {
# Do not set CC when building natively on a platform, only if cross-compiling from linux/amd64
if [[ $(kube::golang::host_platform) == "linux/amd64" ]]; then
# We are currently using go 1.8.1, which has significant performance
# regression. Until this is fixed in Golang head, we are using patched
# version of Go that eliminates this problem.
export GOROOT=${K8S_PATCHED_GOROOT:-${GOROOT}}
# Dynamic CGO linking for other server architectures than linux/amd64 goes here
# If you want to include support for more server platforms than these, add arch-specific gcc names here