From addbe7f9ead0c63d9c8f48812cdfdeb6ebaa422c Mon Sep 17 00:00:00 2001 From: Jian Qiu Date: Sat, 31 May 2025 09:03:21 +0800 Subject: [PATCH] fix: bucket perform mon random string generation consume high cpu load (#22639) Co-authored-by: Qiu Jian --- pkg/mcclient/modules/compute/mod_buckets.go | 32 +++++++++++++++++++-- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/pkg/mcclient/modules/compute/mod_buckets.go b/pkg/mcclient/modules/compute/mod_buckets.go index 578a79422f..55934591f5 100644 --- a/pkg/mcclient/modules/compute/mod_buckets.go +++ b/pkg/mcclient/modules/compute/mod_buckets.go @@ -117,8 +117,34 @@ func (w *nullWriter) WriteAt(p []byte, off int64) (n int, err error) { return len(p), nil } -func getRandReader() io.Reader { - return rand.New(rand.NewSource(time.Now().UnixNano())) +var ( + randBuffer [1024]byte +) + +func init() { + for i := range randBuffer { + randBuffer[i] = byte(rand.Intn(256)) + } +} + +type randReader struct { +} + +func newRandReader() io.Reader { + return &randReader{} +} + +func (r *randReader) Read(p []byte) (n int, err error) { + offset := 0 + for offset < len(p) { + readLen := len(randBuffer) + if readLen > len(p)-offset { + readLen = len(p) - offset + } + copy(p[offset:], randBuffer[:readLen]) + offset += readLen + } + return offset, nil } func ProbeBucketStats(ctx context.Context, bucket cloudprovider.ICloudBucket, testKey string, sizeBytes int64) (*api.BucketProbeResult, error) { @@ -126,7 +152,7 @@ func ProbeBucketStats(ctx context.Context, bucket cloudprovider.ICloudBucket, te start := time.Now() // force upload object in one shot - err := cloudprovider.UploadObject(ctx, bucket, testKey, sizeBytes*2, getRandReader(), sizeBytes, cloudprovider.ACLPrivate, "", nil, false) + err := cloudprovider.UploadObject(ctx, bucket, testKey, sizeBytes*2, newRandReader(), sizeBytes, cloudprovider.ACLPrivate, "", nil, false) if err != nil { return nil, errors.Wrap(err, "cloudprovider.UploadObject") }