diff --git a/CHANGELOG-3.5.md b/CHANGELOG-3.5.md index 1a875e8f687..4784126780c 100644 --- a/CHANGELOG-3.5.md +++ b/CHANGELOG-3.5.md @@ -156,7 +156,8 @@ Note that any `etcd_debugging_*` metrics are experimental and subject to change. - Add [`--socket-reuse-port`](https://github.com/etcd-io/etcd/pull/12702) flag - Setting this flag enables `SO_REUSEPORT` which allows rebind of a port already in use. User should take caution when using this flag to ensure flock is properly enforced. - Add [`--socket-reuse-address`](https://github.com/etcd-io/etcd/pull/12702) flag - - Setting this flag enables `SO_REUSEADDR` which allows binding to an address in `TIME_WAIT` state, improving etcd restart time. + - Setting this flag enables `SO_REUSEADDR` which allows binding to an address in `TIME_WAIT` state, improving etcd restart time. +- Reduce [around 30% memory allocation by logging range response size without marshal](https://github.com/etcd-io/etcd/pull/12871). ### Package `runtime` - Optimize [`runtime.FDUsage` by removing unnecessary sorting](https://github.com/etcd-io/etcd/pull/12214). diff --git a/server/etcdserver/apply.go b/server/etcdserver/apply.go index f80f89ca332..b249555ae92 100644 --- a/server/etcdserver/apply.go +++ b/server/etcdserver/apply.go @@ -245,7 +245,7 @@ func (a *applierV3backend) Put(ctx context.Context, txn mvcc.TxnWrite, p *pb.Put trace = traceutil.New("put", a.s.Logger(), traceutil.Field{Key: "key", Value: string(p.Key)}, - traceutil.Field{Key: "req_size", Value: proto.Size(p)}, + traceutil.Field{Key: "req_size", Value: p.Size()}, ) } val, leaseID := p.Value, lease.LeaseID(p.Lease) @@ -625,7 +625,7 @@ func (a *applierV3backend) applyTxn(ctx context.Context, txn mvcc.TxnWrite, rt * trace.StartSubTrace( traceutil.Field{Key: "req_type", Value: "put"}, traceutil.Field{Key: "key", Value: string(tv.RequestPut.Key)}, - traceutil.Field{Key: "req_size", Value: proto.Size(tv.RequestPut)}) + traceutil.Field{Key: "req_size", Value: tv.RequestPut.Size()}) resp, _, err := a.Put(ctx, txn, tv.RequestPut) if err != nil { lg.Panic("unexpected error during txn", zap.Error(err)) diff --git a/server/etcdserver/util.go b/server/etcdserver/util.go index 87cf8ed9a84..265dbae6737 100644 --- a/server/etcdserver/util.go +++ b/server/etcdserver/util.go @@ -139,7 +139,7 @@ func warnOfExpensiveReadOnlyTxnRequest(lg *zap.Logger, warningApplyDuration time // only range responses should be in a read only txn request } } - resp = fmt.Sprintf("responses:<%s> size:%d", strings.Join(resps, " "), proto.Size(txnResponse)) + resp = fmt.Sprintf("responses:<%s> size:%d", strings.Join(resps, " "), txnResponse.Size()) } warnOfExpensiveGenericRequest(lg, warningApplyDuration, now, reqStringer, "read-only txn ", resp, err) } @@ -147,7 +147,7 @@ func warnOfExpensiveReadOnlyTxnRequest(lg *zap.Logger, warningApplyDuration time func warnOfExpensiveReadOnlyRangeRequest(lg *zap.Logger, warningApplyDuration time.Duration, now time.Time, reqStringer fmt.Stringer, rangeResponse *pb.RangeResponse, err error) { var resp string if !isNil(rangeResponse) { - resp = fmt.Sprintf("range_response_count:%d size:%d", len(rangeResponse.Kvs), proto.Size(rangeResponse)) + resp = fmt.Sprintf("range_response_count:%d size:%d", len(rangeResponse.Kvs), rangeResponse.Size()) } warnOfExpensiveGenericRequest(lg, warningApplyDuration, now, reqStringer, "read-only range ", resp, err) }