如何提高Ceph性能以及穩(wěn)定性:Deep Scrubbing和I/O saturation
本文轉(zhuǎn)載自微信公眾號「新鈦云服」,作者祝祥 。轉(zhuǎn)載本文請聯(lián)系新鈦云服公眾號。
介紹
Ceph是在云環(huán)境中最常使用的分布式存儲系統(tǒng)。設(shè)計(jì)初衷是提供較好的性能、可靠性和可擴(kuò)展性。
Ceph項(xiàng)目最早起源于Sage就讀博士期間的工作(最早的成果于2004年發(fā)表),并隨后貢獻(xiàn)給開源社區(qū)。在經(jīng)過了數(shù)年的發(fā)展之后,目前已得到眾多云計(jì)算廠商的支持并被廣泛應(yīng)用。RedHat及OpenStack都可與Ceph整合以支持虛擬機(jī)鏡像的后端存儲。
Ceph最令人津津樂道的是,Ceph在一個(gè)統(tǒng)一的存儲系統(tǒng)中同時(shí)提供了對象存儲、塊存儲和文件存儲,即Ceph是一個(gè)統(tǒng)一存儲,能夠?qū)⑵髽I(yè)企業(yè)中的三種存儲需求統(tǒng)一匯總到一個(gè)存儲系統(tǒng)中,并提供分布式、橫向擴(kuò)展,高度可靠性的存儲系統(tǒng),Ceph存儲提供的三大存儲接口。
I/O擁塞是Ceph運(yùn)維中最常見的問題,常常會影響到生產(chǎn)業(yè)務(wù),極端情況會導(dǎo)致存儲集群的宕機(jī)。
I/O瓶頸則會影響OpenStack上的應(yīng)用程序性能,即使系統(tǒng)仍然在正常運(yùn)行,但是I/O的瓶頸會導(dǎo)致所有突發(fā)的I/O任務(wù)都會卡死。
本文將會解釋為什么會在Ceph上會遇到這種情況,以及如何修改對應(yīng)的參數(shù),從而提高Ceph的穩(wěn)定性以及對應(yīng)的I/O性能。
ceph scrubbing
CEPH使用兩種清理方式來檢查存儲運(yùn)行狀況。清理操作默認(rèn)情況下每天都會執(zhí)行。
- normal scrubbing:捕獲OSD錯(cuò)誤或文件系統(tǒng)錯(cuò)誤。如上圖所示,該操作不耗資源,不影響I/O性能。
- deep scrubbing: 比較PG對象中的所有數(shù)據(jù)。它會查找磁盤上的損壞的扇區(qū)。此處理是I/O密集型的。對I/O影響比較大。
上述指標(biāo)歷史記錄中顯示的I/O性能是由于每天從凌晨0:00到7:00進(jìn)行的深度清理過程導(dǎo)致的。如果需要詳細(xì)了解這一過程,請看下面的配置以及參數(shù)說明。下表簡單列出了清理的相關(guān)參數(shù),本文也會就這些參數(shù)提供部分說明。
osd scrub begin/end hour :這些參數(shù)定義了清理時(shí)間窗口。以我們的環(huán)境為例,一般我們會計(jì)劃在凌晨0點(diǎn)到7點(diǎn)之間進(jìn)行清理任務(wù)。深度清理需要較長時(shí)間,如果最后一次的深度清理在早上7點(diǎn)之前開始,則處理的結(jié)束時(shí)間很可能會在大約1小時(shí)后。這也就是為什么我們的環(huán)境I/O在會在早上7點(diǎn)后降低,但在8點(diǎn)之后恢復(fù)為較高的原因。
正確設(shè)置Ceph有關(guān)的清理時(shí)間窗口非常重要。避開業(yè)務(wù)高峰期,選擇業(yè)務(wù)低谷期間進(jìn)行深度清理。如果業(yè)務(wù)是區(qū)域性的和基于人工,那么每夜進(jìn)行一次處理是很有必要的。如果全天業(yè)務(wù)負(fù)載都很均衡,那么全局時(shí)間窗口(從0am到24pm)看起來更合適。
osd deep scrub interval:該參數(shù)定義了在PG上執(zhí)行深度清理的時(shí)間周期。默認(rèn)設(shè)置是每周一次。這意味著,當(dāng)深度清理的計(jì)劃開始工作時(shí),它將標(biāo)記所有未深度清理的PG,一直到該批次所有PG的深度清理任務(wù)完成?;旧希⑿猩疃惹謇淼募墑e與該參數(shù)和時(shí)間窗口有關(guān)。一周一次深度清理是比較保守的。
經(jīng)過一番驗(yàn)證,哪怕是深度清理的時(shí)間間隔為1周,似乎也沒有在4天之前進(jìn)行過任何PG的深度清理。如果我們想要延長時(shí)間段或時(shí)間窗口,那么如果PG的處理頻率超過預(yù)期的周期,我們將無法解決問題。這一假設(shè)有部分是正確的,但也有部分是錯(cuò)誤的。在CEPH代碼中可以找到有關(guān)這種過度處理的說明:
- scrubber.time_for_deep = ceph_clock_now() >=
- info.history.last_deep_scrub_stamp + deep_scrub_interval;
- bool deep_coin_flip = false;
- // If we randomize when !allow_scrub && allow_deep_scrub, then it guarantees
- // we will deep scrub because this function is called often.
- if (!scrubber.time_for_deep && allow_scrub)
- deep_coin_flip = (rand() % 100) < cct->_conf->osd_deep_scrub_randomize_ratio * 100;
- scrubber.time_for_deep = (scrubber.time_for_deep || deep_coin_flip);
基本上,深度清理也依賴于第四個(gè)參數(shù),當(dāng)前的官方文檔尚未說明:
osd_deep_scrub_randomize_ratio: 隨機(jī)執(zhí)行深度清理的概率,可設(shè)置0.01 ,值越大,清理概率也越大,也容易影響業(yè)務(wù)。這個(gè)不受osd_deep_scrub_interval影響,但會在osd_scrub_begin_hour—osd_scrub_end_hour之間執(zhí)行
在這種情況下,初始設(shè)置為15%。假設(shè)每天進(jìn)行一次深度清理任務(wù)分配,那么則意味著每周都會通過隨機(jī)過程選擇一個(gè)PG。換句話說,從統(tǒng)計(jì)學(xué)上講,這意味著> 50%的PG將每周處理兩次。這就是為什么所有PG在4天的時(shí)間內(nèi)(即使間隔為1周)都進(jìn)行了處理的原因。
如果您在不更改osd_deep_scrub_randomize_ratio的情況下更改osd deep scrub interval,則并不會減少清理的工作量。因此,通常需要將這兩個(gè)參數(shù)同步使用。
osd_deep_scrub_randomize_ratio的目標(biāo)是將深度清理操作線性化,否則在PG創(chuàng)建的每個(gè)周期內(nèi)我們可能會有比較大的I/O峰值,即使間隔一個(gè)又一個(gè)周期時(shí)間,這依然可能會越來越線性化。當(dāng)隨機(jī)因素對應(yīng)于間隔時(shí)間(基本為一周的15%)時(shí),這將在PG深度清理分布中形成線性關(guān)系。但工作量會增加大約150%。因此,當(dāng)PG深度清理任務(wù)被分配,就可以正確處理PG的過期時(shí)間,從而降低整個(gè)調(diào)度的工作量。另一種工作方式是使用一個(gè)概率來定義周期(統(tǒng)計(jì)的方式),并將該周期用作未處理的PG的垃圾收集器。在我看來,這是一個(gè)很好的設(shè)置,例如,隨機(jī)地使用5%的概率統(tǒng)計(jì)處理PG,每個(gè)PG大約3周,間隔1個(gè)月。
分析scrub速度
了解您的清理和深度清理的速率對于了解系統(tǒng)性能瓶頸并計(jì)算正常時(shí)間來處理清理任務(wù)很重要。對于后續(xù)的事件回顧與追溯非常有效。
此命令提供PG狀態(tài)和上次清理/深度清理的時(shí)間。
- [~] ceph pg dump
您可以查看PG最早深度清理時(shí)間:
- [~] ceph pg dump | awk '$1 ~/[0-9a-f]+\.[0-9a-f]+/ {print $25, $26, $1}' | sort -rn
淺度清理
- [~] ceph pg dump | awk '$1 ~/[0-9a-f]+\.[0-9a-f]+/ {print $22, $23, $1}' | sort -rn
您可以按時(shí)間過濾以獲取給定時(shí)間處理的PG數(shù)量,因此您每天可以處理一定數(shù)量的PG進(jìn)行清理。
- [~] ceph pg dump | awk '$1 ~/[0-9a-f]+\.[0-9a-f]+/ {print $25, $26, $1}' | sort -rn | grep 2020-XX-YY | wc
您可以更改ID,以進(jìn)行淺度清理。
這些信息對于了解Ceph系統(tǒng)是否正常以及是否達(dá)到瓶頸是很重要的,因?yàn)樵谳^短的時(shí)間范圍內(nèi)有很多任務(wù)需要運(yùn)行,比如隨機(jī)比率太高,并且您每天有太多的清理操作。
進(jìn)一步配置scrub參數(shù)
以下是其他一些參數(shù)將對負(fù)載產(chǎn)生影響,因?yàn)橐坏┪覀兌x了要執(zhí)行的任務(wù),就需要做好計(jì)劃,然后合理執(zhí)行。
- osd max scrubs: 表示單個(gè)OSD(驅(qū)動器)可以進(jìn)行的最大清理次數(shù)。通常為1。但是您可以在同一主機(jī)上的不同OSD上進(jìn)行多并發(fā)清理操作。這可能會影響Ceph全局I/O性能,尤其是在驅(qū)動器硬盤之間共享總線時(shí)。
清理是按chunk組織的。如果chunk大小由兩個(gè)值定義:** osd scrub chunk min和osd scrub chunk max。這似乎是一個(gè)批處理操作,但目前尚不清楚對于一個(gè)chunk是否同時(shí)包含深度清理和淺度清理。兩個(gè)chunk之間的處理由osd scrub sleep**設(shè)置的時(shí)間進(jìn)行分開。此參數(shù)沒有描述的單位,因此了解如何使用它有點(diǎn)復(fù)雜。默認(rèn)設(shè)置為0.1(10%)。
優(yōu)先級
CEPH 優(yōu)先處理優(yōu)先級較高的I/O任務(wù)。這樣,我們就可以進(jìn)行清理操作的同時(shí),也不會對用戶I/O造成太大影響。該數(shù)值越大,優(yōu)先級越高,任務(wù)也越優(yōu)先。涉及不同的優(yōu)先級參數(shù):
- osd requested scrub priority:是手動啟動的清理(淺度與深度)操作的優(yōu)先級。這很重要,大家通常都會修改。默認(rèn)值為120,已經(jīng)高于用戶優(yōu)先級。因此,對默認(rèn)場景而言,并不推薦修改該參數(shù)。
- osd scrub priority:是自動計(jì)劃的清理(淺度和深度)操作的優(yōu)先級。該值默認(rèn)為5。4為推薦的最佳值。
- osd client op priority: 是客戶端I/O的優(yōu)先級。最大值為63。它也是默認(rèn)值。
塊大小
塊大小讀取訪問性能也會影響全局清理的性能。osd deep scrub stride參數(shù)設(shè)置要讀取的塊大小。默認(rèn)值為512KB(524288)。該參數(shù)對于固態(tài)硬盤,塊大小在16KiB以上并不重要。對于512KiB機(jī)械磁盤,這是一個(gè)比較好的調(diào)整參數(shù),您可以使用1MiB或2MiB塊提高吞吐量。
系統(tǒng)負(fù)載
osd scrub load threshold參數(shù)允許在系統(tǒng)負(fù)載(cpu loadavg)高于給定限制值時(shí)停止清理動作。通常,這有助于在I/O密集操作期間停止清理動作。但是scrub本身也會產(chǎn)生負(fù)載,因此在我看來,正確調(diào)整此參數(shù)有點(diǎn)復(fù)雜。對于CPU較小的CEPH服務(wù)器,卻很有意義的。
清理調(diào)度
還有一件還不清楚的事情:何時(shí)執(zhí)行清理操作的調(diào)度計(jì)劃?是在每個(gè)批處理窗口上(每天一次)還是在每個(gè)chunk快滿的時(shí)候才執(zhí)行?在這種情況下,系統(tǒng)如何確保按不同的時(shí)間段內(nèi)處理所有PG。這些信息是理解隨機(jī)PG選擇在清除調(diào)度中的影響的關(guān)鍵點(diǎn)。官方文檔中對這些說明非常少。
常用的配置命令
該配置是每個(gè)OSD附帶的。以下列出了一個(gè)OSD的默認(rèn)參數(shù):
- ceph config show-with-defaults osd.x # with x a OSD number
在所有OSD上查看參數(shù)
- ceph tell osd.* config get osd_deep_scrub_randomize_ratio
其他一些用于了解有關(guān)OSD和磁盤性能的命令或工具。有時(shí)候,可以發(fā)現(xiàn)IO清理問題實(shí)際上很可能是底層IO性能問題。
- hdparm -Tt /dev/sdx
- ceph tell osd.x bench -f plain
最后
隨著Ceph集群數(shù)據(jù)量和集群規(guī)模逐漸擴(kuò)大,在日常維護(hù)中,我們經(jīng)常遇到各種異常情況,其中頻次較多的就是慢請求slow-request,慢請求會導(dǎo)致性能抖動,直接影響集群的穩(wěn)定性,需要謹(jǐn)慎對待。而slow-request大部分都是由清理動作引起的,合理的配置以及規(guī)劃清理計(jì)劃,可以避免影響生產(chǎn)業(yè)務(wù),同時(shí)也可以充分發(fā)揮存儲的性能。