Tüm Ürünler
Search
Belge Merkezi

Object Storage Service:ossfs 2.0 performance benchmarks

Son Güncelleme:Oct 02, 2026

Bu belge, ardışık G/Ç ve eşzamanlı küçük dosya okumalarında ölçülen aktarım hızı, CPU kullanımı ve bellek tüketimi açısından ossfs 2,0, ossfs 1,0 ve goofys arasında yapılan karşılaştırmaları sunar.

Test ortamı

  • Donanım ortamı

    • Örnek türü: ecs.g9i.48xlarge

    • vCPU: 192 vCPU

    • Bellek: 768 GiB

    • Ağ bant genişliği: 64 Gbps

  • Yazılım ortamı

    • İşletim sistemi: Alibaba Cloud Linux 3.2104 LTS 64-bit

    • Çekirdek sürümü: 5.10.134-18.al8.x86_64

    • Araç sürümleri: ossfs 2,0.4, ossfs 1.91.8 ve goofys 0.24.0

Bağlama yapılandırmaları

Bu karşılaştırmada kullanılan bağlama seçenekleri aşağıdadır:

Not

Bu test HTTPS uç noktalarını kullanır. Güvenilir bir ortamda HTTP uç noktaları, aynı aktarım hızında CPU yükünü azaltır.

ossfs 2,0.4

  • Bağlama yapılandırma dosyası (ossfs2.conf)

    Karşıya yükleme parça boyutu 33554432 bayt (32 MB) olarak ayarlanmıştır.

    # The endpoint of the bucket's region
    --oss_endpoint=https://oss-cn-hangzhou-internal.aliyuncs.com
    
    # The bucket name
    --oss_bucket=bucket-test
    
    # The AccessKey ID and AccessKey secret
    --oss_access_key_id=yourAccessKeyID
    --oss_access_key_secret=yourAccessKeySecret
    
    # The upload part size, in bytes
    --upload_buffer_size=33554432
  • Bağlama komutu

    bucket-test paketini /mnt/ossfs2/ dizinine ossfs2.conf kullanarak bağlayın:

    ossfs2 mount /mnt/ossfs2/ -c /etc/ossfs2.conf

ossfs 1.91.8

bucket-test paketini doğrudan okuma ve önbellek optimizasyonu etkinleştirilmiş şekilde /mnt/ossfs dizinine bağlayın:

ossfs bucket-test /mnt/ossfs -ourl=https://oss-cn-hangzhou-internal.aliyuncs.com -odirect_read -oreaddir_optimize

goofys 0.24.0

bucket-test paketini /mnt/goofys dizinine bağlayın:

goofys --endpoint https://oss-cn-hangzhou-internal.aliyuncs.com --subdomain bucket-test --stat-cache-ttl 60s --type-cache-ttl 60s /mnt/goofys

Test senaryoları

Her araç aynı paketi bağladıktan sonra FIO ile okuma/yazma performansı ölçülmüştür. Sonuçlar aşağıda verilmiştir.

Tek iş parçacıklı ardışık yazma (100 GB)

Not

ossfs 1,0 yazma performansı disk G/Ç'si ile sınırlıdır.

  • Test komutu

    1 MB'lik blok boyutuyla tek iş parçacıklı doğrudan 100 GB yazın:

    fio --name=file-100G --ioengine=libaio --rw=write --bs=1M --size=100G --numjobs=1 --direct=1 --directory=/mnt/oss/fio_direct_write --group_reporting
  • Test sonuçları


    Araç


    Bant Genişliği


    CPU Çekirdek Kullanımı (Tam yüklü tek çekirdek için %100)


    Azami Bellek


    ossfs 2,0


    2,2 GB/sn


    %207


    2167 MB


    ossfs 1,0


    118 MB/sn


    %5


    15 MB


    goofys


    450 MB/sn


    %250


    7,5 GB

Tek iş parçacıklı ardışık okuma (100 GB)

  • Test komutu

    Sayfa önbelleğini temizleyin, ardından 1 MB'lik bloklarla tek iş parçacıklı ardışık okuma yapın:

    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
  • Test sonuçları


    Test Aracı


    Bant Genişliği


    CPU Çekirdek Kullanımı (Tam yüklü tek çekirdek için %100)


    Azami Bellek


    ossfs 2,0


    4,3 GB/sn


    %610


    1629 MB


    ossfs 1,0


    1,0 GB/sn


    %530


    260 MB


    goofys


    1,3 GB/sn


    %270


    976 MB

Çok iş parçacıklı ardışık okuma (4 × 100 GB)

  • Test dosyalarını oluşturun

    /mnt/oss/fio dizininde dört adet 100 GB'lık test dosyası oluşturun:

    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
  • Test komutu

    Sayfa önbelleğini temizleyin, ardından /mnt/oss/fio dizinindeki dört adet 100 GB'lık dosyayı 4 iş parçacığıyla 30 saniye boyunca (1 MB'lik bloklarla) okuyun:

    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
  • Test sonuçları


    Araç


    Bant Genişliği


    CPU Çekirdek Kullanımı (Tam yüklü tek çekirdek için %100)


    Azami Bellek


    ossfs 2,0


    7,4 GB/sn


    %890


    6,2 GB


    ossfs 1,0


    1,8 GB/sn


    %739


    735 MB


    goofys


    2,8 GB/sn


    %7800


    2,7 GB

Eşzamanlı küçük dosya okuma (128 iş parçacığı, 100K × 128 KB)

Not

OSS varsayılan olarak 10.000 QPS sınırına sahiptir. Bu sonuçları tekrarlamak için, test hesabının QPS kotasını başka hizmetlerin tüketmediğinden emin olun.

  • Adımlar

    1. rw-bench.go adında bir Go programı oluşturun.

      Program, hedef dizindeki dosyaları eşzamanlı olarak oluşturur veya okur ve aktarım hızını raporlar.

      Örnek kod

      package main
      
      import (
      	"flag"
      	"fmt"
      	"io"
      	"log"
      	"os"
      	"path/filepath"
      	"sync"
      	"time"
      )
      
      var dir = flag.String("dir", "", "work dir")
      var threads = flag.Int("threads", 8, "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. rw-bench.go program dosyasını derleyin.

      go build rw-bench.go
    3. Bağlı dizinde 100.000 dosya (her biri 128 KB) oluşturun:

      mkdir -p <path_to_mounted_test_directory> && ./rw-bench --dir <path_to_mounted_test_directory> --file-size-KB 128 --file-count 100000 --write
    4. Sayfa önbelleğini temizleyin ve testi beş kez çalıştırın. Gecikme süresi kararlı hale geldikten sonraki durağan durum sonuçlarını kaydedin.

      echo 1 > /proc/sys/vm/drop_caches
      ./rw-bench --dir <path_to_mounted_test_directory> --threads 128
  • Test sonuçları


    Araç


    Bant Genişliği


    CPU Çekirdek Kullanımı (Tam yüklü tek çekirdek için %100)


    Azami Bellek


    ossfs 2,0


    1 GB/sn


    %247


    176 MB


    ossfs 1,0


    45 MB/sn


    %25


    412 MB


    goofys


    1 GB/sn


    %750


    1,3 GB