dd:磁盤讀寫性能測試
語法:
dd if=/dev/zero of=/root/testfile bs=1G count=1 oflag=direct/dsync/sync
iperf3:網絡帶寬性能測試
rados bench:Ceph 自帶的 rados 性能測試工具
語法:
rados bench -p <pool_name> <seconds> <write|seq|rand> -b <block size> -t --no-cleanup
rados load-gen:Ceph 自帶的 rados 性能測試工具,可在集群內產生指定類型的負載,比 rados bench 功能豐富,能指定更多的參數
語法:
rados -p rbd load-gen
選項說明:
--num-objects #產生的對象數目
--min-object-size #最小對象大小
--max-object-size #最大對象大小
--max-ops #最大操作數目
--min-op-len #最小操作長度
--max-op-len #最大操作長度
--read-percent #讀操作的百分比
--target-throughput #目標吞吐量,單位 MB
--run-length #運行時長,單位秒
rbd bench-write:ceph 自帶的 rbd 性能測試工具,只能對塊設備做寫測試
語法:
rbd bench-write <rbd image name>
選項說明:
--io-size:單位 byte,默認 4M
--io-threads:線程數,默認 16
--io-total:總寫入字節,默認 1024M
--io-pattern <seq|rand>:寫模式,默認為 seq 即順序寫
fio + rbd ioengine:fio 結合 rbd IO 引擎的性能測試工具
說明:Linux 平台上做 IO 性能測試的瑞士軍刀,可以對使用內核內 rbd 和用戶空間 librados 進行比較,標准規則:順序和隨機 IO,塊大小:4k,16k,64k,256k,模式:讀和寫,支持混合模式。
fio + libaio:fio 結合 linux aio 的 rbd 性能測試
OSD 磁盤寫性能
# echo 3 > /proc/sys/vm/drop_caches
# dd if=/dev/zero of=/var/lib/ceph/osd/ceph-0/delete_me bs=1G count=1 oflag=direct
OSD 磁盤讀性能
# dd if=/var/lib/ceph/osd/ceph-0/delete_me of=/dev/null bs=1G count=1 iflag=direct
網絡性能
- 服務端:
# iperf3 -s -D -f m -i 1
- 客戶端:
# iperf -c <服務端IP>
RADOS 性能測試:使用 Ceph 自帶的 rados bench 工具
該工具的語法為:
rados bench -p <pool_name> <seconds> <write|seq|rand> -b <block size> -t --no-cleanup
選項說明:
pool_name:測試所針對的存儲池;
seconds:測試所持續的秒數;
<write|seq|rand>:操作模式,write:寫,seq:順序讀;rand:隨機讀;
-b:block size,即塊大小,默認為 4M;
-t:讀/寫並行數,默認為 16;
--no-cleanup:表示測試完成后不刪除測試用數據。在做讀測試之前,需要使用該參數來運行一遍寫測試來產生測試數據,在全部測試結束后可以運行 rados -p <pool_name> cleanup 來清理所有測試數據。
寫:
# rados bench -p rbd 10 write --no-cleanup
順序讀:
# rados bench -p rbd 10 seq
隨機讀:
# rados bench -p rbd 10 rand
RADOS 性能測試:使用 rados load-gen 工具
該工具的語法為:
rados -p rbd load-gen
選項說明:
--num-objects 初始生成測試用的對象數,默認 200;
--min-object-size 測試對象的最小大小,默認 1KB,單位byte;
--max-object-size 測試對象的最大大小,默認 5GB,單位byte;
--min-op-len 壓測IO的最小大小,默認 1KB,單位byte;
--max-op-len 壓測IO的最大大小,默認 2MB,單位byte;
--max-ops 一次提交的最大IO數,相當於iodepth;
--target-throughput 一次提交IO的歷史累計吞吐量上限,默認 5MB/s,單位B/s;
--max-backlog 一次提交IO的吞吐量上限,默認10MB/s,單位B/s;
--read-percent 讀寫混合中讀的比例,默認80,范圍[0, 100];
--run-length 運行的時間,默認60s,單位秒;
運行命令:
# rados -p rbd load-gen --read-percent 0 --min-object-size 1073741824 --max-object-size 1073741824 --max-ops 1 --read-percent 0 --min-op-len 4194304 --max-op-len 4194304 --target-throughput 1073741824 --max_backlog 1073741824
可見,與 rados bench 相比,rados load-gen 的特點是可以產生混合類型的測試負載,而 rados bench 只能產生一種類型的負載。但是 load-gen 只能輸出吞吐量,只合適做類似於 4M 這樣的大block size 數據測試,輸出還不包括延遲。
使用 rbd bench-write 進行塊設備寫性能測試
執行如下命令來准備 Ceph 客戶端中的塊設備:
# rbd create test --size 1024 --image-feature layering
# rbd info test
# rbd map test
# rbd showmapped
# mkfs.xfs /dev/rbd1
# mkdir -p /mnt/test
# mount /dev/rbd1 /mnt/test
# df -h /mnt/test
測試工具:
rbd bench-write 的語法為:
rbd bench-write <RBD image name>
可以帶如下參數:
--io-size:單位 byte,默認 4096 bytes = 4K;
--io-threads:線程數,默認 16;
--io-total:總寫入字節,單位為字節,默認 1024M;
--io-pattern <seq|rand>:寫模式,默認為 seq 即順序寫;
分別在OSD節點和客戶端上做測試:
(1)在 OSD 節點上做測試
# rbd bench-write test --io-total 171997300
(2)在客戶端上做測試
# rbd bench-write test --io-total 1719973000 --io-size 4096000
# rbd bench-write test --io-total 1719973000
使用 fio + rbd ioengine
運行 apt-get install fio 來安裝 fio 工具,並創建 fio 配置文件write.fio:
[write-4M]
description="write test with block size of 4M"
ioengine=rbd
clientname=admin
pool=rbd
rbdname=test
iodepth=32
runtime=120
rw=write
bs=4M
write:表示順序寫
randwrite:表示隨機寫
read:表示順序讀
randread:表示隨機讀
運行命令:
# fio write.fio
使用 fio + libaio 進行測試
libaio 是 Linux native asynchronous I/O。
有幾種測試模式:
隨機寫:
# fio -filename=/mnt/test/test -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=libaio -bs=4M -size=1G -numjobs=1 -runtime=120 -group_reporting -name=read-libaio
隨機讀:
# fio -filename=/mnt/test/test -direct=1 -iodepth 1 -thread -rw=randread -ioengine=libaio -bs=4M -size=1G -numjobs=1 -runtime=120 -group_reporting -name=read-libaio
順序寫:
# fio -filename=/mnt/test/test -direct=1 -iodepth 1 -thread -rw=write -ioengine=libaio -bs=4M -size=1G -numjobs=1 -runtime=120 -group_reporting -name=read-libaio
順序讀:
# fio -filename=/mnt/test/test -direct=1 -iodepth 1 -thread -rw=read -ioengine=libaio -bs=4M -size=1G -numjobs=1 -runtime=120 -group_reporting -name=read-libaio
這些參數的含義是:
filename:表示待測試的設備名稱;
iodepth: libaio 會用這個 iodepth 值來調用 io_setup 准備個可以一次提交 iodepth 個 IO 的上下文,同時申請個io請求隊列用於保持IO;
iodepth_batch:在壓測進行的時候,系統會生成特定的IO請求,往io請求隊列里面扔,當隊列里面的IO個數達到 iodepth_batch 值的時候;
iodepth_batch_complete 和 iodepth_low: 調用 io_submit 批次提交請求,然后開始調用 io_getevents 開始收割已經完成的IO。 每次收割多少呢?由於收割的時候,超時時間設置為0,所以有多少已完成就算多少,最多可以收割 iodepth_batch_complete 值個。隨着收割,IO隊列里面的IO數就少了,那么需要補充新的IO。 什么時候補充呢?當IO數目降到 iodepth_low 值的時候,就重新填充,保證 OS 可以看到至少 iodepth_low 數目的io在隊列口排隊着。
