別急!新鮮的雲硬盤讓它再涼一會

題外話

    《邪不壓正》這部電影剛上映我就去看了,作爲姜文的民國三部曲最後一部,剛上映就把《我不是藥神》擠下神壇,但我不關心票房,單純是衝着他的上部電影《讓zidan飛》的精彩劇情和臺詞,抱着美好的期待去的。

    走出電影院,我就忘了講的是啥,只記得彭于晏在老北京的屋檐上到處亂竄,整部劇情就一個少年復仇記的簡單故事,臺詞晦澀難懂、劇情跳躍、人物形象也不完整。遠遠沒有當年觀看《讓zidan飛》的驚豔體驗。

    還記得《讓zidan飛》裏姜文飾演的張麻子一出場就密集的打出7槍:

  六子:沒打中?

  張麻子:讓zidan再飛一會兒

    這句話從張麻子口中說出,透出無比的自信,想表達的意思就是:別急着要結果,好事正在醞釀中。


1 背景

   言歸正傳,現如今我們使用雲計算產品,無論虛擬機是linux,還是windows系列的操作系統,雲硬盤掛載到雲主機,再經過文件系統格式化,是最常用的存儲使用場景,相當於我們家用計算機的D盤、E盤,用來存放數據、安裝軟件等。

   對硬盤的操作,有一點可以達成共識的是,在Linux系統下,對磁盤分區的處理,通常都是採用fdiskmkfs的處理方式,當然大於2TB的磁盤另外,不在本次討論範圍內。

   整篇文章分以下幾小章節:

    1 、背景

    2 、現象回顧

    3、 雲硬盤掛載後,ceph後端存儲實際如何變化

    4 、centos不同內核下的表現

    5、 找到根本原因

    6、 總結

2 現象回顧

  

1.png

    有幾次在格式化雲硬盤並mount後,很快執行fio測試發現和歷史數據對比性能有所下降,回過頭對ceph節點osd io進行監控時,觀察到1個現象,即執行格式化、創建文件系統後短時間內磁盤會產生數分鐘寫io

    mount雲硬盤之後,寫操作持續了5分鐘以上,時間有點久,在這個時間內,如果對雲硬盤執行大吞吐的讀寫操作,或多或少影響的實際的性能,甚至是否會影響數據持久化,不得而知,因此不得不花了些時間排查具體是什麼原因觸發的。


3  雲硬盤掛載後,ceph後端存儲實際如何變化

      分了幾個步驟對雲硬盤從創建開始,到寫入數據的所有過程做個梳理,看看是哪些環節產生什麼樣的反映。

   (1)新建的volume無任何數據

     Cinder創建 100GB的數據盤,卷類型爲無qos,此時在rbd 的custmized-hdd池中,出現了剛剛創建的volume,通過rbd diff計算這個volume實際佔用容量爲0,無數據

blob.png

   (2)雲硬盤掛載到雲主機,但不分區

     將100GB的volume通過nova volume-attach掛載到雲主機,但不安裝ext4文件系統

     此時數據盤無讀寫io,rbd 的custmized-hdd池中的volume仍然沒有數據,4個節點的osd無寫io現象

  (3)格式化雲硬盤並mount

     格式化/dev/vdb爲ext4,不掛載,此時rbd 的custmized-hdd池中的volume增加大約140MB的數據

     再將數據盤掛載到/mnt上,出現寫io,osd和雲硬盤盤都監控到有寫的吞吐,持續大約5分鐘停止,平均吞吐在5MB/S-7MB/S,產生的數據總和爲=300秒*5MB=1500MB左右

blob.png

    查下存儲池該volume是否真增加這麼多數據?檢查rbd 的custmized-hdd池中的volume,仍然使用rbd diff計算這個volume實際佔用容量,發現增加了1.5GB的數據,總容量到1743B,如下圖

blob.png

    再和object總數做個核對,Rbd下該卷存在498個object,以4MB一個計算總和不到1.9 GB,考慮到volume剛創建時,前期的object不滿4MB,和rbd diff計算得出基本一致,如下圖:

blob.png


