一篇學會 Ceph 性能測試
在將Ceph集群用于生產工作之前,應該首先對它進行基準測試。基準測試提供關于群集在讀、寫、延遲和其他工作負載期間執行情況的大致結果。在進行真正的基準測試之前,最好通過測量連接到群集節點的硬件(如磁盤和網絡)的性能,為預期的最大性能建立一個基準。磁盤性能基線測試將分兩步完成。首先,我們將測量單個磁盤的性能,在此之后,將同時測量連接到一個Ceph OSD節點的所有磁盤性能。為了獲得磁盤讀寫性能,我們可以使用dd命令并設置oflag參數以直接繞過磁盤緩存以獲得真實的結果。
測試單磁盤寫入性能
清空頁面緩存;
echo 3 > /proc/sys/vm/drop_caches
使用dd編寫一個大小為10G的名為deleteme的文件,該文件填充為0/dev/zero作為Ceph OSD安裝目錄的輸入文件,即/var/lib/ceph/osd/cep-0/:
dd if=/dev/zero of=/var/lib/ceph/osd/ceph-0/zero bs=10G count=1
重復執行后取平均值,我這邊沒有繞過內核緩存,所以測試出來的結果會偏高,(ubuntu系統執行dd繞過內核緩存的參數好像不支持。)
接下來可以測試單個節點上所有的osd寫入性能 我這邊每臺宿主機上osd只有一個,所以數據與上面相同;
for i in `mount | grep osd | awk '{print $3}'`; do (dd if=/dev/zero of=$i/zero bs=10G count=1 &) ; done
osd單盤讀性能測試
清空頁面緩存;
echo 3 > /proc/sys/vm/drop_caches
dd if=/var/lib/ceph/osd/ceph-0/deleteme of=/dev/null bs=10G count=1 iflag=direct
接下來可以測試單個節點上所有的osd寫入性能 我這邊每臺宿主機上osd只有一個,所以數據與上面相同;
echo 3 > /proc/sys/vm/drop_caches
for i in `mount | grep osd | awk '{print $3}'`; do (dd if=$i/zero of=/dev/null bs=10G count=1 &); done
網絡基線性能
測試Ceph OSD節點之間的網絡的基線性能。需要在Ceph節點上安裝了iper包。iperf是一個簡單的點對點網絡帶寬測試器,工作在c/s模型上。要啟動網絡基準測試,可以在第一個Ceph節點上使用server選項,在第二個Ceph節點中使用client選項執行iperf。
安裝iperf;
apt install iperf
node1節點作為server,使用6900端口;
node2節點作為client;
由于我這邊是千兆網絡,所以實際網絡帶寬不是很高,生產環境還是要用萬兆網絡進行連接;
rados bench基準測試
Ceph附帶一個稱為rados bench的內置基準測試工具,可以在池上測試Ceph集群的性能。rados bench工具支持寫入、順序讀取和隨機讀取基準測試,并且它還允許清理臨時基準數據。接下來我們對libvirt-pool池進行寫10秒的測試,--no-cleanup寫完之后不清里測試數據,后面的測試會用到這些測試數據;
rados bench -p libvirt-pool 10 write --no-cleanup
對libvirt-pool池進行順序讀取的測試;
rados bench -p libvirt-pool 10 seq
可以看到實際用了不到十秒的時間就已經讀完了測試數據,原因就是讀操作比寫操作快,測試寫數據用了十秒,度相同的數據肯定用不到十秒的;
隨機讀取數據測試;
rados bench -p libvirt-pool 10 rand
rados bench的語法如下;
rados bench -p <pool_name> <seconds> <write|seq|rand> -b <block size> -t --no-cleanup
-p: -p或-poo指定池名.
<seconds>:測試時間(以秒為單位)。
<writelseqlrand>:測試類型,例如寫入、順序讀取或隨機讀取。
-b: 塊大小,默認情況下塊大小為4M。
-t: 并發線程數;默認值為16
--no-clean up:由rados工作臺寫入池的臨時數據,不被清除。當這些數據與順序讀取或隨機讀取一起使用時,它們將被用于讀取操作。默認情況下數據會清理。
RADOS load-gen
rados load-gen 是CEPH提供的另一個測試工具, 像它的命名一樣,rados load-gen 工具能用來在Ceph cluster上生成負載和用于模擬高負載場景。
rados -p libvirt-pool load-gen --num-objects 200 --min-object-size 4M --max-object-size 8M --max-ops 10 --read-percent 0 --min-op-len 1M --max-op-len 4M --target-throughput 2G --run-length 20
命令行格式及參數說明:
rados -p <pool-name> load-gen
--num-objects: 生成測試用的對象數,默認 200
--min-object-size: 測試對象的最小size,默認 1KB,單位byte
--max-object-size: 測試對象的最大size,默認 5GB,單位byte
--min-ops: 最小IO操作數,相當于iodepth
--max-ops: 最大IO操作數,相當于iodepth
--min-op-len: 壓測IO的最小operation size,默認 1KB,單位byte
--max-op-len: 壓測IO的最大operation size,默認 2MB,單位byte
--max-backlog: 一次提交IO的吞吐量上限,默認10MB/s (單位MB)
--percent: 讀操作所占的百分百
--target-throughput: 目標吞吐量,默認 5MB/s (單位MB)
--run-length: 運行的時間,默認60s,單位秒
還可以使用watch ceph-s命令或ceph-w監視集群的讀寫速度/操作狀態;同時,RADOS load-gen將運行,以查看運行情況。
塊設備基準測試
ceph rbd命令行接口提供了一個稱為bench-write的選項,這是一個在Ceph Rados Block Device上執行寫基準測試操作的工具。可以使用bench-write工具的不通選項來調整塊大小,線程數和io模式。首先創建一個塊設備并將其映射至ceph客戶端;
rbd create libvirt-pool/289 --size 10240 --image-feature layering
rbd info -p libvirt-pool --image 289
rbd map libvirt-pool/289
rbd showmapped
塊設備上創建文件系統并掛載;
mkfs.xfs /dev/rbd2
mkdir -p /mnt/289
mount /dev/rbd2 /mnt/289
df -h /mnt/289
對289寫入5G大小的測試;
rbd bench-write libvirt-pool/289 --io-total 5368709200
rbd bench-write 的語法為:
rbd bench-write <RBD image name>
--io-size:寫入大小,單位 byte,默認4M;
--io-threads:線程數,默認 16;
--io-total:寫入總字節,單位為字節,默認 1024M;
--io-pattern <seq|rand>:寫模式,默認為 seq 即順序寫;
使用fio對ceph rbd進行基準測試;
安裝fio;
apt install fio -y
寫入fio配置文件;
vim write.fio
[write-4M]
ioengine=rbd
direct=1 # 排除OS的IO緩存機制的影響
size=5g # 每個fio進程/線程的最大讀寫
lockmem=1G # 鎖定所使用的內存大小
runtime=30 # 運行時間
group_reporting # 多個job合并出報告
numjobs=1
iodepth=32
pool=libvirt-pool
clientname=admin
rbdname=289
rw=write #讀寫模式,支持隨機讀寫、順序讀寫
bs=4M
filename=/dev/rbd0
啟動fio測試;
fio write.fio