全部产品
Search
文档中心

Container Service for Kubernetes:Uji performa klien ossfs 2.0

更新时间:Jun 26, 2025

Topik ini menjelaskan performa ossfs 2.0 dalam berbagai skenario, termasuk kecepatan membaca dan menulis file serta performa dalam skenario konkurensi. Informasi ini memberikan referensi performa yang akurat untuk membantu Anda memilih dan menggunakan ossfs 2.0 dengan lebih baik untuk operasi bisnis Anda.

Lingkungan pengujian

  • Perangkat Keras

    • Tipe Instans: ecs.g7.32xlarge

    • vCPU: 128 vCPU

    • Memori: 512 GiB

  • Perangkat Lunak

    • Sistem Operasi: Alibaba Cloud Linux 3.2104 LTS 64-bit

    • Versi Kernel: 5.10.134-18.al8.x86_64

    • Versi ossfs: ossfs 2.0.0beta, ossfs 1.91.4

Konfigurasi mount

Asumsikan bahwa jalur mount volume OSS di dalam kontainer adalah /mnt/oss.

  • ossfs 2.0

    Dalam pengujian ini, tambahkan parameter otherOpts untuk menentukan ukuran unggah multipart sebesar 33.554.432 byte.

    upload_buffer_size=33554432
  • ossfs 1.0

    Dalam pengujian ini, tambahkan parameter otherOpts untuk mengaktifkan mode baca langsung dan optimasi cache.

    -o direct_read -o readdir_optimize

Skenario pengujian

Setelah Bucket OSS dimount menggunakan ossfs 2.0.0beta dan ossfs 1.91.4, alat uji I/O fleksibel (FIO) digunakan untuk menguji kemampuan dasar membaca dan menulis ossfs 2.0 dan ossfs 1.0. Skenario pengujian dan hasilnya adalah sebagai berikut.

Menulis data 100 GB secara berurutan menggunakan satu thread

Catatan

Performa tulis ossfs 1.0 dibatasi oleh performa disk.

  • Perintah Pengujian

    Gunakan FIO untuk menjalankan tugas pengujian bernama file-100G dengan satu thread untuk menulis langsung 100 GB data dengan ukuran bagian 1 MB ke direktori /mnt/oss/fio_direct_write dan keluarkan hasil pengujian.

    fio --name=file-100G --ioengine=libaio --rw=write --bs=1M --size=100G --numjobs=1 --direct=1 --directory=/mnt/oss/fio_direct_write --group_reporting
  • Hasil Pengujian

    Versi ossfs

    Bandwidth

    Penggunaan core CPU (kapasitas penuh satu core adalah 100%)

    Memori puncak

    ossfs 2.0

    2,2 GB/s

    207%

    2.167 MB

    ossfs 1.0

    118 MB/s

    5%

    15 MB

Membaca data 100 GB secara berurutan menggunakan satu thread

  • Perintah Pengujian

    Setelah membersihkan page cache, gunakan FIO untuk membaca 100 GB data dengan ukuran bagian 1 MB dari direktori /mnt/oss/fio_direct_write secara berurutan menggunakan satu thread dan keluarkan hasil pengujian.

    echo 1 > /proc/sys/vm/drop_caches
    fio --name=file-100G --ioengine=libaio --direct=1 --rw=read --bs=1M --directory=/mnt/oss/fio_direct_write --group_reporting --numjobs=1
  • Hasil Pengujian

    Versi ossfs

    Bandwidth

    Penggunaan core CPU (kapasitas penuh satu core adalah 100%)

    Memori puncak

    ossfs 2.0

    3,0 GB/s

    378%

    1.617 MB

    ossfs 1.0

    355 MB/s

    50%

    400 MB