2.png看完雲硬盤掛載到虛擬機後,ceph底層存儲的一系列表現,我們不妨停下來思考一下,整理思路:

    (1)Mount雲硬盤之後,寫操作持續了5分鐘,是實實在在的在存儲池下產生數據的,這一點得到證實

    (2)因爲我使用的centos7.2系統,mount後會產生寫操作,是不是linux的特性,需要在centos6.5上再證實一下


4 centos不同內核下的表現

     增加在cenots6.5下執行同樣的掛載雲硬盤、格式化和mount操作的測試場景,看是否存在同樣的數分鐘持續寫情形。

    (1)排查mkfs的差異

    cenots6.5的vm格式化100GB雲硬盤並mount,前期準確過程略,從mkfs開始,cenots6.5在mkfs過程中,當執行到Writing superblocks and filesystem accounting information,明顯要比cenots7.2要慢很多,cenots7.2執行這個操作是1秒左右,而cenots6.5需要40秒以上。

    (2)驗證mount後的雲硬盤讀寫

    使用cenots6.5創建vm,掛載100GB數據盤並mount後,也存在寫io,但時間很短,大約十秒的時間


2.png瞭解了不同內核的os在執行格式化文件系統的差異,我們再次停下來思考一下,整理思路:

   (1)從上面的“排查過程二”下的第(2)步驟,初步得出一個是mkfs時一起寫入io,一個是mount後再寫入 ,應該是在Writing superblocks and filesystem accounting information過程中存在的差異

   (2)Centos7.2、Centos6.5在mount雲硬盤後存在寫io的差異,有點奇怪了,需要排查下是哪個進程在寫

5 根本原因浮出水面

          通過iotop查詢vm中進程的讀寫io實時數據,排查下Centos7.2、Centos6.5的差異到底在哪。

     前期準備不再反覆描述,我們直接觀察兩個階段的寫情況,一個是mkfs過程,一個是mount後

   (1)找到Centos7.2是哪個進程在寫

    因爲Centos7.2的Mkfs秒級操作,iotop顯示mkfs時寫實時吞吐爲54MB/S,再從雲硬盤mount後開始,在vm中執行iotop後發現Centos7.2 上只有ext4lazyinit進程存在io寫,實時吞吐爲7MB/S,如下圖

blob.png

    (2)找到Centos6.5是哪個進程在寫

      Centos6.5是在mkfs時有點慢,在vm中執行iotop後發現Centos6.5 上是mkfs進程存在io寫,實時吞吐爲58MB/S,如下圖

blob.png

      很明顯,Centos7.2、Centos6.5在mkfs、mount雲硬盤過程存在寫io的差異

3.png

       ext4lazyinit,直譯爲ext4惰性初始化,通過調研在cenots7以後,內核3.10之後,操作系統對格式化分區是通過ext4lazyinit實現,好處就是能迅速的創建文件系統,會把文件系統初始化的工作推遲到掛載後進行。

    這樣一來對於用戶感官來說,格式化雲硬盤速度非常快,體驗很棒。但這樣的情況,就需要再mount之後,最好是等待數分鐘之後再操作硬盤分區。

總結

       前文說到在cenots7以後,內核3.10之後,在格式化分區上流程的變更,帶來用戶體驗的優化。

    需要注意的是,文件系統惰性初始化時間是根據雲環境的網絡、磁盤qos綜合衡量,並不固定。並且對於操作系統的使用者來說屬於黑箱,你唯一能做的,就是讓磁盤冷靜會,特別是性能評估,就需要在mount之後等待數分鐘後再執行,防止數據的不準確。

    值得一提的是,在cenots7更新之後,帶來一些新的特性,對應其他性能上也會帶來提升,如下表中:

blob.png


      Systemd的作用其實不新鮮了,早在2015年時我在中科院軟件研究所從事國產操作系統研發時就實際應用過。

    以往在linux各種發行版本中,採用這種方式的並不多,linux各種服務器版本給用戶帶來的性能提升並不明顯,但如果加載到centos桌面版,會有明顯的感官,從啓動系統到完成桌面加載的時間變快了,誰不希望打開系統的時間越短越好呢,但也有弊端,增加了xorg崩潰的風險。
    更高性能的KVM內核虛擬化支持,減少了雲平臺上層到底層的io鏈路,理論上應該能對虛擬化資源的響應帶來性能優化,目前還沒有對此做過比較,後續再跟蹤。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章