從實際案例中探討io中的延遲效能的作用

pengcheng發表於2018-05-21
【問題背景】:
在某些專案中,使用者自帶測試工具,dd操作,fio(numjobs=1,iodepth=1)等忽略快取操作的場景下。ceph塊的單執行緒IO存在效能較差問題。
【問題影響】:
fio等典型測試用例在頻寬和iops上測試結果偏差不大,但是對於超融合虛擬機器場景,dd測試等單任務場景執行速度和體驗較差。
【問題原因】:
更多是ceph原生的軟體優化以及架構決定的io路徑對延遲效能產生了消耗和衰減。這中間bluestore以及其他一些引數調優固然有用,但效果目前存疑。其他gluster等分散式儲存可能有差異,但光是副本寫懲罰一項就是逃不了的,不可能比裸盤高。在架構類似的情況下,只是軟體優化的程度問題,差別應該不大。

ceph等的大部分分散式儲存只能增加併發的總吞吐量,不但不會降低延遲,而且反而會增加延遲,在IOPS,頻寬,延遲三個指標中的一個關鍵延遲效能上,分散式儲存遠遠比不上傳統儲存。
延遲增加會導致單執行緒io場景的效能比較低。

io路徑簡單比較一下就可以明白:
傳統: iscsi(千兆或萬兆網)------本地硬碟/dev/sdx
分散式儲存不使用快取: iscsi(千兆或萬兆網)-----librbd(不使用快取)---(千兆或萬兆網)----osd------副本寫懲罰------ceph journal----xfs---/dev/sdx
分散式使用快取:iscsi(千兆或萬兆網)-----librbd或核心rbd(使用快取)

這裡以單執行緒dd帶direct忽略快取的測試模擬為例。
1,裸盤:比如100~200M/S, bs=1M的延遲是1000ms/100~200=5~10ms
2,普通hdd的分散式儲存:比如25M/S, bs=1M的延遲是1000ms/25=40ms
3,帶ssd或pcie快取的分散式儲存:比如100M/S, bs=1M的延遲是1000ms/50~100=10~20ms

在某些硬體條件和架構固定又沒有作弊的情況下,是不可能超過理論值的。
比如假設hdd延遲最低5ms, 全hdd分散式儲存可以在io路徑中進行優化,但是隻能趨近5ms,不可能超過5ms。因此有些場景效能較低無需莫名驚詫。

【解決思路】:
1,對於一些無需虛擬機器,無需多路徑等對資料一致性要求不高並且寫負載不高的場景,可以適當使用快取。
2,靠近iscsi的io前端,增加分散式帶複製的快取同步處理,或者使用一些類似RDMA等硬體裝置輔助,總之通過硬體或軟體在分散式多節點間實現低延遲同步快取。該方案效能最高,但實現難度高。
3,使用類flashcache,bcache等在後端osd加快取,作為osd的快取,ssd的低延遲特性,可以有效增加單路操作的效能。
4,對io路徑上其他必要節點進行硬體和軟體調優。此處不做詳細展開。

【總結】
在高負載大量寫的場景下,使用寫快取很多時候是意義不大的。
但是在很多使用者場景下,使用快取的體驗還是很好的,寫個1G或幾G的檔案,能帶來質的提升,因此需要區分好使用者使用場景。魚和熊掌不可兼得。


相關文章