Membaca data 100 GB secara berurutan menggunakan beberapa thread

  • Membuat File Uji

    Buat 4 file, masing-masing 100 GB, di direktori mount /mnt/oss/fio.

    fio --name=file-100g --ioengine=libaio --direct=1 --iodepth=1 --numjobs=4 --nrfiles=1 --rw=write --bs=1M  --size=100G --group_reporting --thread --directory=/mnt/oss/fio
  • Perintah Pengujian

    Setelah membersihkan page cache, gunakan FIO untuk membaca secara bersamaan 4 file yang telah dibuat dengan ukuran bagian 1 MB di direktori /mnt/oss/fio selama 30 detik menggunakan 4 thread dan keluarkan hasilnya.

    echo 1 > /proc/sys/vm/drop_caches
    fio --name=file-100g --ioengine=libaio --direct=1 --iodepth=1 --numjobs=4 --nrfiles=1 --rw=read --bs=1M  --size=100G --group_reporting --thread --directory=/mnt/oss/fio --time_based --runtime=30
  • Hasil Pengujian

    Versi ossfs

    Bandwidth

    Penggunaan core CPU (kapasitas penuh satu core adalah 100%)

    Memori puncak

    ossfs 2.0

    7,1 GB/s

    1.187%

    6,2 GB

    ossfs 1.0

    1,4 GB/s

    210%

    1,6 GB

Membaca 100.000 file dengan ukuran 128 KB masing-masing menggunakan 128 thread secara bersamaan

Catatan

