題外話
《邪不壓正》這部電影剛上映我就去看了,作爲姜文的民國三部曲最後一部,剛上映就把《我不是藥神》擠下神壇,但我不關心票房,單純是衝着他的上部電影《讓zidan飛》的精彩劇情和臺詞,抱着美好的期待去的。
走出電影院,我就忘了講的是啥,只記得彭于晏在老北京的屋檐上到處亂竄,整部劇情就一個少年復仇記的簡單故事,臺詞晦澀難懂、劇情跳躍、人物形象也不完整。遠遠沒有當年觀看《讓zidan飛》的驚豔體驗。
還記得《讓zidan飛》裏姜文飾演的張麻子一出場就密集的打出7槍:
六子:沒打中?
張麻子:讓zidan再飛一會兒
這句話從張麻子口中說出,透出無比的自信,想表達的意思就是:別急着要結果,好事正在醞釀中。
1 背景
言歸正傳,現如今我們使用雲計算產品,無論虛擬機是linux,還是windows系列的操作系統,雲硬盤掛載到雲主機,再經過文件系統格式化,是最常用的存儲使用場景,相當於我們家用計算機的D盤、E盤,用來存放數據、安裝軟件等。
對硬盤的操作,有一點可以達成共識的是,在Linux系統下,對磁盤分區的處理,通常都是採用fdisk、mkfs的處理方式,當然大於2TB的磁盤另外,不在本次討論範圍內。
整篇文章分以下幾小章節:
1 、背景
2 、現象回顧
3、 雲硬盤掛載後,ceph後端存儲實際如何變化
4 、centos不同內核下的表現
5、 找到根本原因
6、 總結
2 現象回顧
有幾次在格式化雲硬盤並mount後,很快執行fio測試發現和歷史數據對比性能有所下降,回過頭對ceph節點osd io進行監控時,觀察到1個現象,即執行格式化、創建文件系統後短時間內磁盤會產生數分鐘寫io。
mount雲硬盤之後,寫操作持續了5分鐘以上,時間有點久,在這個時間內,如果對雲硬盤執行大吞吐的讀寫操作,或多或少影響的實際的性能,甚至是否會影響數據持久化,不得而知,因此不得不花了些時間排查具體是什麼原因觸發的。
3 雲硬盤掛載後,ceph後端存儲實際如何變化
分了幾個步驟對雲硬盤從創建開始,到寫入數據的所有過程做個梳理,看看是哪些環節產生什麼樣的反映。
(1)新建的volume無任何數據
Cinder創建 100GB的數據盤,卷類型爲無qos,此時在rbd 的custmized-hdd池中,出現了剛剛創建的volume,通過rbd diff計算這個volume實際佔用容量爲0,無數據
(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左右
查下存儲池該volume是否真增加這麼多數據?檢查rbd 的custmized-hdd池中的volume,仍然使用rbd diff計算這個volume實際佔用容量,發現增加了1.5GB的數據,總容量到1743B,如下圖
再和object總數做個核對,Rbd下該卷存在498個object,以4MB一個計算總和不到1.9 GB,考慮到volume剛創建時,前期的object不滿4MB,和rbd diff計算得出基本一致,如下圖:
看完雲硬盤掛載到虛擬機後,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,但時間很短,大約十秒的時間
瞭解了不同內核的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,如下圖
(2)找到Centos6.5是哪個進程在寫
Centos6.5是在mkfs時有點慢,在vm中執行iotop後發現Centos6.5 上是mkfs進程存在io寫,實時吞吐爲58MB/S,如下圖
很明顯,Centos7.2、Centos6.5在mkfs、mount雲硬盤過程存在寫io的差異
ext4lazyinit,直譯爲ext4惰性初始化,通過調研在cenots7以後,內核3.10之後,操作系統對格式化分區是通過ext4lazyinit實現,好處就是能迅速的創建文件系統,會把文件系統初始化的工作推遲到掛載後進行。
這樣一來對於用戶感官來說,格式化雲硬盤速度非常快,體驗很棒。但這樣的情況,就需要再mount之後,最好是等待數分鐘之後再操作硬盤分區。
總結
前文說到在cenots7以後,內核3.10之後,在格式化分區上流程的變更,帶來用戶體驗的優化。
需要注意的是,文件系統惰性初始化時間是根據雲環境的網絡、磁盤qos綜合衡量,並不固定。並且對於操作系統的使用者來說屬於黑箱,你唯一能做的,就是讓磁盤冷靜會,特別是性能評估,就需要在mount之後等待數分鐘後再執行,防止數據的不準確。
值得一提的是,在cenots7更新之後,帶來一些新的特性,對應其他性能上也會帶來提升,如下表中:
Systemd的作用其實不新鮮了,早在2015年時我在中科院軟件研究所從事國產操作系統研發時就實際應用過。
以往在linux各種發行版本中,採用這種方式的並不多,linux各種服務器版本給用戶帶來的性能提升並不明顯,但如果加載到centos桌面版,會有明顯的感官,從啓動系統到完成桌面加載的時間變快了,誰不希望打開系統的時間越短越好呢,但也有弊端,增加了xorg崩潰的風險。
更高性能的KVM內核虛擬化支持,減少了雲平臺上層到底層的io鏈路,理論上應該能對虛擬化資源的響應帶來性能優化,目前還沒有對此做過比較,後續再跟蹤。