fix: bucket perform mon random string generation consume high cpu load (#22639)

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
This commit is contained in:
Jian Qiu
2025-05-31 09:03:21 +08:00
committed by GitHub
co-authored by Qiu Jian
parent 618722bc16
commit addbe7f9ea
+29 -3
View File
@@ -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")
}