Augsta veiktspÄja ir viena no galvenajÄm prasÄ«bÄm, strÄdÄjot ar lielajiem datiem. Sberbank datu ielÄdes nodaÄ¼Ä mÄs pÄrsÅ«tÄm gandrÄ«z visus darÄ«jumus mÅ«su Hadoop balstÄ«tajÄ datu mÄkonÄ« un tÄpÄc apstrÄdÄjam patieÅ”Äm lielas informÄcijas plÅ«smas. Protams, mÄs vienmÄr meklÄjam veidus, kÄ uzlabot veiktspÄju, un tagad mÄs vÄlamies jums pastÄstÄ«t, kÄ mums izdevÄs izlabot RegionServer HBase un HDFS klientu, pateicoties kuriem mÄs varÄjÄm ievÄrojami palielinÄt lasÄ«Å”anas darbÄ«bu Ätrumu.
TomÄr, pirms pÄriet pie uzlabojumu bÅ«tÄ«bas, ir vÄrts runÄt par ierobežojumiem, kurus principÄ nevar apiet, ja sÄžat uz HDD.
KÄpÄc HDD un Ätra brÄ«vpiekļuves lasÄ«Å”ana nav saderÄ«gas
KÄ zinÄms, HBase un daudzas citas datu bÄzes glabÄ datus vairÄku desmitu kilobaitu lielos blokos. PÄc noklusÄjuma tas ir aptuveni 64 KB. Tagad iedomÄsimies, ka mums jÄiegÅ«st tikai 100 baiti, un mÄs lÅ«dzam HBase sniegt mums Å”os datus, izmantojot noteiktu atslÄgu. TÄ kÄ HFiles bloka lielums ir 64 KB, pieprasÄ«jums bÅ«s 640 reizes lielÄks (tikai minÅ«ti!) nekÄ nepiecieÅ”ams.
TÄlÄk, jo pieprasÄ«jums tiks nosÅ«tÄ«ts caur HDFS un tÄ metadatu keÅ”atmiÅas mehÄnismu ShortCircuitCache (kas nodroÅ”ina tieÅ”u piekļuvi failiem), tas noved pie jau 1 MB nolasÄ«Å”anas no diska. TomÄr to var pielÄgot ar parametru dfs.client.read.shortcircuit.buffer.size un daudzos gadÄ«jumos ir jÄga samazinÄt Å”o vÄrtÄ«bu, piemÄram, lÄ«dz 126 KB.
PieÅemsim, ka mÄs to darÄm, bet turklÄt, kad mÄs sÄkam lasÄ«t datus, izmantojot Java api, piemÄram, funkcijas, piemÄram, FileChannel.read, un lÅ«dzam operÄtÄjsistÄmai nolasÄ«t norÄdÄ«to datu apjomu, tÄ nolasa ākatram gadÄ«jumamā 2 reizes vairÄk. , t.i. 256 KB mÅ«su gadÄ«jumÄ. Tas ir tÄpÄc, ka java nav vienkÄrÅ”s veids, kÄ iestatÄ«t karogu FADV_RANDOM, lai novÄrstu Å”o darbÄ«bu.
RezultÄtÄ, lai iegÅ«tu mÅ«su 100 baitus, zem pÄrsega tiek nolasÄ«ts 2600 reižu vairÄk. Å Ä·iet, ka risinÄjums ir acÄ«mredzams, samazinÄsim bloka izmÄru lÄ«dz kilobaitam, uzliksim minÄto karogu un gÅ«sim lielu apgaismÄ«bas paÄtrinÄjumu. Bet problÄma ir tÄ, ka, samazinot bloka izmÄru 2 reizes, mÄs arÄ« 2 reizes samazinÄm nolasÄ«to baitu skaitu laika vienÄ«bÄ.
Dažus ieguvumus no karoga FADV_RANDOM iestatÄ«Å”anas var iegÅ«t, taÄu tikai ar augstu daudzpavedienu un bloka izmÄru 128 KB, taÄu tas ir maksimums pÄris desmitiem procentu:
PÄrbaudes tika veiktas 100 failiem, katrs 1 GB liels un atrodas 10 HDD.
AprÄÄ·inÄsim, uz ko mÄs principÄ varam rÄÄ·inÄties ar Å”Ädu Ätrumu:
PieÅemsim, ka mÄs lasÄm no 10 diskiem ar Ätrumu 280 MB/sek, t.i. 3 miljoni reižu 100 baiti. Bet, kÄ mÄs atceramies, mums nepiecieÅ”amie dati ir 2600 reižu mazÄki nekÄ nolasÄ«tie dati. TÄdÄjÄdi mÄs sadalÄm 3 miljonus ar 2600 un iegÅ«stam 1100 ieraksti sekundÄ.
NomÄcoÅ”i, vai ne? TÄda ir daba NejauÅ”a piekļuve piekļuve datiem HDD ā neatkarÄ«gi no bloka lieluma. Å is ir fizisks brÄ«vpiekļuves ierobežojums, un neviena datubÄze Å”Ädos apstÄkļos nevar izspiest vairÄk.
KÄ tad datu bÄzes sasniedz daudz lielÄku Ätrumu? Lai atbildÄtu uz Å”o jautÄjumu, apskatÄ«sim, kas notiek Å”ajÄ attÄlÄ:
Å eit mÄs redzam, ka pirmajÄs minÅ«tÄs Ätrums patieÅ”Äm ir aptuveni tÅ«kstotis rekordu sekundÄ. TaÄu tÄlÄk, pateicoties tam, ka tiek nolasÄ«ts daudz vairÄk, nekÄ prasÄ«ts, dati nonÄk operÄtÄjsistÄmas (linux) bufetÄ/keÅ”atmiÅÄ un Ätrums palielinÄs lÄ«dz pieklÄjÄ«gÄkiem 60 tÅ«kstoÅ”iem sekundÄ.
TÄdÄjÄdi turpmÄk mÄs nodarbosimies ar piekļuves paÄtrinÄÅ”anu tikai tiem datiem, kas atrodas OS keÅ”atmiÅÄ vai atrodas SSD/NVMe atmiÅas ierÄ«cÄs ar salÄ«dzinÄmu piekļuves Ätrumu.
MÅ«su gadÄ«jumÄ mÄs veiksim testus uz stenda, kurÄ ir 4 serveri, no kuriem katrs tiek iekasÄts Å”Ädi:
CPU: Xeon E5-2680 v4 @ 2.40 GHz 64 pavedieni.
AtmiÅa: 730 GB.
java versija: 1.8.0_111
Un Å”eit galvenais ir datu apjoms tabulÄs, kas ir jÄizlasa. Fakts ir tÄds, ka, nolasot datus no tabulas, kas pilnÄ«bÄ ir ievietota HBase keÅ”atmiÅÄ, tie pat netiks nolasÄ«ti no operÄtÄjsistÄmas bufetes/keÅ”atmiÅas. TÄ kÄ HBase pÄc noklusÄjuma pieŔķir 40% atmiÅas struktÅ«rai, ko sauc par BlockCache. BÅ«tÄ«bÄ tas ir ConcurrentHashMap, kur atslÄga ir faila nosaukums + bloka nobÄ«de, un vÄrtÄ«ba ir faktiskie dati Å”ajÄ nobÄ«dÄ.
TÄdÄjÄdi, lasot tikai no Ŕīs struktÅ«ras, mÄs
PiemÄram, mÅ«su gadÄ«jumÄ BlockCache apjoms vienÄ RS ir aptuveni 12 GB. VienÄ mezglÄ nolaidÄm divus RS, t.i. 96 GB ir atvÄlÄti BlockCache visos mezglos. Un datu ir daudzkÄrt vairÄk, piemÄram, lai tÄs ir 4 tabulas, katrÄ pa 130 reÄ£ioniem, kurÄs faili ir 800 MB lieli, saspiesti ar FAST_DIFF, t.i. kopÄ 410 GB (tie ir tÄ«ri dati, t.i., neÅemot vÄrÄ replikÄcijas koeficientu).
TÄdÄjÄdi BlockCache ir tikai aptuveni 23% no kopÄjÄ datu apjoma, un tas ir daudz tuvÄk reÄlajiem apstÄkļiem, ko sauc par BigData. Un Å”eit sÄkas jautrÄ«ba ā jo acÄ«mredzami, jo mazÄk keÅ”atmiÅas trÄpÄ«jumu, jo sliktÄka ir veiktspÄja. Galu galÄ, ja jÅ«s nokavÄsiet, jums bÅ«s daudz jÄstrÄdÄ - t.i. pÄrejiet uz sistÄmas funkciju izsaukÅ”anu. TomÄr no tÄ nevar izvairÄ«ties, tÄpÄc apskatÄ«sim pavisam citu aspektu ā kas notiek ar datiem, kas atrodas keÅ”atmiÅÄ?
VienkÄrÅ”osim situÄciju un pieÅemsim, ka mums ir keÅ”atmiÅa, kas atbilst tikai 1 objektam. Å eit ir piemÄrs tam, kas notiks, kad mÄÄ£inÄsim strÄdÄt ar datu apjomu, kas ir 3 reizes lielÄks par keÅ”atmiÅu, mums bÅ«s:
1. Ievietojiet 1. bloku keÅ”atmiÅÄ
2. NoÅemiet 1. bloku no keÅ”atmiÅas
3. Ievietojiet 2. bloku keÅ”atmiÅÄ
4. NoÅemiet 2. bloku no keÅ”atmiÅas
5. Ievietojiet 3. bloku keÅ”atmiÅÄ
5 darbÄ«bas pabeigtas! TomÄr Å”o situÄciju nevar saukt par normÄlu, patiesÄ«bÄ mÄs piespiežam HBase veikt virkni pilnÄ«gi bezjÄdzÄ«gu darbu. Tas pastÄvÄ«gi nolasa datus no OS keÅ”atmiÅas, ievieto tos BlockCache, lai gandrÄ«z nekavÄjoties tos izmestu, jo ir ienÄkusi jauna datu daļa. AnimÄcija ieraksta sÄkumÄ parÄda problÄmas bÅ«tÄ«bu - Atkritumu savÄcÄjs iet nost, atmosfÄra uzkarst, mazÄ GrÄta tÄlajÄ un karstajÄ ZviedrijÄ kļūst satraukta. Un mums, IT cilvÄkiem, ļoti nepatÄ«k, ja bÄrni ir skumji, tÄpÄc sÄkam domÄt, ko darÄ«t lietas labÄ.
Ko darÄ«t, ja keÅ”atmiÅÄ ievietojat nevis visus blokus, bet tikai noteiktu procentuÄlo daļu no tiem, lai keÅ”atmiÅa nepÄrplÅ«st? SÄksim, vienkÄrÅ”i pievienojot tikai dažas koda rindiÅas funkcijas sÄkumam datu ievietoÅ”anai BlockCache:
public void cacheBlock(BlockCacheKey cacheKey, Cacheable buf, boolean inMemory) {
if (cacheDataBlockPercent != 100 && buf.getBlockType().isData()) {
if (cacheKey.getOffset() % 100 >= cacheDataBlockPercent) {
return;
}
}
...
Lieta ir Å”Äda: nobÄ«de ir bloka pozÄ«cija failÄ, un tÄ pÄdÄjie cipari ir nejauÅ”i un vienmÄrÄ«gi sadalÄ«ti no 00 lÄ«dz 99. TÄpÄc mÄs izlaidÄ«sim tikai tos, kas ietilpst mums vajadzÄ«gajÄ diapazonÄ.
PiemÄram, iestatiet cacheDataBlockPercent = 20 un skatiet, kas notiek:
RezultÄts ir acÄ«mredzams. ZemÄk redzamajos grafikos kļūst skaidrs, kÄpÄc notika Å”Äds paÄtrinÄjums - mÄs ietaupÄm daudz GC resursu, neveicot sÄ«zifisko darbu, ievietojot datus keÅ”atmiÅÄ, lai nekavÄjoties izmestu tos Marsa suÅu kanalizÄcijÄ:
TajÄ paÅ”Ä laikÄ CPU izmantoÅ”ana palielinÄs, bet ir daudz mazÄka par produktivitÄti:
Ir arÄ« vÄrts atzÄ«mÄt, ka BlockCache glabÄtie bloki ir atŔķirÄ«gi. LielÄkÄ daļa, aptuveni 95%, ir paÅ”i dati. Un pÄrÄjais ir metadati, piemÄram, BlÅ«ma filtri vai LEAF_INDEX un
TÄpÄc kodÄ mÄs redzam pÄrbaudes nosacÄ«jumu buf.getBlockType().isData() un pateicoties Å”ai meta, mÄs to jebkurÄ gadÄ«jumÄ atstÄsim keÅ”atmiÅÄ.
Tagad palielinÄsim slodzi un vienÄ piegÄjienÄ nedaudz nostiprinÄsim funkciju. PirmajÄ testÄ mÄs izveidojÄm robežvÄrtÄ«bu = 20, un BlockCache bija nedaudz nepietiekami izmantots. Tagad iestatÄ«sim to uz 23% un pievienosim 100 pavedienus ik pÄc 5 minÅ«tÄm, lai redzÄtu, kurÄ brÄ«dÄ« notiek piesÄtinÄjums:
Å eit mÄs redzam, ka sÄkotnÄjÄ versija gandrÄ«z uzreiz sasniedz griestus ar aptuveni 100 tÅ«kstoÅ”iem pieprasÄ«jumu sekundÄ. TÄ kÄ plÄksteris dod paÄtrinÄjumu lÄ«dz 300 tÅ«kst. TajÄ paÅ”Ä laikÄ ir skaidrs, ka turpmÄka paÄtrinÄÅ”ana vairs nav tik ābezmaksasā, pieaug arÄ« CPU noslodze.
TomÄr tas nav Ä«paÅ”i elegants risinÄjums, jo mÄs iepriekÅ” nezinÄm, cik procentu bloku ir nepiecieÅ”ams saglabÄt keÅ”atmiÅÄ, tas ir atkarÄ«gs no slodzes profila. TÄpÄc tika ieviests mehÄnisms Ŕī parametra automÄtiskai regulÄÅ”anai atkarÄ«bÄ no lasÄ«Å”anas darbÄ«bu aktivitÄtes.
Lai to kontrolÄtu, ir pievienotas trÄ«s iespÄjas:
hbase.lru.cache.heavy.eviction.count.limit ā iestata, cik reižu vajadzÄtu palaist datu izÅemÅ”anas procesu no keÅ”atmiÅas, pirms mÄs sÄkam izmantot optimizÄciju (t.i., izlaižot blokus). PÄc noklusÄjuma tas ir vienÄds ar MAX_INT = 2147483647 un faktiski nozÄ«mÄ, ka lÄ«dzeklis nekad nesÄks darboties ar Å”o vÄrtÄ«bu. Jo izlikÅ”anas process sÄkas ik pÄc 5 - 10 sekundÄm (tas ir atkarÄ«gs no slodzes) un 2147483647 * 10 / 60 / 60 / 24 / 365 = 680 gadi. TomÄr mÄs varam iestatÄ«t Å”o parametru uz 0 un likt funkcijai darboties uzreiz pÄc palaiÅ”anas.
TomÄr Å”ajÄ parametrÄ ir arÄ« lietderÄ«gÄ slodze. Ja mÅ«su slodze ir tÄda, ka Ä«stermiÅa nolasÄ«jumi (teiksim dienÄ) un ilgstoÅ”i (naktÄ«) ir nepÄrtraukti mijas, tad mÄs varam pÄrliecinÄties, ka funkcija tiek ieslÄgta tikai tad, kad notiek ilgstoÅ”as āāāālasÄ«Å”anas darbÄ«bas.
PiemÄram, mÄs zinÄm, ka Ä«stermiÅa rÄdÄ«jumi parasti ilgst apmÄram 1 minÅ«ti. Nav jÄsÄk izmest blokus, keÅ”atmiÅai nebÅ«s laika novecot un tad varam iestatÄ«t Å”o parametru vienÄdu, piemÄram, ar 10. Tas novedÄ«s pie tÄ, ka optimizÄcija sÄks darboties tikai tad, kad ilgi- termina aktÄ«vÄ lasÄ«Å”ana ir sÄkusies, t.i. 100 sekundÄs. TÄdÄjÄdi, ja mums ir Ä«slaicÄ«ga lasÄ«Å”ana, tad visi bloki nonÄks keÅ”atmiÅÄ un bÅ«s pieejami (izÅemot tos, kas tiks izlikti ar standarta algoritmu). Un, veicot ilgstoÅ”as āāāālasÄ«Å”anas, funkcija tiek ieslÄgta, un mums bÅ«tu daudz augstÄka veiktspÄja.
hbase.lru.cache.heavy.eviction.mb.size.limit ā iestata, cik megabaitu mÄs vÄlÄtos ievietot keÅ”atmiÅÄ (un, protams, izlikt) 10 sekundÄs. Funkcija mÄÄ£inÄs sasniegt Å”o vÄrtÄ«bu un to uzturÄt. Lieta ir Å”Äda: ja mÄs ievietosim gigabaitus keÅ”atmiÅÄ, mums bÅ«s jÄizliek gigabaiti, un tas, kÄ redzÄjÄm iepriekÅ”, ir ļoti dÄrgi. TomÄr jums nevajadzÄtu mÄÄ£inÄt iestatÄ«t to pÄrÄk mazu, jo tas izraisÄ«s priekÅ”laicÄ«gu bloÄ·ÄÅ”anas izlaiÅ”anas režīma izieÅ”anu. JaudÄ«giem serveriem (apmÄram 20-40 fiziski kodoli) ir optimÄli iestatÄ«t apmÄram 300-400 MB. VidÄjai klasei (~10 kodoli) 200-300 MB. VÄjÄm sistÄmÄm (2ā5 kodoli) 50ā100 MB var bÅ«t normÄli (nav pÄrbaudÄ«ts Å”ajÄs ierÄ«cÄs).
ApskatÄ«sim, kÄ tas darbojas: pieÅemsim, ka mÄs iestatÄm hbase.lru.cache.heavy.eviction.mb.size.limit = 500, ir kaut kÄda slodze (lasÄ«Å”ana) un tad ik pÄc ~ 10 sekundÄm mÄs aprÄÄ·inÄm, cik baitu bija izlikts, izmantojot formulu:
PieskaitÄmÄs izmaksas = atbrÄ«voto baitu summa (MB) * 100 / ierobežojums (MB) - 100;
Ja faktiski tika izlikti 2000 MB, tad pieskaitÄmÄs izmaksas ir vienÄdas ar:
2000 * 100/500 - 100 = 300%
Algoritmi cenÅ”as saglabÄt ne vairÄk kÄ dažus desmitus procentu, tÄpÄc funkcija samazinÄs keÅ”atmiÅÄ saglabÄto bloku procentuÄlo daudzumu, tÄdÄjÄdi ievieÅ”ot automÄtiskÄs regulÄÅ”anas mehÄnismu.
TomÄr, ja slodze samazinÄs, pieÅemsim, ka tiek izlikti tikai 200 MB un Overhead kļūst negatÄ«vs (tÄ sauktÄ pÄrsniegÅ”ana):
200*100/500-100 = -60%
Gluži pretÄji, Ŕī funkcija palielinÄs keÅ”atmiÅÄ saglabÄto bloku procentuÄlo daudzumu, lÄ«dz Overhead kļūs pozitÄ«vs.
TÄlÄk ir sniegts piemÄrs tam, kÄ tas izskatÄs uz reÄliem datiem. Nav jÄcenÅ”as sasniegt 0%, tas nav iespÄjams. Tas ir ļoti labi, ja tas ir aptuveni 30 - 100%, tas palÄ«dz izvairÄ«ties no priekÅ”laicÄ«gas izieÅ”anas no optimizÄcijas režīma Ä«slaicÄ«gu pÄrspriegumu laikÄ.
hbase.lru.cache.heavy.eviction.overhead.coefficient ā nosaka, cik Ätri mÄs vÄlamies iegÅ«t rezultÄtu. Ja mÄs droÅ”i zinÄm, ka mÅ«su lasÄ«jumi lielÄkoties ir ilgi un nevÄlamies gaidÄ«t, mÄs varam palielinÄt Å”o attiecÄ«bu un ÄtrÄk iegÅ«t augstu veiktspÄju.
PiemÄram, mÄs iestatÄm Å”o koeficientu = 0.01. Tas nozÄ«mÄ, ka pieskaitÄmÄs izmaksas (skatÄ«t iepriekÅ”) tiks reizinÄtas ar Å”o skaitli ar iegÅ«to rezultÄtu, un keÅ”atmiÅÄ saglabÄto bloku procentuÄlais daudzums tiks samazinÄts. PieÅemsim, ka Overhead = 300% un koeficients = 0.01, tad keÅ”atmiÅÄ saglabÄto bloku procentuÄlais daudzums tiks samazinÄts par 3%.
LÄ«dzÄ«ga āPretspiedienaā loÄ£ika tiek ieviesta arÄ« negatÄ«vÄm pieskaitÄmajÄm (pÄrsnieguma) vÄrtÄ«bÄm. TÄ kÄ vienmÄr ir iespÄjamas Ä«slaicÄ«gas nolasÄ«Å”anas un izlikÅ”anas apjoma svÄrstÄ«bas, Å”is mehÄnisms ļauj izvairÄ«ties no priekÅ”laicÄ«gas izieÅ”anas no optimizÄcijas režīma. Pretspiedienam ir apgriezta loÄ£ika: jo spÄcÄ«gÄks ir pÄrsniegums, jo vairÄk bloku tiek saglabÄts keÅ”atmiÅÄ.
ÄŖstenoÅ”anas kods
LruBlockCache cache = this.cache.get();
if (cache == null) {
break;
}
freedSumMb += cache.evict()/1024/1024;
/*
* Sometimes we are reading more data than can fit into BlockCache
* and it is the cause a high rate of evictions.
* This in turn leads to heavy Garbage Collector works.
* So a lot of blocks put into BlockCache but never read,
* but spending a lot of CPU resources.
* Here we will analyze how many bytes were freed and decide
* decide whether the time has come to reduce amount of caching blocks.
* It help avoid put too many blocks into BlockCache
* when evict() works very active and save CPU for other jobs.
* More delails: https://issues.apache.org/jira/browse/HBASE-23887
*/
// First of all we have to control how much time
// has passed since previuos evict() was launched
// This is should be almost the same time (+/- 10s)
// because we get comparable volumes of freed bytes each time.
// 10s because this is default period to run evict() (see above this.wait)
long stopTime = System.currentTimeMillis();
if ((stopTime - startTime) > 1000 * 10 - 1) {
// Here we have to calc what situation we have got.
// We have the limit "hbase.lru.cache.heavy.eviction.bytes.size.limit"
// and can calculte overhead on it.
// We will use this information to decide,
// how to change percent of caching blocks.
freedDataOverheadPercent =
(int) (freedSumMb * 100 / cache.heavyEvictionMbSizeLimit) - 100;
if (freedSumMb > cache.heavyEvictionMbSizeLimit) {
// Now we are in the situation when we are above the limit
// But maybe we are going to ignore it because it will end quite soon
heavyEvictionCount++;
if (heavyEvictionCount > cache.heavyEvictionCountLimit) {
// It is going for a long time and we have to reduce of caching
// blocks now. So we calculate here how many blocks we want to skip.
// It depends on:
// 1. Overhead - if overhead is big we could more aggressive
// reducing amount of caching blocks.
// 2. How fast we want to get the result. If we know that our
// heavy reading for a long time, we don't want to wait and can
// increase the coefficient and get good performance quite soon.
// But if we don't sure we can do it slowly and it could prevent
// premature exit from this mode. So, when the coefficient is
// higher we can get better performance when heavy reading is stable.
// But when reading is changing we can adjust to it and set
// the coefficient to lower value.
int change =
(int) (freedDataOverheadPercent * cache.heavyEvictionOverheadCoefficient);
// But practice shows that 15% of reducing is quite enough.
// We are not greedy (it could lead to premature exit).
change = Math.min(15, change);
change = Math.max(0, change); // I think it will never happen but check for sure
// So this is the key point, here we are reducing % of caching blocks
cache.cacheDataBlockPercent -= change;
// If we go down too deep we have to stop here, 1% any way should be.
cache.cacheDataBlockPercent = Math.max(1, cache.cacheDataBlockPercent);
}
} else {
// Well, we have got overshooting.
// Mayby it is just short-term fluctuation and we can stay in this mode.
// It help avoid permature exit during short-term fluctuation.
// If overshooting less than 90%, we will try to increase the percent of
// caching blocks and hope it is enough.
if (freedSumMb >= cache.heavyEvictionMbSizeLimit * 0.1) {
// Simple logic: more overshooting - more caching blocks (backpressure)
int change = (int) (-freedDataOverheadPercent * 0.1 + 1);
cache.cacheDataBlockPercent += change;
// But it can't be more then 100%, so check it.
cache.cacheDataBlockPercent = Math.min(100, cache.cacheDataBlockPercent);
} else {
// Looks like heavy reading is over.
// Just exit form this mode.
heavyEvictionCount = 0;
cache.cacheDataBlockPercent = 100;
}
}
LOG.info("BlockCache evicted (MB): {}, overhead (%): {}, " +
"heavy eviction counter: {}, " +
"current caching DataBlock (%): {}",
freedSumMb, freedDataOverheadPercent,
heavyEvictionCount, cache.cacheDataBlockPercent);
freedSumMb = 0;
startTime = stopTime;
}
Tagad aplÅ«kosim to visu, izmantojot reÄlu piemÄru. Mums ir Å”Äds testa skripts:
- SÄksim veikt skenÄÅ”anu (25 pavedieni, partija = 100)
- PÄc 5 minÅ«tÄm pievienojiet multi-gets (25 pavedieni, partija = 100)
- PÄc 5 minÅ«tÄm izslÄdziet multi-gets (atkal paliek tikai skenÄÅ”ana)
MÄs veicam divas darbÄ«bas, vispirms hbase.lru.cache.heavy.eviction.count.limit = 10000 (kas faktiski atspÄjo funkciju), un pÄc tam iestatÄm limitu = 0 (iespÄjo to).
ZemÄk esoÅ”ajos žurnÄlos redzams, kÄ Å”Ä« funkcija ir ieslÄgta, un pÄrsniegÅ”ana tiek atiestatÄ«ta uz 14ā71%. Ik pa laikam slodze samazinÄs, kas ieslÄdz Backpressure un HBase atkal keÅ”atmiÅÄ vairÄk bloku.
ReÄ£istrÄties RegionServer
izlikts (MB): 0, koeficients 0.0, pieskaitÄmÄs izmaksas (%): -100, lielais izlikÅ”anas skaitÄ«tÄjs: 0, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 100
izlikts (MB): 0, koeficients 0.0, pieskaitÄmÄs izmaksas (%): -100, lielais izlikÅ”anas skaitÄ«tÄjs: 0, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 100
izlikts (MB): 2170, koeficients 1.09, pieskaitÄmÄs izmaksas (%): 985, liels izlikÅ”anas skaitÄ«tÄjs: 1, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 91 < sÄkums
izlikts (MB): 3763, koeficients 1.08, pieskaitÄmÄs izmaksas (%): 1781, lielais izlikÅ”anas skaitÄ«tÄjs: 2, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 76
izlikts (MB): 3306, koeficients 1.07, pieskaitÄmÄs izmaksas (%): 1553, lielais izlikÅ”anas skaitÄ«tÄjs: 3, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 61
izlikts (MB): 2508, koeficients 1.06, pieskaitÄmÄs izmaksas (%): 1154, lielais izlikÅ”anas skaitÄ«tÄjs: 4, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 50
izlikts (MB): 1824, koeficients 1.04, pieskaitÄmÄs izmaksas (%): 812, lielais izlikÅ”anas skaitÄ«tÄjs: 5, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 42
izlikts (MB): 1482, koeficients 1.03, pieskaitÄmÄs izmaksas (%): 641, lielais izlikÅ”anas skaitÄ«tÄjs: 6, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 36
izlikts (MB): 1140, koeficients 1.01, pieskaitÄmÄs izmaksas (%): 470, lielais izlikÅ”anas skaitÄ«tÄjs: 7, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 32
izlikts (MB): 913, koeficients 1.0, pieskaitÄmÄs izmaksas (%): 356, lielais izlikÅ”anas skaitÄ«tÄjs: 8, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 29
izlikts (MB): 912, koeficients 0.89, pieskaitÄmÄs izmaksas (%): 356, lielais izlikÅ”anas skaitÄ«tÄjs: 9, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 26
izlikts (MB): 684, koeficients 0.76, pieskaitÄmÄs izmaksas (%): 242, lielais izlikÅ”anas skaitÄ«tÄjs: 10, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 24
izlikts (MB): 684, koeficients 0.61, pieskaitÄmÄs izmaksas (%): 242, lielais izlikÅ”anas skaitÄ«tÄjs: 11, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 22
izlikts (MB): 456, koeficients 0.51, pieskaitÄmÄs izmaksas (%): 128, lielais izlikÅ”anas skaitÄ«tÄjs: 12, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 21
izlikts (MB): 456, koeficients 0.42, pieskaitÄmÄs izmaksas (%): 128, lielais izlikÅ”anas skaitÄ«tÄjs: 13, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 20
izlikts (MB): 456, koeficients 0.33, pieskaitÄmÄs izmaksas (%): 128, lielais izlikÅ”anas skaitÄ«tÄjs: 14, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 19
izlikts (MB): 342, koeficients 0.33, pieskaitÄmÄs izmaksas (%): 71, lielais izlikÅ”anas skaitÄ«tÄjs: 15, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 19
izlikts (MB): 342, koeficients 0.32, pieskaitÄmÄs izmaksas (%): 71, lielais izlikÅ”anas skaitÄ«tÄjs: 16, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 19
izlikts (MB): 342, koeficients 0.31, pieskaitÄmÄs izmaksas (%): 71, lielais izlikÅ”anas skaitÄ«tÄjs: 17, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 19
izlikts (MB): 228, koeficients 0.3, pieskaitÄmÄs izmaksas (%): 14, lielais izlikÅ”anas skaitÄ«tÄjs: 18, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 19
izlikts (MB): 228, koeficients 0.29, pieskaitÄmÄs izmaksas (%): 14, lielais izlikÅ”anas skaitÄ«tÄjs: 19, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 19
izlikts (MB): 228, koeficients 0.27, pieskaitÄmÄs izmaksas (%): 14, lielais izlikÅ”anas skaitÄ«tÄjs: 20, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 19
izlikts (MB): 228, koeficients 0.25, pieskaitÄmÄs izmaksas (%): 14, lielais izlikÅ”anas skaitÄ«tÄjs: 21, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 19
izlikts (MB): 228, koeficients 0.24, pieskaitÄmÄs izmaksas (%): 14, lielais izlikÅ”anas skaitÄ«tÄjs: 22, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 19
izlikts (MB): 228, koeficients 0.22, pieskaitÄmÄs izmaksas (%): 14, lielais izlikÅ”anas skaitÄ«tÄjs: 23, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 19
izlikts (MB): 228, koeficients 0.21, pieskaitÄmÄs izmaksas (%): 14, lielais izlikÅ”anas skaitÄ«tÄjs: 24, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 19
izlikts (MB): 228, koeficients 0.2, pieskaitÄmÄs izmaksas (%): 14, lielais izlikÅ”anas skaitÄ«tÄjs: 25, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 19
izlikts (MB): 228, koeficients 0.17, pieskaitÄmÄs izmaksas (%): 14, lielais izlikÅ”anas skaitÄ«tÄjs: 26, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 19
izlikts (MB): 456, koeficients 0.17, pieskaitÄmÄs izmaksas (%): 128, lielais izlikÅ”anas skaitÄ«tÄjs: 27, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 18 < pievienotie saÅem (bet tabula tÄ pati)
izlikts (MB): 456, koeficients 0.15, pieskaitÄmÄs izmaksas (%): 128, lielais izlikÅ”anas skaitÄ«tÄjs: 28, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 17
izlikts (MB): 342, koeficients 0.13, pieskaitÄmÄs izmaksas (%): 71, lielais izlikÅ”anas skaitÄ«tÄjs: 29, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 17
izlikts (MB): 342, koeficients 0.11, pieskaitÄmÄs izmaksas (%): 71, lielais izlikÅ”anas skaitÄ«tÄjs: 30, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 17
izlikts (MB): 342, koeficients 0.09, pieskaitÄmÄs izmaksas (%): 71, lielais izlikÅ”anas skaitÄ«tÄjs: 31, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 17
izlikts (MB): 228, koeficients 0.08, pieskaitÄmÄs izmaksas (%): 14, lielais izlikÅ”anas skaitÄ«tÄjs: 32, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 17
izlikts (MB): 228, koeficients 0.07, pieskaitÄmÄs izmaksas (%): 14, lielais izlikÅ”anas skaitÄ«tÄjs: 33, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 17
izlikts (MB): 228, koeficients 0.06, pieskaitÄmÄs izmaksas (%): 14, lielais izlikÅ”anas skaitÄ«tÄjs: 34, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 17
izlikts (MB): 228, koeficients 0.05, pieskaitÄmÄs izmaksas (%): 14, lielais izlikÅ”anas skaitÄ«tÄjs: 35, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 17
izlikts (MB): 228, koeficients 0.05, pieskaitÄmÄs izmaksas (%): 14, lielais izlikÅ”anas skaitÄ«tÄjs: 36, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 17
izlikts (MB): 228, koeficients 0.04, pieskaitÄmÄs izmaksas (%): 14, lielais izlikÅ”anas skaitÄ«tÄjs: 37, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 17
izlikts (MB): 109, koeficients 0.04, pieskaitÄmÄs izmaksas (%): -46, liels izlikÅ”anas skaitÄ«tÄjs: 37, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 22 < pretspiediens
izlikts (MB): 798, koeficients 0.24, pieskaitÄmÄs izmaksas (%): 299, lielais izlikÅ”anas skaitÄ«tÄjs: 38, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 20
izlikts (MB): 798, koeficients 0.29, pieskaitÄmÄs izmaksas (%): 299, lielais izlikÅ”anas skaitÄ«tÄjs: 39, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 18
izlikts (MB): 570, koeficients 0.27, pieskaitÄmÄs izmaksas (%): 185, lielais izlikÅ”anas skaitÄ«tÄjs: 40, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 17
izlikts (MB): 456, koeficients 0.22, pieskaitÄmÄs izmaksas (%): 128, lielais izlikÅ”anas skaitÄ«tÄjs: 41, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 16
izlikts (MB): 342, koeficients 0.16, pieskaitÄmÄs izmaksas (%): 71, lielais izlikÅ”anas skaitÄ«tÄjs: 42, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 16
izlikts (MB): 342, koeficients 0.11, pieskaitÄmÄs izmaksas (%): 71, lielais izlikÅ”anas skaitÄ«tÄjs: 43, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 16
izlikts (MB): 228, koeficients 0.09, pieskaitÄmÄs izmaksas (%): 14, lielais izlikÅ”anas skaitÄ«tÄjs: 44, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 16
izlikts (MB): 228, koeficients 0.07, pieskaitÄmÄs izmaksas (%): 14, lielais izlikÅ”anas skaitÄ«tÄjs: 45, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 16
izlikts (MB): 228, koeficients 0.05, pieskaitÄmÄs izmaksas (%): 14, lielais izlikÅ”anas skaitÄ«tÄjs: 46, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 16
izlikts (MB): 222, koeficients 0.04, pieskaitÄmÄs izmaksas (%): 11, lielais izlikÅ”anas skaitÄ«tÄjs: 47, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 16
izlikts (MB): 104, koeficients 0.03, pieskaitÄmÄs izmaksas (%): -48, liels izlikÅ”anas skaitÄ«tÄjs: 47, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 21 < pÄrtraukt izpaužas
izlikts (MB): 684, koeficients 0.2, pieskaitÄmÄs izmaksas (%): 242, lielais izlikÅ”anas skaitÄ«tÄjs: 48, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 19
izlikts (MB): 570, koeficients 0.23, pieskaitÄmÄs izmaksas (%): 185, lielais izlikÅ”anas skaitÄ«tÄjs: 49, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 18
izlikts (MB): 342, koeficients 0.22, pieskaitÄmÄs izmaksas (%): 71, lielais izlikÅ”anas skaitÄ«tÄjs: 50, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 18
izlikts (MB): 228, koeficients 0.21, pieskaitÄmÄs izmaksas (%): 14, lielais izlikÅ”anas skaitÄ«tÄjs: 51, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 18
izlikts (MB): 228, koeficients 0.2, pieskaitÄmÄs izmaksas (%): 14, lielais izlikÅ”anas skaitÄ«tÄjs: 52, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 18
izlikts (MB): 228, koeficients 0.18, pieskaitÄmÄs izmaksas (%): 14, lielais izlikÅ”anas skaitÄ«tÄjs: 53, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 18
izlikts (MB): 228, koeficients 0.16, pieskaitÄmÄs izmaksas (%): 14, lielais izlikÅ”anas skaitÄ«tÄjs: 54, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 18
izlikts (MB): 228, koeficients 0.14, pieskaitÄmÄs izmaksas (%): 14, lielais izlikÅ”anas skaitÄ«tÄjs: 55, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 18
izlikts (MB): 112, koeficients 0.14, pieskaitÄmÄs izmaksas (%): -44, liels izlikÅ”anas skaitÄ«tÄjs: 55, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 23 < pretspiediens
izlikts (MB): 456, koeficients 0.26, pieskaitÄmÄs izmaksas (%): 128, lielais izlikÅ”anas skaitÄ«tÄjs: 56, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 22
izlikts (MB): 342, koeficients 0.31, pieskaitÄmÄs izmaksas (%): 71, lielais izlikÅ”anas skaitÄ«tÄjs: 57, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 22
izlikts (MB): 342, koeficients 0.33, pieskaitÄmÄs izmaksas (%): 71, lielais izlikÅ”anas skaitÄ«tÄjs: 58, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 22
izlikts (MB): 342, koeficients 0.33, pieskaitÄmÄs izmaksas (%): 71, lielais izlikÅ”anas skaitÄ«tÄjs: 59, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 22
izlikts (MB): 342, koeficients 0.33, pieskaitÄmÄs izmaksas (%): 71, lielais izlikÅ”anas skaitÄ«tÄjs: 60, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 22
izlikts (MB): 342, koeficients 0.33, pieskaitÄmÄs izmaksas (%): 71, lielais izlikÅ”anas skaitÄ«tÄjs: 61, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 22
izlikts (MB): 342, koeficients 0.33, pieskaitÄmÄs izmaksas (%): 71, lielais izlikÅ”anas skaitÄ«tÄjs: 62, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 22
izlikts (MB): 342, koeficients 0.33, pieskaitÄmÄs izmaksas (%): 71, lielais izlikÅ”anas skaitÄ«tÄjs: 63, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 22
izlikts (MB): 342, koeficients 0.32, pieskaitÄmÄs izmaksas (%): 71, lielais izlikÅ”anas skaitÄ«tÄjs: 64, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 22
izlikts (MB): 342, koeficients 0.33, pieskaitÄmÄs izmaksas (%): 71, lielais izlikÅ”anas skaitÄ«tÄjs: 65, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 22
izlikts (MB): 342, koeficients 0.33, pieskaitÄmÄs izmaksas (%): 71, lielais izlikÅ”anas skaitÄ«tÄjs: 66, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 22
izlikts (MB): 342, koeficients 0.32, pieskaitÄmÄs izmaksas (%): 71, lielais izlikÅ”anas skaitÄ«tÄjs: 67, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 22
izlikts (MB): 342, koeficients 0.33, pieskaitÄmÄs izmaksas (%): 71, lielais izlikÅ”anas skaitÄ«tÄjs: 68, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 22
izlikts (MB): 342, koeficients 0.32, pieskaitÄmÄs izmaksas (%): 71, lielais izlikÅ”anas skaitÄ«tÄjs: 69, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 22
izlikts (MB): 342, koeficients 0.32, pieskaitÄmÄs izmaksas (%): 71, lielais izlikÅ”anas skaitÄ«tÄjs: 70, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 22
izlikts (MB): 342, koeficients 0.33, pieskaitÄmÄs izmaksas (%): 71, lielais izlikÅ”anas skaitÄ«tÄjs: 71, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 22
izlikts (MB): 342, koeficients 0.33, pieskaitÄmÄs izmaksas (%): 71, lielais izlikÅ”anas skaitÄ«tÄjs: 72, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 22
izlikts (MB): 342, koeficients 0.33, pieskaitÄmÄs izmaksas (%): 71, lielais izlikÅ”anas skaitÄ«tÄjs: 73, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 22
izlikts (MB): 342, koeficients 0.33, pieskaitÄmÄs izmaksas (%): 71, lielais izlikÅ”anas skaitÄ«tÄjs: 74, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 22
izlikts (MB): 342, koeficients 0.33, pieskaitÄmÄs izmaksas (%): 71, lielais izlikÅ”anas skaitÄ«tÄjs: 75, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 22
izlikts (MB): 342, koeficients 0.33, pieskaitÄmÄs izmaksas (%): 71, lielais izlikÅ”anas skaitÄ«tÄjs: 76, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 22
izlikts (MB): 21, koeficients 0.33, pieskaitÄmÄs izmaksas (%): -90, lielais izlikÅ”anas skaitÄ«tÄjs: 76, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 32
izlikts (MB): 0, koeficients 0.0, pieskaitÄmÄs izmaksas (%): -100, lielais izlikÅ”anas skaitÄ«tÄjs: 0, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 100
izlikts (MB): 0, koeficients 0.0, pieskaitÄmÄs izmaksas (%): -100, lielais izlikÅ”anas skaitÄ«tÄjs: 0, paÅ”reizÄjÄ keÅ”atmiÅa DataBlock (%): 100
SkenÄÅ”ana bija nepiecieÅ”ama, lai parÄdÄ«tu vienu un to paÅ”u procesu attiecÄ«bu diagrammas veidÄ starp divÄm keÅ”atmiÅas sadaļÄm - vienu (kurÄ bloki, kas nekad iepriekÅ” nav pieprasÄ«ti) un vairÄku (Å”eit tiek glabÄti vismaz vienu reizi āpieprasÄ«tieā dati):
Un visbeidzot, kÄ izskatÄs parametru darbÄ«ba grafika veidÄ. SalÄ«dzinÄjumam sÄkumÄ keÅ”atmiÅa tika pilnÄ«bÄ izslÄgta, pÄc tam tika palaists HBase ar keÅ”atmiÅu un optimizÄcijas darbu sÄkÅ”anas aizkavÄÅ”anu par 5 minÅ«tÄm (30 izlikÅ”anas cikli).
Pilnu kodu var atrast Pull Request
TomÄr 300 tÅ«kstoÅ”i nolasÄ«jumu sekundÄ nav viss, ko ar Å”o aparatÅ«ru var sasniegt Å”Ädos apstÄkļos. Fakts ir tÄds, ka, ja jums ir nepiecieÅ”ams piekļūt datiem, izmantojot HDFS, tiek izmantots ShortCircuitCache (turpmÄk tekstÄ SSC) mehÄnisms, kas ļauj piekļūt datiem tieÅ”i, izvairoties no tÄ«kla mijiedarbÄ«bas.
ProfilÄÅ”ana parÄdÄ«ja, ka, lai gan Å”is mehÄnisms dod lielu peļÅu, tas kÄdÄ brÄ«dÄ« kļūst arÄ« par saÅ”aurinÄjumu, jo gandrÄ«z visas smagÄs darbÄ«bas notiek slÄdzenes iekÅ”pusÄ, kas lielÄkoties noved pie bloÄ·ÄÅ”anas.
To sapratuÅ”i, mÄs sapratÄm, ka problÄmu var apiet, izveidojot neatkarÄ«gu SSC masÄ«vu:
private final ShortCircuitCache[] shortCircuitCache;
...
shortCircuitCache = new ShortCircuitCache[this.clientShortCircuitNum];
for (int i = 0; i < this.clientShortCircuitNum; i++)
this.shortCircuitCache[i] = new ShortCircuitCache(ā¦);
Un pÄc tam strÄdÄjiet ar tiem, izÅemot krustojumus arÄ« pie pÄdÄjÄ nobÄ«des cipara:
public ShortCircuitCache getShortCircuitCache(long idx) {
return shortCircuitCache[(int) (idx % clientShortCircuitNum)];
}
Tagad jÅ«s varat sÄkt testÄÅ”anu. Lai to izdarÄ«tu, mÄs nolasÄ«sim failus no HDFS, izmantojot vienkÄrÅ”u daudzpavedienu lietojumprogrammu. Iestatiet parametrus:
conf.set("dfs.client.read.shortcircuit", "true");
conf.set("dfs.client.read.shortcircuit.buffer.size", "65536"); // ŠæŠ¾ Š“ŠµŃŠ¾Š»ŃŃ = 1 ŠŠ Šø ŃŃŠ¾ ŃŠøŠ»ŃŠ½Š¾ Š·Š°Š¼ŠµŠ“Š»ŃŠµŃ ŃŃŠµŠ½ŠøŠµ, ŠæŠ¾ŃŃŠ¾Š¼Ń Š»ŃŃŃŠµ ŠæŃŠøŠ²ŠµŃŃŠø Š² ŃŠ¾Š¾ŃŠ²ŠµŃŃŃŠ²ŠøŠµ Šŗ ŃŠµŠ°Š»ŃŠ½ŃŠ¼ Š½ŃŠ¶Š“Š°Š¼
conf.set("dfs.client.short.circuit.num", num); // Š¾Ń 1 Š“Š¾ 10
Un vienkÄrÅ”i izlasiet failus:
FSDataInputStream in = fileSystem.open(path);
for (int i = 0; i < count; i++) {
position += 65536;
if (position > 900000000)
position = 0L;
int res = in.read(position, byteBuffer, 0, 65536);
}
Å is kods tiek izpildÄ«ts atseviŔķos pavedienos, un mÄs palielinÄsim vienlaicÄ«gi nolasÄmo failu skaitu (no 10 lÄ«dz 200 - horizontÄlÄ ass) un keÅ”atmiÅu skaitu (no 1 lÄ«dz 10 - grafikas). VertikÄlÄ ass parÄda paÄtrinÄjumu, kas rodas, palielinoties SSC, salÄ«dzinot ar gadÄ«jumu, kad ir tikai viena keÅ”atmiÅa.
KÄ lasÄ«t grafiku: izpildes laiks 100 tÅ«kstoÅ”iem nolasÄ«jumu 64 KB blokos ar vienu keÅ”atmiÅu prasa 78 sekundes. SavukÄrt ar 5 keÅ”atmiÅÄm tas aizÅem 16 sekundes. Tie. ir ~5 reizes paÄtrinÄjums. KÄ redzams no grafika, efekts nav Ä«paÅ”i pamanÄms nelielam paralÄlu nolasÄ«jumu skaitam, tas sÄk spÄlÄt pamanÄmu lomu, kad pavedienu nolasÄ«jumu skaits pÄrsniedz 50. TÄpat ir pamanÄms, ka SSC skaita palielinÄÅ”ana no 6 un augstÄk, nodroÅ”ina ievÄrojami mazÄku veiktspÄjas pieaugumu.
1. piezÄ«me: tÄ kÄ testa rezultÄti ir diezgan nepastÄvÄ«gi (skatÄ«t zemÄk), tika veikti 3 braucieni un iegÅ«tÄs vÄrtÄ«bas tika aprÄÄ·inÄtas vidÄjÄs.
2. piezÄ«me. VeiktspÄjas ieguvums no nejauÅ”Äs piekļuves konfigurÄÅ”anas ir vienÄds, lai gan pati piekļuve ir nedaudz lÄnÄka.
TomÄr ir jÄprecizÄ, ka atŔķirÄ«bÄ no HBase gadÄ«juma Å”is paÄtrinÄjums ne vienmÄr ir bezmaksas. Å eit mÄs āatbloÄ·Äjamā CPU spÄju strÄdÄt vairÄk, nevis karÄties uz slÄdzenÄm.
Å eit var novÄrot, ka kopumÄ keÅ”atmiÅu skaita pieaugums rada aptuveni proporcionÄlu CPU izmantoÅ”anas pieaugumu. TomÄr ir nedaudz vairÄk uzvaroÅ”o kombinÄciju.
PiemÄram, aplÅ«kosim tuvÄk iestatÄ«jumu SSC = 3. VeiktspÄjas pieaugums diapazonÄ ir aptuveni 3.3 reizes. ZemÄk ir visu trÄ«s atseviŔķu braucienu rezultÄti.
KamÄr CPU patÄriÅÅ” palielinÄs apmÄram 2.8 reizes. AtŔķirÄ«ba nav Ä«paÅ”i liela, bet mazÄ GrÄta jau ir laimÄ«ga un varbÅ«t paspÄs apmeklÄt skolu un nodarbÄ«bas.
TÄdÄjÄdi tam bÅ«s pozitÄ«va ietekme uz jebkuru rÄ«ku, kas izmanto lielapjoma piekļuvi HDFS (piemÄram, Spark u.c.), ja lietojumprogrammas kods ir viegls (t.i., spraudnis atrodas HDFS klienta pusÄ) un ir brÄ«va CPU jauda. . Lai pÄrbaudÄ«tu, pÄrbaudÄ«sim, kÄdu efektu radÄ«s BlockCache optimizÄcijas un SSC noregulÄÅ”anas kombinÄta izmantoÅ”ana lasÄ«Å”anai no HBase.
Redzams, ka Å”Ädos apstÄkļos efekts nav tik liels kÄ rafinÄtajos testos (lasot bez jebkÄdas apstrÄdes), taÄu Å”eit ir pilnÄ«gi iespÄjams izspiest papildus 80K. Abas optimizÄcijas kopÄ nodroÅ”ina lÄ«dz pat 4x paÄtrinÄjumu.
Par Å”o optimizÄciju tika izveidots arÄ« PR
Un visbeidzot, bija interesanti salÄ«dzinÄt lasÄ«Å”anas veiktspÄju lÄ«dzÄ«gai plaÅ”a kolonnu datubÄzei Cassandra un HBase.
Lai to paveiktu, mÄs palaižÄm standarta YCSB slodzes testÄÅ”anas utilÄ«ta gadÄ«jumus no diviem saimniekiem (kopÄ 800 pavedieni). Servera pusÄ - 4 RegionServer un Cassandra gadÄ«jumi uz 4 saimniekiem (ne tie, kuros darbojas klienti, lai izvairÄ«tos no viÅu ietekmes). RÄdÄ«jumi tika iegÅ«ti no lieluma tabulÄm:
HBase ā 300 GB HDFS (100 GB tÄ«ri dati)
Cassandra ā 250 GB (replikÄcijas koeficients = 3)
Tie. apjoms bija aptuveni tÄds pats (HBase nedaudz vairÄk).
HBase parametri:
dfs.client.short.circuit.num = 5 (HDFS klienta optimizÄcija)
hbase.lru.cache.heavy.eviction.count.limit = 30 - tas nozÄ«mÄ, ka plÄksteris sÄks darboties pÄc 30 izlikÅ”anas (~5 minÅ«tes)
hbase.lru.cache.heavy.eviction.mb.size.limit = 300 ā keÅ”atmiÅas un izlikÅ”anas mÄrÄ·a apjoms
YCSB žurnÄli tika parsÄti un apkopoti Excel grafikos:
KÄ redzat, Ŕīs optimizÄcijas ļauj salÄ«dzinÄt Å”o datu bÄzu veiktspÄju Å”ajos apstÄkļos un sasniegt 450 tÅ«kstoÅ”us nolasÄ«jumu sekundÄ.
MÄs ceram, ka Ŕī informÄcija kÄdam var noderÄt aizraujoÅ”ajÄ cÄ«ÅÄ par produktivitÄti.
Avots: www.habr.com