Object Storage Service (OSS) menyediakan hingga 10.000 permintaan per detik (QPS) untuk setiap akun Alibaba Cloud. Untuk informasi lebih lanjut, lihat QPS. Untuk mencapai performa yang diinginkan dalam pengujian, pastikan QPS untuk akun Alibaba Cloud Anda tidak digunakan oleh bisnis lain.

  • Prosedur Pengujian

    1. Buat program Go bernama rw-bench.go.

      Program ini memiliki fitur inti berikut: 1. Dapat membuat beberapa file dengan ukuran yang sama di direktori file tujuan secara bersamaan. 2. Dapat membaca semua file di direktori file tujuan secara bersamaan, membagi file ke n thread untuk dibaca, dan mencatat data bandwidth.

      Contoh Kode

      package main
      
      import (
      	"flag"
      	"fmt"
      	"io"
      	"log"
      	"os"
      	"path/filepath"
      	"sync"
      	"time"
      )
      
      var dir = flag.String("dir", "", "work dir")
      var threads = flag.Int("threads", 128, "concurrency threads count")
      var isWrite = flag.Bool("write", false, "test write files")
      var fileSize = flag.Int64("file-size-KB", 128, "file size in KBytes")
      var fileCount = flag.Int("file-count", 0, "file count")
      
      type fileInfo struct {
      	Name string
      	Size int64
      }
      
      func getFileList(dir string, isWrite bool) []fileInfo {
      	var files []fileInfo
      
      	if isWrite {
      		for i := 0; i < *fileCount; i++ {
      			files = append(files, fileInfo{
      				Name: fmt.Sprintf("%v/%v.dat", dir, i),
      				Size: *fileSize * 1024,
      			})
      		}
      	} else {
      		err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
      			if err != nil {
      				return err
      			}
      			if !info.IsDir() {
      				files = append(files, fileInfo{
      					Name: path,
      					Size: info.Size(),
      				})
      			}
      			return nil
      		})
      
      		if err != nil {
      			log.Fatalf("Error walking the path %v: %v\n", dir, err)
      		}
      	}
      
      	return files
      }
      
      func worker(taskChan <-chan fileInfo, wg *sync.WaitGroup, bytesChan chan<- int64, isWrite bool) {
      	defer wg.Done()
      	buffer := make([]byte, 1024*1024)
      
      	for fInfo := range taskChan {
      		var fd *os.File
      		var err error
      		if isWrite {
      			fd, err = os.OpenFile(fInfo.Name, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644)
      			if err != nil {
      				fmt.Printf("Failed to create/open %v with %v\n", fInfo.Name, err)
      				continue
      			}
      		} else {
      			fd, err = os.OpenFile(fInfo.Name, os.O_RDONLY, 0)
      			if err != nil {
      				fmt.Printf("Failed to open %v with %v\n", fInfo.Name, err)
      				continue
      			}
      		}
      
      		offset := int64(0)
      		var totalBytes int64
      		for offset < fInfo.Size {
      			var n int
      
      			if offset+int64(len(buffer)) > fInfo.Size {
      				buffer = buffer[:fInfo.Size-offset]
      			}
      
      			if isWrite {
      				n, err = fd.WriteAt(buffer, offset)
      				if err != nil {
      					fmt.Printf("Failed to write file %v at %v, with %v\n", fInfo.Name, offset, err)
      					break
      				}
      			} else {
      				n, err = fd.ReadAt(buffer, offset)
      				if err != nil && err != io.EOF {
      					fmt.Printf("Failed to read file %v at %v, with %v\n", fInfo.Name, offset, err)
      					break
      				}
      			}
      
      			totalBytes += int64(n)
      			offset += int64(n)
      		}
      
      		fd.Close()
      		bytesChan <- totalBytes
      	}
      }
      
      func doBench(dir string, isWrite bool) {
      	files := getFileList(dir, isWrite)
      	var wg sync.WaitGroup
      
      	if isWrite {
      		fmt.Printf("start write bench with %v files\n", len(files))
      	} else {
      		fmt.Printf("start read bench with %v files\n", len(files))
      	}
      
      	taskChan := make(chan fileInfo, 1024)
      
      	go func(taskChan chan<- fileInfo) {
      		for _, fInfo := range files {
      			taskChan <- fInfo
      		}
      		close(taskChan)
      	}(taskChan)
      
      	bytesChan := make(chan int64, 1024)
      	for i := 0; i < *threads; i++ {
      		wg.Add(1)
      		go worker(taskChan, &wg, bytesChan, isWrite)
      	}
      
      	st := time.Now()
      	go func() {
      		wg.Wait()
      		close(bytesChan)
      	}()
      
      	var totalBytes int64
      	for bytes := range bytesChan {
      		totalBytes += bytes
      	}
      
      	ed := time.Now()
      	duration := ed.Sub(st)
      	throughput := float64(totalBytes) / (float64(duration.Nanoseconds()) / 1e9)
      
      	fmt.Printf("Total time: %v\n", duration)
      	if isWrite {
      		fmt.Printf("Write throughput: %.2f MBytes/s\n", throughput/1000/1000)
      	} else {
      		fmt.Printf("Read throughput: %.2f MBytes/s\n", throughput/1000/1000)
      	}
      }
      
      func main() {
      	flag.Parse()
      
      	workdir := *dir
      	if workdir == "" {
      		flag.Usage()
      		os.Exit(1)
      	}
      
      	if _, err := os.Stat(workdir); err != nil {
      		fmt.Printf("Failed to access %v with %v\n", workdir, err)
      		os.Exit(1)
      	}
      
      	doBench(workdir, *isWrite)
      }
      
    2. Kompilasi file program rw-bench.go.

      go build rw-bench.go
    3. Buat 100.000 file dengan ukuran 128 KB masing-masing di direktori Bucket OSS yang dimount ke sistem file lokal.

      mkdir -p <Jalur file uji yang dimount> && ./rw-bench --dir <Jalur file uji yang dimount> --file-size-KB 128 --file-count 100000 --write
    4. Bersihkan page cache dan jalankan program. Setelah melakukan pengujian sebanyak 5 kali berturut-turut, gunakan data pengujian yang diperoleh dari pengujian dengan latensi stabil di server.

      echo 1 > /proc/sys/vm/drop_caches
      ./rw-bench --dir <Jalur file uji yang dimount> --threads 128
  • Hasil Pengujian

    Versi ossfs

    Bandwidth

    Penggunaan core CPU (kapasitas penuh satu core adalah 100%)

    Memori puncak

    ossfs 2.0

    1 GB/s

    247%

    212 MB

    ossfs 1.0

    3,5 MB/s

    3%

    200 MB