Monday, September 16, 2024

Benchmark hiệu năng Storage S3 với S3-benchmark

-

1. Tổng quan.

S3-benchmark là một công cụ kiểm tra hiệu năng do Wasabi cung cấp để thực hiện các hoạt động S3 (PUT, GET và DELETE) cho các đối các Storage S3. Bên cạnh việc cấu hình bucket, kích thước đối tượng và số luồng có thể được thay đổi để phục vụ cho các bài kiểm tra khác nhau.

Công cụ kiểm tra này được xây dựng dựa trên phương pháp đo hiệu năng của Nasuni http://www6.nasuni.com/rs/nasuni/images/Nasuni-2015-State-of-Cloud-Storage-Report.pdf được sử dụng để kiểm tra hiệu năng của các nhà cung cấp S3 khác nhau.

2. Đều kiện tiên quyết

Để sử dụng công cụ này, bạn cần đáp ứng các điều kiện tiên quyết sau:

  • Môi trường phát triển Git
  • Kiến thức lập trình shell trên Ubuntu Linux
  • Máy tính có cài đặt Golang.
  • Truy cập vào AWS EC2 hoặc tương đương phù hợp (hiệu năng tối ưu đạt được khi sử dụng m4.10xlarge EC2 Ubuntu với ENA 10 GB).

3 .Xây dựng chương trình.

Clone source code về máy tính.

git clone https://github.com/wasabi-tech/s3-benchmark.git
  • Bạn sẽ thấy các file sau trong thư mục s3-benchmark:
    • LICENSE
    • README.md
    • s3-benchmark.go
    • s3-benchmark.ubuntu

Để build file thực thi s3-benchmark, bạn cần chạy lệnh sau:

cd s3-benchmark/

Mình xóa 2 file không cần thiết cho gọn.

rm -f s3-benchmark s3-benchmark.ubuntu 

Mở file s3-benchmark.go và xóa hoặc comment lại dòng "github.com/pivotal-golang/bytefmt" và thêm dòng "dateHdr := time.Now().UTC().Format(time.UnixDate)".

func setSignature(req *http.Request) {
        // Setup default parameters
        // dateHdr := time.Now().UTC().Format("20060102T150405Z")
        dateHdr := time.Now().UTC().Format(time.UnixDate)
        req.Header.Set("X-Amz-Date", dateHdr)
        // Get the canonical resource and header
        canonicalResource := req.URL.EscapedPath()
        canonicalHeaders := canonicalAmzHeaders(req)
        stringToSign := req.Method + "\n" + req.Header.Get("Content-MD5") + "\n" + req.Header.Get("Content-Type") + "\n\n" +
                canonicalHeaders + canonicalResource
        hash := hmacSHA1([]byte(secret_key), stringToSign)
        signature := base64.StdEncoding.EncodeToString(hash)
        req.Header.Set("Authorization", fmt.Sprintf("AWS %s:%s", access_key, signature))
}

Tiếp tục xóa hoặc comment dòng "github.com/aws/aws-sdk-go/service/s3" và thêm dòng "code.cloudfoundry.org/bytefmt".

import (
        "bytes"
        "crypto/hmac"
        "crypto/md5"
        "crypto/sha1"
        "crypto/tls"
        "encoding/base64"
        "flag"
        "fmt"
        "github.com/aws/aws-sdk-go/aws"
        "github.com/aws/aws-sdk-go/aws/credentials"
        "github.com/aws/aws-sdk-go/aws/session"
        "github.com/aws/aws-sdk-go/service/s3"
        // "github.com/pivotal-golang/bytefmt"
        "code.cloudfoundry.org/bytefmt"
        "io"
        "io/ioutil"
        "log"
        "math/rand"
        "net"
        "net/http"
        "os"
        "sort"
        "strconv"
        "strings"
        "sync"
        "sync/atomic"
        "time"
)

Đối với MacOS, sử dụng brew để cài đặt Go

brew install go

Đối với Ubuntu bạn có thể sử dụng cú pháp dưới đây.

apt update
apt install golang-go -y

Và đây là version Golang.

shell> go version
go version go1.22.5 darwin/amd64 # MACOS

shell> go version
go version go1.13.8 linux/amd64 # Ubuntu 20.04

Tạo module s3-benchmark.

shell> go mod init s3-benchmark
go: creating new go.mod: module s3-benchmark
go: to add module requirements and sums:
	go mod tidy

Chạy lệnh go mod tidy.

shell> go mod tidy
go: finding module for package code.cloudfoundry.org/bytefmt
go: finding module for package github.com/aws/aws-sdk-go/aws/credentials
go: finding module for package github.com/aws/aws-sdk-go/aws
go: finding module for package github.com/aws/aws-sdk-go/aws/session
go: finding module for package github.com/aws/aws-sdk-go/service/s3
go: downloading github.com/aws/aws-sdk-go v1.55.3
go: downloading code.cloudfoundry.org/bytefmt v0.0.0-20240726181224-f9b67668c814
go: found code.cloudfoundry.org/bytefmt in code.cloudfoundry.org/bytefmt v0.0.0-20240726181224-f9b67668c814
go: found github.com/aws/aws-sdk-go/aws in github.com/aws/aws-sdk-go v1.55.3
go: found github.com/aws/aws-sdk-go/aws/credentials in github.com/aws/aws-sdk-go v1.55.3
go: found github.com/aws/aws-sdk-go/aws/session in github.com/aws/aws-sdk-go v1.55.3
go: found github.com/aws/aws-sdk-go/service/s3 in github.com/aws/aws-sdk-go v1.55.3
go: downloading github.com/onsi/ginkgo/v2 v2.19.1
go: downloading github.com/onsi/gomega v1.34.0
go: downloading github.com/jmespath/go-jmespath v0.4.0
go: downloading github.com/google/go-cmp v0.6.0
go: downloading gopkg.in/yaml.v3 v3.0.1
go: downloading golang.org/x/net v0.27.0
go: downloading github.com/go-logr/logr v1.4.2
go: downloading golang.org/x/sys v0.22.0
go: downloading golang.org/x/tools v0.23.0
go: downloading github.com/go-task/slim-sprig/v3 v3.0.0
go: downloading github.com/google/pprof v0.0.0-20240722153945-304e4f0156b8
go: downloading golang.org/x/text v0.16.0
go: downloading github.com/jmespath/go-jmespath/internal/testify v1.5.1
go: downloading github.com/davecgh/go-spew v1.1.0
go: downloading gopkg.in/yaml.v2 v2.2.8
go: downloading github.com/pmezard/go-difflib v1.0.0

Sáu đó tiến hành build chương trình.

shell> go build s3-benchmark.go
go: finding github.com/jmespath/go-jmespath v0.4.0

Build xong hãy phân quyền thực thi cho nó.

chmod +x s3-benchmark.go

Các tham số dòng lệnh

Dưới đây là các tham số dòng lệnh cho chương trình (có thể được hiển thị bằng cách sử dụng -help):

  • -a string: S3 Access key.
  • -b string: Bucket để kiểm tra (mặc định “wasabi-benchmark-bucket”).
  • -d int: Thời gian của mỗi bài kiểm tra tính bằng giây (mặc định 60).
  • -r string: Region (vùng, mặc định là us-east-1).
  • -l int: Số lần lặp lại bài kiểm tra (mặc định 1).
  • -s string: S3 Secret key.
  • -t int: Số luồng để chạy (mặc định 1).
  • -u string: URL cho máy chủ S3 (mặc định “http://s3.wasabisys.com“)
  • -z string: Kích thước của các đối tượng tính bằng byte với các tham số bổ sung là K, M và G (mặc định “1M”).

Cách Benchmark

Dưới đây là một ví dụ chạy benchmark cho 10 luồng với kích thước đối tượng mặc định 1MB. Benchmark báo cáo cho mỗi hoạt động PUT, GET và DELETE kết quả về tốc độ dữ liệu và các hoạt động trên mỗi giây.

Chương trình ghi tất cả kết quả vào file nhật ký benchmark.log.

shell> ./s3-benchmark.ubuntu -a MY-ACCESS-KEY -b jeff-s3-benchmark -s MY-SECRET-KEY -t 10 
Wasabi benchmark program v2.0
Parameters: url=http://s3.wasabisys.com, bucket=jeff-s3-benchmark, duration=60, threads=10, loops=1, size=1M
Loop 1: PUT time 60.1 secs, objects = 5484, speed = 91.3MB/sec, 91.3 operations/sec.
Loop 1: GET time 60.1 secs, objects = 5483, speed = 91.3MB/sec, 91.3 operations/sec.
Loop 1: DELETE time 1.9 secs, 2923.4 deletes/sec.
Benchmark completed.

Hoặc bạn cũng có thể làm bài kiểu tra với nhiều size và thread theo đoạn shell như dưới.

for thread in 1 2 4 8 16
do
    for size in 4k 16k 1M 2M 4M 16M 128M 512M 1G 2G 4G
    do 
    date 
    ./s3-benchmark -u https://s3.domain.com.vn \
               -r region_name \
               -b container_name \
               -a "MY-ACCESS-KEY" \
               -s "MY-SECRET-KEY"  \
               -t $thread -z $size
    done 
done

Kết quả benchmark kiểm tra hiệu năng của bạn có thể thay đổi thường xuyên nhất do những hạn chế của kết nối mạng của bạn với nhà cung cấp S3.

Bạn cũng có thể cài iftop và nload để theo dõi traffic trên máy client.

brew install iftop
brew install nload

Với nload bạn có thể chạy nload luôn còn đối với iftop bạn có thể chạy với cú pháp như dưới đây.

iftop -i [interface_name] -f "dst host [destination_s3_url]"

Chúc các bạn thành công.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories