hidemium's blog

日々学んだことをアウトプットする。

仮想マシンで構築したRook Cephのfioによるベンチマーク

前回は、Rook Cephを使って分散ストレージのインストールを試してみました。今回は、仮想マシンで構築したRook Cephから払い出したPersistentVolumeについてfioを使ってパフォーマンスのベンチマークを取ってみました。

hidemium.hatenablog.com

構成

ベンチマークについて

ストレージのパフォーマンスのベンチマークでよく使われるfioを利用してみました。

Kubernetesでfioを使ったパフォーマンスのベンチマークをする方法はいくつかあるようで、いくつか試してみましたが、最近更新がなくmanifestファイルを修正が必要だったり、fioの定義ファイルがConfigMapに測定のたびに変更が必要だったり、クラスタ外からCLIツールを使って計測するものなどいくつかありました。

いろいろな条件で測定してみかったので、シンプルにubutnuのDeploymentを作成し、その中でfioコマンドを実行することにしました。

PVCとDeploymentの作成

以下のようなmanifestファイルを作成します。ubuntuのイメージはUbuntu 22.04になります。

$ vi ubuntu.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ubuntu-pv-claim
  labels:
    app: ubuntu
spec:
  storageClassName: rook-ceph-block
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ubuntu-deployment
  labels:
    app: ubuntu
spec:
  selector:
    matchLabels:
      app: ubuntu
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: ubuntu
    spec:
      containers:
        - image: ubuntu
          name: ubuntu
          command:
            - sleep
            - infinity
          volumeMounts:
            - name: ubuntu-persistent-storage
              mountPath: /mnt/rook-vol1
      volumes:
        - name: ubuntu-persistent-storage
          persistentVolumeClaim:
            claimName: ubuntu-pv-claim

以下のコメントでPVCとDeploymentを作成します。

$ kubectl apply -f ubuntu.yaml

ubuntuのPodが起動し、PVとPVCが作成されたことを確認します。

$ kubectl get pod,pv,pvc
NAME                                     READY   STATUS    RESTARTS   AGE
pod/exdns-k8s-gateway-58bf7c6c75-vgjm8   1/1     Running   0          8d
pod/ubuntu-deployment-64548dcd7-l8gpq    1/1     Running   0          37h

NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                     STORAGECLASS      REASON   AGE
persistentvolume/pvc-39d09d74-62ec-4c14-920b-cec8995915d4   20Gi       RWO            Delete           Bound    default/ubuntu-pv-claim   rook-ceph-block            37h

NAME                                    STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE
persistentvolumeclaim/ubuntu-pv-claim   Bound    pvc-39d09d74-62ec-4c14-920b-cec8995915d4   20Gi       RWO            rook-ceph-block   37h

fioのインストール

Dockerfileを作成して、先に独自イメージをビルドしてもよいですが、シンプルにコンテナ内でfioをインストールします。また合わせて、そのあとに必要なjqもンストールします。

$ kubectl exec -it ubuntu-deployment-64548dcd7-l8gpq -- bash
# apt update
# apt install -y fio jq

fioによるパフォーマンスのベンチマーク

複数のブロックサイズと複数のI/Oパターンのタイプで測定するため、以下のようなコマンドで実行してみました。

direct=1でnon-buffered I/Oを利用し、iodepth=32でキュー中に待機させるIOリクエストの最大数を32に指定、ioengine=libaioでIOを発生させる方法としてLinux ネイティブの非同期 I/Oを指定、numjobs=8でスレッド数を8に指定、group_reportingで複数スレッドの結果をまとめてレポート、output-format=jsonで計測結果をjson形式で出力という設定を行っています。

# for BS in 4k 8k 16k 64k 1m; do
  for RW in write randwrite read randread; do
    fio -filename=/mnt/rook-vol1/test -direct=1 -iodepth=32 -rw=$RW -ioengine=libaio -bs=$BS -size=1G -numjobs=8 -runtime=30 -name=32-$RW-$BS --group_reporting --output-format=json | \
    jq -cr '[."global options".iodepth,."global options".bs, ."global options".rw, 
            .jobs[0].read.iops, .jobs[0].write.iops, 
            .jobs[0].read.bw, .jobs[0].write.bw]|@csv'
  done
done

以下のような出力がでます。

"32","4k","write",0,807.73655,0,3230
"32","4k","randwrite",0,597.798587,0,2391
"32","4k","read",7619.117402,0,30476,0
"32","4k","randread",2980.814552,0,11923,0
:

合わせて、workerノード側のUbuntu仮想マシンでも同様にfioを使ってベンチマークを取得してみます。

こちらが仮想マシンで構築したRook Cephから払い出したPersistentVolumeで測定したfioのパフォーマンスのベンチマーク結果です。

こちらが、workerノード側のUbuntu仮想マシンで測定したfioのパフォーマンスのベンチマーク結果です。

workerノードはすべて同一のサーバーで稼働しているため、Rook Cephの性能はどうしても仮想マシン単体で測定した帯域の1/10ぐらいにはなってそうでした。

workerノードが稼働しているサーバーにはNVMeが接続されており、仮想マシン単体での性能の良さが良く分かります。

仮想マシンで構築したRook Cephですが、writeに比べreadの性能が良いように見えいます。また、ランダムに比べるとシーケンシャルのほうが性能がよさそうでした。

このあたりも物理サーバーで構築したRook CephだとIO特性が変わってくるのかもしれません。

仮想マシンで構築したRook Cephについて、homelabでPVCを利用して試す分には性能として問題なさそうには見えています。

参考