What version of Go are you using (go version)?
go version go1.9 linux/amd64
go version go1.10 linux/amd64
Does this issue reproduce with the latest release?
yes
What operating system and processor architecture are you using (go env)?
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/user/.cache/go-build"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/user/go"
GORACE=""
GOROOT="/usr/lib/go"
GOTMPDIR=""
GOTOOLDIR="/usr/lib/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build843745536=/tmp/go-build -gno-record-gcc-switches"
What did you do?
I use a very simple program created in December 2016 which use aws-go-sdk to get a metric on ELB.
It has been compile with go 1.8 and there is no problem until now.
I had to re-compiled it recently (with go 1.9) to add changes and I noticed a degradation of the performance.
Since I also tested go 1.10 and there I noticed the same behavior as for 1.9 version.
The code is exactly the same but 1.9/1.10 binary version execution time is more than 2x greater than with the 1.7/1.8 binary version.
package main
import (
"fmt"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/cloudwatch"
"os"
"time"
)
func main() {
region := os.Args[1]
elb_name := os.Args[2]
metric_name := os.Args[3]
metric_stat := "Sum"
if len(os.Args) > 4 {
metric_stat = os.Args[4]
}
svc := cloudwatch.New(session.New(), &aws.Config{Region: aws.String(region)})
dur, _ := time.ParseDuration("300s")
params := &cloudwatch.GetMetricStatisticsInput{
StartTime: aws.Time(time.Now().Add(-dur)), // Required
EndTime: aws.Time(time.Now()), // Required
MetricName: aws.String(metric_name), // Required
Namespace: aws.String("AWS/ELB"), // Required
Period: aws.Int64(300), // Required
Statistics: []*string{ // Required
aws.String(metric_stat), // Required
},
Dimensions: []*cloudwatch.Dimension{
{ // Required
Name: aws.String("LoadBalancerName"), // Required
Value: aws.String(elb_name), // Required
},
},
//Unit: aws.String("Count"),
}
resp, err := svc.GetMetricStatistics(params)
if err != nil {
panic(err)
}
fmt.Println(resp)
}
i.e. result of a test run for each version :
for 1.8.7 version :
time ./elb-check.go187 eu-west-1 test-elb Latency Average
{
Datapoints: [{
Average: 0.15102177378775059,
Timestamp: 2018-02-20 11:01:00 +0000 UTC,
Unit: "Seconds"
}],
Label: "Latency"
}
real 0m0.057s
user 0m0.028s
sys 0m0.008s
for 1.10 version :
time ./elb-check.go19 eu-west-1 test-elb Latency Average
{
Datapoints: [{
Average: 0.15102177378775059,
Timestamp: 2018-02-20 11:01:00 +0000 UTC,
Unit: "Seconds"
}],
Label: "Latency"
}
real 0m0.123s
user 0m0.104s
sys 0m0.000s
I suspect it is linked to the ssl request made to cloudwatch and so the issue #23727
Here is a pprof cpu pdf for 1.8 version :
out-go18.pdf
And the same for 1.10 version :
out-go110.pdf
What did you expect to see?
Almost the same performance / time execution.
What did you see instead?
An increase of the time execution and the resource consumption
Thanks
What version of Go are you using (
go version)?Does this issue reproduce with the latest release?
yes
What operating system and processor architecture are you using (
go env)?What did you do?
I use a very simple program created in December 2016 which use aws-go-sdk to get a metric on ELB.
It has been compile with go 1.8 and there is no problem until now.
I had to re-compiled it recently (with go 1.9) to add changes and I noticed a degradation of the performance.
Since I also tested go 1.10 and there I noticed the same behavior as for 1.9 version.
The code is exactly the same but 1.9/1.10 binary version execution time is more than 2x greater than with the 1.7/1.8 binary version.
i.e. result of a test run for each version :
for 1.8.7 version :
for 1.10 version :
I suspect it is linked to the ssl request made to cloudwatch and so the issue #23727
Here is a pprof cpu pdf for 1.8 version :
out-go18.pdf
And the same for 1.10 version :
out-go110.pdf
What did you expect to see?
Almost the same performance / time execution.
What did you see instead?
An increase of the time execution and the resource consumption
Thanks