調整ceph的pg數


PG全稱是placement groups,它是ceph的邏輯存儲單元。在數據存儲到cesh時,先打散成一系列對象,再結合基於對象名的哈希操作、復制級別、PG數量,產生目標PG號。根據復制級別的不同,每個PG在不同的OSD上進行復制和分發。可以把PG想象成存儲了多個對象的邏輯容器,這個容器映射到多個具體的OSD。PG存在的意義是提高ceph存儲系統的性能和擴展性。

如果沒有PG,就難以管理和跟蹤數以億計的對象,它們分布在數百個OSD上。對ceph來說,管理PG比直接管理每個對象要簡單得多。每個PG需要消耗一定的系統資源包括CPU、內存等。集群的PG數量應該被精確計算得出。通常來說,增加PG的數量可以減少OSD的負載,但是這個增加應該有計划進行。一個推薦配置是每OSD對應50-100個PG。如果數據規模增大,在集群擴容的同時PG數量也需要調整。CRUSH會管理PG的重新分配。

每個pool應該分配多少個PG,與OSD的數量、復制份數、pool數量有關,有個計算公式在:

http://ceph.com/pgcalc/

《learning ceph》這本書里的計算公式也差不多:

Total PGs = ((Total_number_of_OSD * 100) / max_replication_count) / pool_count

結算的結果往上取靠近2的N次方的值。比如總共OSD數量是160,復制份數3,pool數量也是3,那么按上述公式計算出的結果是1777.7。取跟它接近的2的N次方是2048,那么每個pool分配的PG數量就是2048。

在更改pool的PG數量時,需同時更改PGP的數量。PGP是為了管理placement而存在的專門的PG,它和PG的數量應該保持一致。如果你增加pool的pg_num,就需要同時增加pgp_num,保持它們大小一致,這樣集群才能正常rebalancing。下面介紹如何修改pg_num和pgp_num。

(1)檢查rbd這個pool里已存在的PG和PGP數量:

$ ceph osd pool get rbd pg_num
pg_num: 128 $ ceph osd pool get rbd pgp_num pgp_num: 128

(2)檢查pool的復制size,執行如下命令:

$ ceph osd dump |grep size|grep rbd pool 2 'rbd' replicated size 3 min_size 2 crush_ruleset 0 object_hash rjenkins pg_num 128 pgp_num 128 last_change 45 flags hashpspool stripe_width 0

(3)使用上述公式,根據OSD數量、復制size、pool的數量,計算出新的PG數量,假設是256.

(4)變更rbd的pg_num和pgp_num為256:

$ ceph osd pool set rbd pg_num 256 $ ceph osd pool set rbd pgp_num 256

(5)如果有其他pool,同步調整它們的pg_num和pgp_num,以使負載更加均衡。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM