Pehea e hoʻonui ai i ka wikiwiki heluhelu mai HBase a i 3 mau manawa a mai HDFS a i 5 mau manawa

ʻO ka hana kiʻekiʻe kekahi o nā koi koʻikoʻi i ka wā e hana ai me ka ʻikepili nui. Ma ke keʻena hoʻoili ʻikepili ma Sberbank, hoʻopili mākou i nā hana āpau i kā mākou Hadoop-based Data Cloud a no laila e hana i nā kahe nui o ka ʻike. Ma keʻano maoli, ke ʻimi mau nei mākou i nā ala e hoʻomaikaʻi ai i ka hana, a i kēia manawa makemake mākou e haʻi iā ʻoe pehea mākou i hoʻokele ai i ka RegionServer HBase a me ka mea kūʻai aku HDFS, mahalo i hiki iā mākou ke hoʻonui nui i ka wikiwiki o nā hana heluhelu.
Pehea e hoʻonui ai i ka wikiwiki heluhelu mai HBase a i 3 mau manawa a mai HDFS a i 5 mau manawa

Eia nō naʻe, ma mua o ka neʻe ʻana i ke ʻano o ka hoʻomaikaʻi ʻana, pono e kamaʻilio e pili ana i nā mea paʻa, ma ke kumu, ʻaʻole hiki ke hoʻopuni ʻia inā ʻoe e noho ma kahi HDD.

No ke aha ʻaʻole kūpono ka HDD a me ka heluhelu Random Access wikiwiki
E like me kāu e ʻike ai, HBase, a me nā ʻikepili ʻē aʻe he nui, e mālama i ka ʻikepili i loko o nā poloka o nā ʻumi kilobytes ka nui. ʻO ka maʻamau ma kahi o 64 KB. I kēia manawa, e noʻonoʻo kākou he 100 paita wale nō a noi mākou iā HBase e hāʻawi iā mākou i kēia ʻikepili me ka hoʻohana ʻana i kekahi kī. No ka mea he 64 KB ka nui o ka poloka ma HFiles, ʻoi aku ka nui o ka noi i 640 manawa (hoʻokahi minuke wale nō!) Ma mua o ka pono.

Ma hope aʻe, no ka mea e hele ana ka noi ma HDFS a me kāna ʻōnaehana caching metadata ShortCircuitCache (ʻo ia ka mea e hiki ai ke komo pololei i nā faila), alakaʻi kēia i ka heluhelu ʻana i ka 1 MB mai ka disk. Eia naʻe, hiki ke hoʻoponopono ʻia kēia me ka ʻāpana dfs.client.read.shortcircuit.buffer.size a i nā manawa he nui ke kūpono e hoʻemi i kēia waiwai, no ka laʻana i 126 KB.

E ʻōlelo mākou e hana mākou i kēia, akā ʻo ka mea hou, ke hoʻomaka mākou e heluhelu i ka ʻikepili ma o ka java api, e like me nā hana e like me FileChannel.read a noi i ka ʻōnaehana hana e heluhelu i ka nui o ka ʻikepili, heluhelu ia "i ka hihia" 2 mau manawa hou aku. , i.e. 256 KB i kā mākou hihia. No ka mea, ʻaʻohe ala maʻalahi o java e hoʻonohonoho i ka hae FADV_RANDOM e pale i kēia ʻano.

ʻO ka hopena, e kiʻi i kā mākou 100 bytes, 2600 mau manawa i heluhelu ʻia ma lalo o ka pā. Me he mea lā ua maopopo ka hopena, e hoʻemi kākou i ka nui o ka poloka i ka kilobyte, e hoʻonoho i ka hae i ʻōlelo ʻia a loaʻa i ka wikiwiki hoʻomālamalama. Akā ʻo ka pilikia ʻo ia ma ka hōʻemi ʻana i ka nui o ka poloka i 2 mau manawa, hoʻemi pū mākou i ka helu o nā bytes i heluhelu ʻia i kēlā me kēia ʻāpana o ka manawa e 2 mau manawa.

Hiki ke loaʻa kekahi mau waiwai mai ka hoʻonohonoho ʻana i ka hae FADV_RANDOM, akā me ka nui o nā threading kiʻekiʻe a me ka nui o ka poloka o 128 KB, akā ʻo kēia ka mea kiʻekiʻe o ʻelua mau ʻumi pakeneka:

Pehea e hoʻonui ai i ka wikiwiki heluhelu mai HBase a i 3 mau manawa a mai HDFS a i 5 mau manawa

Ua hana ʻia nā hoʻāʻo ma nā faila 100, kēlā me kēia 1 GB ka nui a aia ma 10 HDDs.

E helu kāua i ka mea hiki iā mākou, ma ke kumu, e helu i kēia wikiwiki:
E ʻōlelo mākou ua heluhelu mākou mai 10 disks i ka wikiwiki o 280 MB/sec, ʻo ia. 3 miliona manawa 100 bytes. Akā, e like me kā mākou e hoʻomanaʻo nei, ʻo ka ʻikepili e pono ai mākou he 2600 mau manawa ma mua o ka mea i heluhelu ʻia. No laila, puunaue mākou i 3 miliona me 2600 a loaʻa 1100 mau mooolelo i kekona.

Ke kaumaha, ʻaʻole anei? ʻO ia ke ʻano Ke kiʻi kaulele komo i ka ʻikepili ma ka HDD - me ka nānā ʻole i ka nui o ka poloka. ʻO kēia ka palena kino o ka loaʻa ʻole a ʻaʻohe waihona e hiki ke ʻoki hou aʻe ma lalo o ia mau kūlana.

A laila, pehea ka loaʻa ʻana o nā ʻikepili i nā wikiwiki kiʻekiʻe? No ka pane ʻana i kēia nīnau, e nānā kākou i ka mea e hana nei ma ke kiʻi aʻe.

Pehea e hoʻonui ai i ka wikiwiki heluhelu mai HBase a i 3 mau manawa a mai HDFS a i 5 mau manawa

Maʻaneʻi mākou e ʻike ai no nā minuke mua loa ʻo ka wikiwiki ma kahi o hoʻokahi kaukani moʻolelo i kekona. Eia naʻe, ma muli o ka nui o ka heluhelu ʻana ma mua o ka mea i noi ʻia, ua pau ka ʻikepili i ka buff/cache o ka ʻōnaehana hana (linux) a piʻi ka wikiwiki i kahi 60 tausani mau kekona.

No laila, e hana hou mākou me ka wikiwiki o ka loaʻa ʻana i ka ʻikepili i loko o ka cache OS a i ʻole i loko o nā polokalamu mālama SSD/NVMe o ka wikiwiki hiki ke hoʻohālikelike.

I kā mākou hihia, e hana mākou i nā hoʻokolohua ma kahi papa o nā kikowaena 4, e uku ʻia kēlā me kēia:

CPU: Xeon E5-2680 v4 @ 2.40GHz 64 pae.
Hoʻomanaʻo: 730 GB.
java mana: 1.8.0_111

A eia ke kumu nui o ka nui o ka ikepili ma na papa e pono e heluhelu. ʻO ka mea ʻoiaʻiʻo inā heluhelu ʻoe i ka ʻikepili mai kahi papaʻaina i waiho piha ʻia i ka cache HBase, a laila ʻaʻole ia e hele mai i ka heluhelu ʻana mai ka buff/cache o ka ʻōnaehana hana. No ka mea, hoʻokaʻawale ʻo HBase i ka 40% o ka hoʻomanaʻo i kahi hale i kapa ʻia ʻo BlockCache. ʻO ka mea nui he ConcurrentHashMap kēia, kahi o ke kī i ka inoa file + offset o ka poloka, a ʻo ka waiwai ka ʻikepili maoli ma kēia offset.

No laila, i ka heluhelu wale ʻana mai kēia hale, mākou ʻike mākou i ka wikiwiki maikaʻi loa, e like me ka miliona noi i kekona. Akā, e noʻonoʻo kākou ʻaʻole hiki iā mākou ke hoʻokaʻawale i nā haneli gigabytes o ka hoʻomanaʻo no ka pono o ka waihona, no ka mea he nui nā mea pono ʻē aʻe e holo ana ma kēia mau kikowaena.

No ka laʻana, i kā mākou hihia, ʻo ka nui o BlockCache ma kahi RS ma kahi o 12 GB. Ua pae mākou i ʻelua RS ma hoʻokahi node, ʻo ia hoʻi. Hāʻawi ʻia ʻo 96 GB no BlockCache ma nā node āpau. A he nui nā manawa hou aku i ka ʻikepili, no ka laʻana, e waiho i 4 mau papa, 130 mau ʻāpana i kēlā me kēia, kahi o nā faila he 800 MB ka nui, i hoʻopaʻa ʻia e FAST_DIFF, ʻo ia. ka huina o 410 GB (ʻo ia ka ʻikepili maʻemaʻe, ʻo ia hoʻi me ka ʻole o ka noʻonoʻo ʻana i ka helu replication).

No laila, ʻo BlockCache wale nō ma kahi o 23% o ka nui o ka ʻikepili a ua kokoke loa kēia i nā kūlana maoli o ka mea i kapa ʻia ʻo BigData. A eia kahi e hoʻomaka ai ka leʻaleʻa - no ka mea, ʻoi aku ka liʻiliʻi o ka cache, ʻoi aku ka maikaʻi o ka hana. Ma hope o nā mea a pau, inā e poina ʻoe, pono ʻoe e hana i nā hana he nui - ʻo ia. e iho i ke kelepona ʻana i nā hana ʻōnaehana. Eia naʻe, ʻaʻole hiki ke pale ʻia kēia, no laila e nānā kākou i kahi ʻano ʻokoʻa loa - he aha ka hopena i ka ʻikepili i loko o ka cache?

E hoʻomaʻamaʻa mākou i ke kūlana a manaʻo mākou he huna huna i kūpono i 1 mea wale nō. Eia kekahi laʻana o ka mea e hiki mai ana ke hoʻāʻo mākou e hana me ka leo ʻikepili 3 mau manawa ʻoi aku ka nui ma mua o ka cache, pono mākou e:

1. E kau i ka poloka 1 ma kahi huna
2. Wehe i ka poloka 1 mai ka huna huna
3. E kau i ka poloka 2 ma kahi huna
4. Wehe i ka poloka 2 mai ka huna huna
5. E kau i ka poloka 3 ma kahi huna

5 mau hana i pau! Eia naʻe, ʻaʻole hiki ke kapa ʻia kēia kūlana maʻamau; ʻoiaʻiʻo, ke koi nei mākou iā HBase e hana i kahi hui o ka hana pono ʻole. Heluhelu mau ʻo ia i ka ʻikepili mai ka cache OS, waiho iā ia ma BlockCache, e hoʻolei koke iā ia no ka mea ua hiki mai kahi ʻāpana hou. Hōʻike ka animation i ka hoʻomaka ʻana o ka pou i ke ʻano o ka pilikia - Ke hele nei ʻo Garbage Collector i ka pālākiō, ua wela ka lewa, ua huhū ʻo Greta liʻiliʻi ma kahi mamao a me ka wela o Sweden. A ʻaʻole makemake mākou i ka poʻe IT i ke kaumaha o nā keiki, no laila hoʻomaka mākou e noʻonoʻo i ka mea hiki iā mākou ke hana no ia.

He aha inā ʻaʻole ʻoe e hoʻokomo i nā poloka a pau i loko o ka cache, akā he hapa hapa wale nō o lākou, i ʻole e kahe ka cache? E hoʻomaka kākou ma ka hoʻohui ʻana i kekahi mau laina code i ka hoʻomaka o ka hana no ka hoʻokomo ʻana i ka ʻikepili i BlockCache:

  public void cacheBlock(BlockCacheKey cacheKey, Cacheable buf, boolean inMemory) {
    if (cacheDataBlockPercent != 100 && buf.getBlockType().isData()) {
      if (cacheKey.getOffset() % 100 >= cacheDataBlockPercent) {
        return;
      }
    }
...

ʻO ka helu ma ʻaneʻi: ʻo ka offset ke kūlana o ka poloka i loko o ka faila a ʻo kāna mau huahelu hope loa e puʻunaue like ʻole ʻia mai ka 00 a hiki i ka 99. No laila, e hoʻokuʻu wale mākou i nā mea i hāʻule i ka laulā a mākou e pono ai.

No ka laʻana, hoʻonohonoho i ka cacheDataBlockPercent = 20 a ʻike i ka mea e hana nei:

Pehea e hoʻonui ai i ka wikiwiki heluhelu mai HBase a i 3 mau manawa a mai HDFS a i 5 mau manawa

Ua maopopo ka hopena. Ma nā pakuhi ma lalo nei, ua maopopo ke kumu i hiki mai ai ka wikiwiki - mālama mākou i ka nui o nā kumuwaiwai GC me ka hana ʻole i ka hana Sisyphean o ka waiho ʻana i ka ʻikepili i loko o ka huna huna wale nō e hoʻolei koke iā ia i lalo o ke kahawai o nā ʻīlio Martian:

Pehea e hoʻonui ai i ka wikiwiki heluhelu mai HBase a i 3 mau manawa a mai HDFS a i 5 mau manawa

I ka manawa like, piʻi ka hoʻohana ʻana o ka CPU, akā ʻoi aku ka liʻiliʻi ma mua o ka huahana:

Pehea e hoʻonui ai i ka wikiwiki heluhelu mai HBase a i 3 mau manawa a mai HDFS a i 5 mau manawa

He mea kūpono hoʻi e hoʻomaopopo he ʻokoʻa nā poloka i mālama ʻia ma BlockCache. ʻO ka hapa nui, ma kahi o 95%, ʻo ka ʻikepili ponoʻī. A ʻo ke koena he metadata, e like me nā kānana Bloom a i ʻole LEAF_INDEX a etc.. ʻAʻole lawa kēia ʻikepili, akā he mea maikaʻi loa ia, no ka mea ma mua o ke komo ʻana i ka ʻikepili pololei, huli ʻo HBase i ka meta e hoʻomaopopo ai inā pono e ʻimi hou aku ma aneʻi a, inā pēlā, ma hea kahi e kū ai ka poloka o ka hoihoi.

No laila, ma ke code ʻike mākou i kahi kūlana nānā buf.getBlockType().isData() a mahalo i kēia meta, e waiho mākou iā ia i loko o ka cache i kēlā me kēia hihia.

I kēia manawa e hoʻonui i ka ukana a hoʻopaʻa iki i ka hiʻohiʻona i ka hele hoʻokahi. I ka hoʻāʻo mua ua hana mākou i ka pākēneka cutoff = 20 a ua hoʻohana iki ʻia ʻo BlockCache. I kēia manawa, e hoʻonoho i ka 23% a hoʻohui i 100 mau kaula i kēlā me kēia 5 mau minuke e ʻike ai i ke ʻano o ka saturation.

Pehea e hoʻonui ai i ka wikiwiki heluhelu mai HBase a i 3 mau manawa a mai HDFS a i 5 mau manawa

Maʻaneʻi mākou eʻike ai ua kokoke koke ka mana mua i ke kaupaku ma kahi o 100 tausani mau noi i kekona. ʻOiai ke hāʻawi nei ka patch i ka wikiwiki a hiki i 300 tausani. I ka manawa like, ua maopopo ʻaʻole ʻoi aku ka wikiwiki o ka "noa"; ke hoʻonui nei ka hoʻohana ʻana o ka CPU.

Eia nō naʻe, ʻaʻole kēia he hopena nani loa, no ka mea ʻaʻole mākou i ʻike ma mua i ka pākēneka o nā poloka e pono e hūnā ʻia, pili ia i ka ʻaoʻao o ka ukana. No laila, ua hoʻokō ʻia kahi mīkini e hoʻoponopono aunoa i kēia ʻāpana ma muli o ka hana o nā hana heluhelu.

ʻEkolu mau koho i hoʻohui ʻia e hoʻomalu i kēia:

hbase.lru.cache.heavy.eviction.count.limit - hoʻonohonoho i ka nui o nā manawa e holo ai ke kaʻina hana o ka kipaku ʻana i ka ʻikepili mai ka cache ma mua o ka hoʻomaka ʻana i ka hoʻohana ʻana i ka loiloi (ʻo ia hoʻi. Ma ka maʻamau, ua like ia me MAX_INT = 2147483647 a ʻo ia hoʻi, ʻaʻole e hoʻomaka ka hana me kēia waiwai. No ka mea, hoʻomaka ke kaʻina hana kipaku i kēlā me kēia 5 - 10 kekona (e pili ana i ka ukana) a me 2147483647 * 10 / 60 / 60 / 24 / 365 = 680 mau makahiki. Eia naʻe, hiki iā mākou ke hoʻonohonoho i kēia ʻāpana i ka 0 a hana i ka hiʻohiʻona e hana koke ma hope o ka hoʻomaka ʻana.

Eia nō naʻe, aia pū kekahi uku i kēia ʻāpana. Inā ʻo kā mākou haʻawe e hoʻopili mau ʻia ka heluhelu pōkole (e ʻōlelo i ke ao) a me ka heluhelu lōʻihi (i ka pō), a laila hiki iā mākou ke hōʻoia i ka huli ʻana o ka hiʻohiʻona i ka wā e holomua ana nā hana heluhelu lōʻihi.

No ka laʻana, ʻike mākou he 1 mau minuke ka lōʻihi o nā heluhelu pōkole. ʻAʻohe pono e hoʻomaka i ka hoʻolei ʻana i nā poloka, ʻaʻole e loaʻa i ka cache ka manawa e lilo i ka wā kahiko a laila hiki iā mākou ke hoʻonohonoho i kēia ʻāpana like, no ka laʻana, 10. E alakaʻi kēia i ka ʻoiaʻiʻo e hoʻomaka ka optimization e hana wale i ka wā lōʻihi- ua hoʻomaka ʻia ka heluhelu ikaika ʻana, ʻo ia hoʻi. i 100 kekona. No laila, inā loaʻa iā mākou kahi heluhelu pōkole, a laila e hele nā ​​poloka āpau i ka cache a loaʻa (koe wale nā ​​mea e kipaku ʻia e ka algorithm maʻamau). A ke hana mākou i nā heluhelu lōʻihi, ua hoʻāla ʻia ka hiʻohiʻona a loaʻa iā mākou ka hana kiʻekiʻe.

hbase.lru.cache.heavy.eviction.mb.size.limit - hoʻonohonoho i ka nui o nā megabytes a mākou e makemake ai e waiho i loko o ka cache (a, ʻoiaʻiʻo, kipaku) i 10 kekona. E ho'āʻo ka hiʻona e hiki i kēia waiwai a mālama. ʻO ke kumu kēia: inā mākou e hoʻolei i nā gigabytes i loko o ka cache, a laila pono mākou e kipaku i nā gigabytes, a ʻo kēia, e like me kā mākou i ʻike ai ma luna, he kumukūʻai loa. Eia nō naʻe, ʻaʻole pono ʻoe e hoʻāʻo e hoʻonoho liʻiliʻi, no ka mea, e hoʻokuʻu koke ʻia ke ʻano skip block. No nā kikowaena ikaika (e pili ana i 20-40 cores kino), ʻoi aku ka maikaʻi o ka hoʻonohonoho ʻana ma kahi o 300-400 MB. No ka papa waena (~ 10 cores) 200-300 MB. No nā ʻōnaehana nāwaliwali (2-5 cores) 50-100 MB paha ka mea maʻamau (ʻaʻole i hoʻāʻo ʻia ma kēia mau mea).

E nānā kākou pehea e hana ai kēia: e ʻōlelo kākou ua hoʻonoho mākou i ka hbase.lru.cache.heavy.eviction.mb.size.limit = 500, aia kekahi ʻano o ka ukana (heluhelu) a laila i kēlā me kēia ~ 10 kekona mākou e helu ai i ka nui o nā bytes. kipaku ʻia me ka hoʻohana ʻana i ke ʻano:

Ma luna o ke poʻo = Hui Paʻa Kūʻokoʻa (MB) * 100 / palena (MB) - 100;

Inā ua kipaku ʻia ʻo 2000 MB, a laila ua like ka Overhead me:

2000 * 100 / 500 - 100 = 300%

Ke ho'āʻo nei nā algorithms e mālama ʻaʻole i ʻoi aku ma mua o kahi mau ʻumi o ka pākēneka, no laila e hōʻemi ka hiʻohiʻona i ka pākēneka o nā poloka cached, a laila e hoʻokō ai i kahi ʻano hana auto-tuning.

Eia naʻe, inā hāʻule ka ukana, e ʻōlelo kākou he 200 MB wale nō ke kipaku ʻia a lilo ʻo Overhead i mea ʻino (ka mea i kapa ʻia ʻo overshooting):

200 * 100 / 500 - 100 = -60%

ʻO ka mea ʻē aʻe, e hoʻonui ka hiʻohiʻona i ka pakeneka o nā poloka huna a hiki i ka lilo ʻana o Overhead i mea maikaʻi.

Aia ma lalo kahi hiʻohiʻona o ke ʻano o kēia i ka ʻikepili maoli. ʻAʻohe pono e ho'āʻo e hiki i ka 0%, hikiʻole. He mea maikaʻi loa ia ma kahi o 30 - 100%, kōkua kēia i ka pale ʻana i ka puka mua ʻana mai ke ʻano loiloi i ka wā pōkole.

hbase.lru.cache.heavy.eviction.overhead.coefficient - hoʻonohonoho i ka wikiwiki a mākou e makemake ai e loaʻa ka hopena. Inā ʻike maopopo mākou he lōʻihi loa kā mākou heluhelu ʻana a ʻaʻole makemake mākou e kali, hiki iā mākou ke hoʻonui i kēia ratio a loaʻa wikiwiki ka hana kiʻekiʻe.

No ka laʻana, hoʻonoho mākou i kēia coefficient = 0.01. 'O ia ho'i, e ho'onui 'ia 'o Overhead (e 'ike i luna) i kēia helu ma ka hopena o ka hopena a e ho'emi 'ia ka pakeneka o nā poloka huna. E noʻonoʻo kākou ʻo Overhead = 300% a me ka coefficient = 0.01, a laila e hoʻemi ʻia ka pākēneka o nā poloka huna e 3%.

Hoʻokomo pū ʻia kahi loiloi "Backpressure" no nā waiwai Overhead maikaʻi ʻole (overshooting). No ka mea hiki mau ka loli manawa pōkole i ka nui o ka heluhelu a me ka hoʻokuke ʻana, hiki i kēia ʻano hana ke pale aku i ka puka mua ʻana mai ke ʻano optimization. Loaʻa i ka backpressure kahi loiloi hoʻohuli: ʻoi aku ka ikaika o ka overshooting, ʻoi aku ka nui o nā poloka i hūnā ʻia.

Pehea e hoʻonui ai i ka wikiwiki heluhelu mai HBase a i 3 mau manawa a mai HDFS a i 5 mau manawa

Code hoʻokō

        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;
       }

E nānā kākou i kēia me ka hoʻohana ʻana i kahi laʻana maoli. Loaʻa iā mākou kēia hōʻike hōʻike:

  1. E hoʻomaka kākou e hana Scan (25 threads, batch = 100)
  2. Ma hope o 5 mau minuke, e hoʻohui i nā loaʻa he nui (25 mau kaula, pūʻulu = 100)
  3. Ma hope o 5 mau minuke, hoʻopau i nā multi-gets (koe wale ka scan)

Hana mākou i ʻelua holo, mua hbase.lru.cache.heavy.eviction.count.limit = 10000 (ʻo ia ka mea e hoʻopau maoli i ka hiʻohiʻona), a laila hoʻonoho i ka palena = 0 (hiki iā ia).

Ma nā lāʻau ma lalo nei mākou e ʻike ai i ke ʻano o ka hiʻohiʻona a hoʻihoʻi i ka Overshooting i 14-71%. I kēlā me kēia manawa ke emi nei ka ukana, e hoʻohuli i ka Backpressure a me HBase e hūnā hou i nā poloka hou.

Log RegionServer
kipaku ʻia (MB): 0, lākiō 0.0, ma luna o ke poʻo (%): -100, helu hoʻokuke kaumaha: 0, hoʻopaʻa ʻia i kēia manawa Paleka ʻikepili (%): 100
kipaku ʻia (MB): 0, lākiō 0.0, ma luna o ke poʻo (%): -100, helu hoʻokuke kaumaha: 0, hoʻopaʻa ʻia i kēia manawa Paleka ʻikepili (%): 100
kipaku ʻia (MB): 2170, lākiō 1.09, ma luna o ke poʻo (%): 985, helu hoʻokuke kaumaha: 1, ke kāʻei ʻana i kēia manawa DataBlock (%): 91 <hoʻomaka
kipaku ʻia (MB): 3763, lākiō 1.08, ma luna o ke poʻo (%): 1781, helu hoʻokuke kaumaha: 2, ke kāʻei ʻana i kēia manawa DataBlock (%): 76
kipaku ʻia (MB): 3306, lākiō 1.07, ma luna o ke poʻo (%): 1553, helu hoʻokuke kaumaha: 3, ke kāʻei ʻana i kēia manawa DataBlock (%): 61
kipaku ʻia (MB): 2508, lākiō 1.06, ma luna o ke poʻo (%): 1154, helu hoʻokuke kaumaha: 4, ke kāʻei ʻana i kēia manawa DataBlock (%): 50
kipaku ʻia (MB): 1824, lākiō 1.04, ma luna o ke poʻo (%): 812, helu hoʻokuke kaumaha: 5, ke kāʻei ʻana i kēia manawa DataBlock (%): 42
kipaku ʻia (MB): 1482, lākiō 1.03, ma luna o ke poʻo (%): 641, helu hoʻokuke kaumaha: 6, ke kāʻei ʻana i kēia manawa DataBlock (%): 36
kipaku ʻia (MB): 1140, lākiō 1.01, ma luna o ke poʻo (%): 470, helu hoʻokuke kaumaha: 7, ke kāʻei ʻana i kēia manawa DataBlock (%): 32
kipaku ʻia (MB): 913, lākiō 1.0, ma luna o ke poʻo (%): 356, helu hoʻokuke kaumaha: 8, ke kāʻei ʻana i kēia manawa DataBlock (%): 29
kipaku ʻia (MB): 912, lākiō 0.89, ma luna o ke poʻo (%): 356, helu hoʻokuke kaumaha: 9, ke kāʻei ʻana i kēia manawa DataBlock (%): 26
kipaku ʻia (MB): 684, lākiō 0.76, ma luna o ke poʻo (%): 242, helu hoʻokuke kaumaha: 10, ke kāʻei ʻana i kēia manawa DataBlock (%): 24
kipaku ʻia (MB): 684, lākiō 0.61, ma luna o ke poʻo (%): 242, helu hoʻokuke kaumaha: 11, ke kāʻei ʻana i kēia manawa DataBlock (%): 22
kipaku ʻia (MB): 456, lākiō 0.51, ma luna o ke poʻo (%): 128, helu hoʻokuke kaumaha: 12, ke kāʻei ʻana i kēia manawa DataBlock (%): 21
kipaku ʻia (MB): 456, lākiō 0.42, ma luna o ke poʻo (%): 128, helu hoʻokuke kaumaha: 13, ke kāʻei ʻana i kēia manawa DataBlock (%): 20
kipaku ʻia (MB): 456, lākiō 0.33, ma luna o ke poʻo (%): 128, helu hoʻokuke kaumaha: 14, ke kāʻei ʻana i kēia manawa DataBlock (%): 19
kipaku ʻia (MB): 342, lākiō 0.33, ma luna o ke poʻo (%): 71, helu hoʻokuke kaumaha: 15, ke kāʻei ʻana i kēia manawa DataBlock (%): 19
kipaku ʻia (MB): 342, lākiō 0.32, ma luna o ke poʻo (%): 71, helu hoʻokuke kaumaha: 16, ke kāʻei ʻana i kēia manawa DataBlock (%): 19
kipaku ʻia (MB): 342, lākiō 0.31, ma luna o ke poʻo (%): 71, helu hoʻokuke kaumaha: 17, ke kāʻei ʻana i kēia manawa DataBlock (%): 19
kipaku ʻia (MB): 228, lākiō 0.3, ma luna o ke poʻo (%): 14, helu hoʻokuke kaumaha: 18, ke kāʻei ʻana i kēia manawa DataBlock (%): 19
kipaku ʻia (MB): 228, lākiō 0.29, ma luna o ke poʻo (%): 14, helu hoʻokuke kaumaha: 19, ke kāʻei ʻana i kēia manawa DataBlock (%): 19
kipaku ʻia (MB): 228, lākiō 0.27, ma luna o ke poʻo (%): 14, helu hoʻokuke kaumaha: 20, ke kāʻei ʻana i kēia manawa DataBlock (%): 19
kipaku ʻia (MB): 228, lākiō 0.25, ma luna o ke poʻo (%): 14, helu hoʻokuke kaumaha: 21, ke kāʻei ʻana i kēia manawa DataBlock (%): 19
kipaku ʻia (MB): 228, lākiō 0.24, ma luna o ke poʻo (%): 14, helu hoʻokuke kaumaha: 22, ke kāʻei ʻana i kēia manawa DataBlock (%): 19
kipaku ʻia (MB): 228, lākiō 0.22, ma luna o ke poʻo (%): 14, helu hoʻokuke kaumaha: 23, ke kāʻei ʻana i kēia manawa DataBlock (%): 19
kipaku ʻia (MB): 228, lākiō 0.21, ma luna o ke poʻo (%): 14, helu hoʻokuke kaumaha: 24, ke kāʻei ʻana i kēia manawa DataBlock (%): 19
kipaku ʻia (MB): 228, lākiō 0.2, ma luna o ke poʻo (%): 14, helu hoʻokuke kaumaha: 25, ke kāʻei ʻana i kēia manawa DataBlock (%): 19
kipaku ʻia (MB): 228, lākiō 0.17, ma luna o ke poʻo (%): 14, helu hoʻokuke kaumaha: 26, ke kāʻei ʻana i kēia manawa DataBlock (%): 19
kipaku ʻia (MB): 456, lākiō 0.17, ma luna o ke poʻo (%): 128, helu hoʻokuke kaumaha: 27, hoʻopaʻa ʻia i kēia manawa DataBlock (%): 18 < i hoʻohui ʻia (akā ʻo ka papa ʻaina like)
kipaku ʻia (MB): 456, lākiō 0.15, ma luna o ke poʻo (%): 128, helu hoʻokuke kaumaha: 28, ke kāʻei ʻana i kēia manawa DataBlock (%): 17
kipaku ʻia (MB): 342, lākiō 0.13, ma luna o ke poʻo (%): 71, helu hoʻokuke kaumaha: 29, ke kāʻei ʻana i kēia manawa DataBlock (%): 17
kipaku ʻia (MB): 342, lākiō 0.11, ma luna o ke poʻo (%): 71, helu hoʻokuke kaumaha: 30, ke kāʻei ʻana i kēia manawa DataBlock (%): 17
kipaku ʻia (MB): 342, lākiō 0.09, ma luna o ke poʻo (%): 71, helu hoʻokuke kaumaha: 31, ke kāʻei ʻana i kēia manawa DataBlock (%): 17
kipaku ʻia (MB): 228, lākiō 0.08, ma luna o ke poʻo (%): 14, helu hoʻokuke kaumaha: 32, ke kāʻei ʻana i kēia manawa DataBlock (%): 17
kipaku ʻia (MB): 228, lākiō 0.07, ma luna o ke poʻo (%): 14, helu hoʻokuke kaumaha: 33, ke kāʻei ʻana i kēia manawa DataBlock (%): 17
kipaku ʻia (MB): 228, lākiō 0.06, ma luna o ke poʻo (%): 14, helu hoʻokuke kaumaha: 34, ke kāʻei ʻana i kēia manawa DataBlock (%): 17
kipaku ʻia (MB): 228, lākiō 0.05, ma luna o ke poʻo (%): 14, helu hoʻokuke kaumaha: 35, ke kāʻei ʻana i kēia manawa DataBlock (%): 17
kipaku ʻia (MB): 228, lākiō 0.05, ma luna o ke poʻo (%): 14, helu hoʻokuke kaumaha: 36, ke kāʻei ʻana i kēia manawa DataBlock (%): 17
kipaku ʻia (MB): 228, lākiō 0.04, ma luna o ke poʻo (%): 14, helu hoʻokuke kaumaha: 37, ke kāʻei ʻana i kēia manawa DataBlock (%): 17
kipaku ʻia (MB): 109, lākiō 0.04, ma luna o ke poʻo (%): -46, helu hoʻokuke kaumaha: 37, hoʻopaʻa i kēia manawa DataBlock (%): 22 < puʻe hope.
kipaku ʻia (MB): 798, lākiō 0.24, ma luna o ke poʻo (%): 299, helu hoʻokuke kaumaha: 38, ke kāʻei ʻana i kēia manawa DataBlock (%): 20
kipaku ʻia (MB): 798, lākiō 0.29, ma luna o ke poʻo (%): 299, helu hoʻokuke kaumaha: 39, ke kāʻei ʻana i kēia manawa DataBlock (%): 18
kipaku ʻia (MB): 570, lākiō 0.27, ma luna o ke poʻo (%): 185, helu hoʻokuke kaumaha: 40, ke kāʻei ʻana i kēia manawa DataBlock (%): 17
kipaku ʻia (MB): 456, lākiō 0.22, ma luna o ke poʻo (%): 128, helu hoʻokuke kaumaha: 41, ke kāʻei ʻana i kēia manawa DataBlock (%): 16
kipaku ʻia (MB): 342, lākiō 0.16, ma luna o ke poʻo (%): 71, helu hoʻokuke kaumaha: 42, ke kāʻei ʻana i kēia manawa DataBlock (%): 16
kipaku ʻia (MB): 342, lākiō 0.11, ma luna o ke poʻo (%): 71, helu hoʻokuke kaumaha: 43, ke kāʻei ʻana i kēia manawa DataBlock (%): 16
kipaku ʻia (MB): 228, lākiō 0.09, ma luna o ke poʻo (%): 14, helu hoʻokuke kaumaha: 44, ke kāʻei ʻana i kēia manawa DataBlock (%): 16
kipaku ʻia (MB): 228, lākiō 0.07, ma luna o ke poʻo (%): 14, helu hoʻokuke kaumaha: 45, ke kāʻei ʻana i kēia manawa DataBlock (%): 16
kipaku ʻia (MB): 228, lākiō 0.05, ma luna o ke poʻo (%): 14, helu hoʻokuke kaumaha: 46, ke kāʻei ʻana i kēia manawa DataBlock (%): 16
kipaku ʻia (MB): 222, lākiō 0.04, ma luna o ke poʻo (%): 11, helu hoʻokuke kaumaha: 47, ke kāʻei ʻana i kēia manawa DataBlock (%): 16
kipaku ʻia (MB): 104, lākiō 0.03, ma luna o ke poʻo (%): -48, helu hoʻokuke kaumaha: 47, hoʻopaʻa ʻia i kēia manawa DataBlock (%): 21 < loaʻa ka interrupt
kipaku ʻia (MB): 684, lākiō 0.2, ma luna o ke poʻo (%): 242, helu hoʻokuke kaumaha: 48, ke kāʻei ʻana i kēia manawa DataBlock (%): 19
kipaku ʻia (MB): 570, lākiō 0.23, ma luna o ke poʻo (%): 185, helu hoʻokuke kaumaha: 49, ke kāʻei ʻana i kēia manawa DataBlock (%): 18
kipaku ʻia (MB): 342, lākiō 0.22, ma luna o ke poʻo (%): 71, helu hoʻokuke kaumaha: 50, ke kāʻei ʻana i kēia manawa DataBlock (%): 18
kipaku ʻia (MB): 228, lākiō 0.21, ma luna o ke poʻo (%): 14, helu hoʻokuke kaumaha: 51, ke kāʻei ʻana i kēia manawa DataBlock (%): 18
kipaku ʻia (MB): 228, lākiō 0.2, ma luna o ke poʻo (%): 14, helu hoʻokuke kaumaha: 52, ke kāʻei ʻana i kēia manawa DataBlock (%): 18
kipaku ʻia (MB): 228, lākiō 0.18, ma luna o ke poʻo (%): 14, helu hoʻokuke kaumaha: 53, ke kāʻei ʻana i kēia manawa DataBlock (%): 18
kipaku ʻia (MB): 228, lākiō 0.16, ma luna o ke poʻo (%): 14, helu hoʻokuke kaumaha: 54, ke kāʻei ʻana i kēia manawa DataBlock (%): 18
kipaku ʻia (MB): 228, lākiō 0.14, ma luna o ke poʻo (%): 14, helu hoʻokuke kaumaha: 55, ke kāʻei ʻana i kēia manawa DataBlock (%): 18
kipaku ʻia (MB): 112, lākiō 0.14, ma luna o ke poʻo (%): -44, helu hoʻokuke kaumaha: 55, hoʻopaʻa i kēia manawa DataBlock (%): 23 < puʻe hope.
kipaku ʻia (MB): 456, lākiō 0.26, ma luna o ke poʻo (%): 128, helu hoʻokuke kaumaha: 56, ke kāʻei ʻana i kēia manawa DataBlock (%): 22
kipaku ʻia (MB): 342, lākiō 0.31, ma luna o ke poʻo (%): 71, helu hoʻokuke kaumaha: 57, ke kāʻei ʻana i kēia manawa DataBlock (%): 22
kipaku ʻia (MB): 342, lākiō 0.33, ma luna o ke poʻo (%): 71, helu hoʻokuke kaumaha: 58, ke kāʻei ʻana i kēia manawa DataBlock (%): 22
kipaku ʻia (MB): 342, lākiō 0.33, ma luna o ke poʻo (%): 71, helu hoʻokuke kaumaha: 59, ke kāʻei ʻana i kēia manawa DataBlock (%): 22
kipaku ʻia (MB): 342, lākiō 0.33, ma luna o ke poʻo (%): 71, helu hoʻokuke kaumaha: 60, ke kāʻei ʻana i kēia manawa DataBlock (%): 22
kipaku ʻia (MB): 342, lākiō 0.33, ma luna o ke poʻo (%): 71, helu hoʻokuke kaumaha: 61, ke kāʻei ʻana i kēia manawa DataBlock (%): 22
kipaku ʻia (MB): 342, lākiō 0.33, ma luna o ke poʻo (%): 71, helu hoʻokuke kaumaha: 62, ke kāʻei ʻana i kēia manawa DataBlock (%): 22
kipaku ʻia (MB): 342, lākiō 0.33, ma luna o ke poʻo (%): 71, helu hoʻokuke kaumaha: 63, ke kāʻei ʻana i kēia manawa DataBlock (%): 22
kipaku ʻia (MB): 342, lākiō 0.32, ma luna o ke poʻo (%): 71, helu hoʻokuke kaumaha: 64, ke kāʻei ʻana i kēia manawa DataBlock (%): 22
kipaku ʻia (MB): 342, lākiō 0.33, ma luna o ke poʻo (%): 71, helu hoʻokuke kaumaha: 65, ke kāʻei ʻana i kēia manawa DataBlock (%): 22
kipaku ʻia (MB): 342, lākiō 0.33, ma luna o ke poʻo (%): 71, helu hoʻokuke kaumaha: 66, ke kāʻei ʻana i kēia manawa DataBlock (%): 22
kipaku ʻia (MB): 342, lākiō 0.32, ma luna o ke poʻo (%): 71, helu hoʻokuke kaumaha: 67, ke kāʻei ʻana i kēia manawa DataBlock (%): 22
kipaku ʻia (MB): 342, lākiō 0.33, ma luna o ke poʻo (%): 71, helu hoʻokuke kaumaha: 68, ke kāʻei ʻana i kēia manawa DataBlock (%): 22
kipaku ʻia (MB): 342, lākiō 0.32, ma luna o ke poʻo (%): 71, helu hoʻokuke kaumaha: 69, ke kāʻei ʻana i kēia manawa DataBlock (%): 22
kipaku ʻia (MB): 342, lākiō 0.32, ma luna o ke poʻo (%): 71, helu hoʻokuke kaumaha: 70, ke kāʻei ʻana i kēia manawa DataBlock (%): 22
kipaku ʻia (MB): 342, lākiō 0.33, ma luna o ke poʻo (%): 71, helu hoʻokuke kaumaha: 71, ke kāʻei ʻana i kēia manawa DataBlock (%): 22
kipaku ʻia (MB): 342, lākiō 0.33, ma luna o ke poʻo (%): 71, helu hoʻokuke kaumaha: 72, ke kāʻei ʻana i kēia manawa DataBlock (%): 22
kipaku ʻia (MB): 342, lākiō 0.33, ma luna o ke poʻo (%): 71, helu hoʻokuke kaumaha: 73, ke kāʻei ʻana i kēia manawa DataBlock (%): 22
kipaku ʻia (MB): 342, lākiō 0.33, ma luna o ke poʻo (%): 71, helu hoʻokuke kaumaha: 74, ke kāʻei ʻana i kēia manawa DataBlock (%): 22
kipaku ʻia (MB): 342, lākiō 0.33, ma luna o ke poʻo (%): 71, helu hoʻokuke kaumaha: 75, ke kāʻei ʻana i kēia manawa DataBlock (%): 22
kipaku ʻia (MB): 342, lākiō 0.33, ma luna o ke poʻo (%): 71, helu hoʻokuke kaumaha: 76, ke kāʻei ʻana i kēia manawa DataBlock (%): 22
kipaku ʻia (MB): 21, lākiō 0.33, ma luna o ke poʻo (%): -90, helu hoʻokuke kaumaha: 76, hoʻopaʻa ʻia i kēia manawa Paleka ʻikepili (%): 32
kipaku ʻia (MB): 0, lākiō 0.0, ma luna o ke poʻo (%): -100, helu hoʻokuke kaumaha: 0, hoʻopaʻa ʻia i kēia manawa Paleka ʻikepili (%): 100
kipaku ʻia (MB): 0, lākiō 0.0, ma luna o ke poʻo (%): -100, helu hoʻokuke kaumaha: 0, hoʻopaʻa ʻia i kēia manawa Paleka ʻikepili (%): 100

Pono nā scans e hōʻike i ke kaʻina hana like ma ke ʻano o ka pakuhi o ka pilina ma waena o ʻelua ʻāpana cache - hoʻokahi (kahi i noi ʻole ʻia ai nā poloka i noi ʻole ʻia ma mua) a me ka lehulehu (ʻo ka ʻikepili "noi" i hoʻokahi manawa i mālama ʻia ma ʻaneʻi):

Pehea e hoʻonui ai i ka wikiwiki heluhelu mai HBase a i 3 mau manawa a mai HDFS a i 5 mau manawa

A ʻo ka hope, he aha ke ʻano o ka hana ʻana o nā palena i ke ʻano o ka pakuhi. No ka hoʻohālikelike, ua hoʻopau loa ʻia ka cache i ka hoʻomaka ʻana, a laila ua hoʻokuʻu ʻia ʻo HBase me ka caching a me ka hoʻopaneʻe ʻana i ka hoʻomaka ʻana o ka hana optimization e 5 mau minuke (30 eviction cycles).

Hiki ke loaʻa ke code piha ma ka Pull Request HBASE 23887 ma github.

Eia naʻe, ʻaʻole hiki i ka 300 tausani heluhelu i kēlā me kēia kekona ke loaʻa i kēia hāmeʻa ma lalo o kēia mau kūlana. ʻO ka mea ʻoiaʻiʻo inā pono ʻoe e komo i ka ʻikepili ma o HDFS, ua hoʻohana ʻia ke ʻano ShortCircuitCache (ma hope aʻe i kapa ʻia ʻo SSC), e hiki ai iā ʻoe ke komo pololei i ka ʻikepili, e pale aku i nā pilina pūnaewele.

Ua hōʻike ʻia ʻo Profiling ʻoiai ʻoiai e hāʻawi ana kēia mīkini i ka waiwai nui, i kekahi manawa e lilo ia i bottleneck, no ka mea, ʻaneʻane nā hana koʻikoʻi a pau i loko o kahi laka, e alakaʻi ana i ka pale ʻana i ka hapa nui o ka manawa.

Pehea e hoʻonui ai i ka wikiwiki heluhelu mai HBase a i 3 mau manawa a mai HDFS a i 5 mau manawa

I ka ʻike ʻana i kēia, ua ʻike mākou hiki ke hoʻopau ʻia ka pilikia ma ka hana ʻana i kahi ʻano o nā SSC kūʻokoʻa:

private final ShortCircuitCache[] shortCircuitCache;
...
shortCircuitCache = new ShortCircuitCache[this.clientShortCircuitNum];
for (int i = 0; i < this.clientShortCircuitNum; i++)
  this.shortCircuitCache[i] = new ShortCircuitCache(…);

A laila e hana pū me lākou, me ka wehe ʻole ʻana i nā intersection ma ka helu offset hope loa:

public ShortCircuitCache getShortCircuitCache(long idx) {
    return shortCircuitCache[(int) (idx % clientShortCircuitNum)];
}

I kēia manawa hiki iā ʻoe ke hoʻomaka i ka hoʻāʻo. No ka hana ʻana i kēia, e heluhelu mākou i nā faila mai HDFS me kahi noi multi-threaded maʻalahi. E hoʻonoho i nā ʻāpana:

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

A heluhelu wale i nā faila:

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);
}

Hoʻokō ʻia kēia code ma nā ʻāpana ʻokoʻa a hoʻonui mākou i ka helu o nā faila heluhelu i ka manawa like (mai 10 a 200 - axis horizontal) a me ka helu o nā cache (mai 1 a 10 - kiʻi). Hōʻike ka axis vertical i ka wikiwiki i loaʻa mai ka hoʻonui ʻana i ka SSC pili i ka hihia inā hoʻokahi wale nō huna huna.

Pehea e hoʻonui ai i ka wikiwiki heluhelu mai HBase a i 3 mau manawa a mai HDFS a i 5 mau manawa

Pehea e heluhelu ai i ka pakuhi: ʻO ka manawa hoʻokō no 100 tausani heluhelu ma nā poloka 64 KB me hoʻokahi cache e pono ai 78 kekona. ʻOiai me 5 mau huna e lawe i 16 kekona. ʻO kēlā mau mea. aia ka wikiwiki o ~5 manawa. E like me ka mea i ʻike ʻia ma ka pakuhi, ʻaʻole i ʻike nui ʻia ka hopena no kahi helu liʻiliʻi o nā heluhelu like ʻole, hoʻomaka ia e pāʻani i kahi kuleana i ʻike ʻia ke ʻoi aku ma mua o 50 mau helu heluhelu. a ma luna aʻe e hāʻawi i ka hoʻonui nui o ka hana.

'Ōlelo Aʻo 1: no ka mea he ʻano liʻiliʻi nā hopena hōʻike (e ʻike i lalo), ua hoʻokō ʻia nā holo 3 a ua hoʻohālikelike ʻia nā kumu hopena.

Nānā 2: Ua like ka loaʻa ʻana o ka hana ma ka hoʻonohonoho ʻana i ke komo ʻole, ʻoiai ʻoi aku ka lohi o ke komo ʻana iho.

Eia naʻe, pono e wehewehe, ʻaʻole like me ka HBase, ʻaʻole manuahi kēia wikiwiki. Maanei mākou e "wehe" i ka mana o ka CPU e hana hou aku, ma kahi o ke kau ʻana i nā laka.

Pehea e hoʻonui ai i ka wikiwiki heluhelu mai HBase a i 3 mau manawa a mai HDFS a i 5 mau manawa

Maanei hiki iā ʻoe ke ʻike, ma ka laulā, ʻo ka hoʻonui ʻana i ka helu o nā cache e hāʻawi i kahi hoʻonui like o ka hoʻohana ʻana i ka CPU. Eia nō naʻe, ʻoi aku ka nui o nā hui lanakila.

Eia kekahi laʻana, e nānā pono kākou i ka hoʻonohonoho SSC = 3. ʻO ka piʻiʻana o ka hana ma ka laulā ma kahi o 3.3 manawa. Ma lalo iho nā hopena mai nā holo kaʻawale ʻekolu.

Pehea e hoʻonui ai i ka wikiwiki heluhelu mai HBase a i 3 mau manawa a mai HDFS a i 5 mau manawa

ʻOiai e piʻi ana ka hoʻohana CPU ma kahi o 2.8 mau manawa. ʻAʻole nui ka ʻokoʻa, akā ua hauʻoli ʻo Greta liʻiliʻi a loaʻa paha ka manawa e hele ai i ke kula a lawe i nā haʻawina.

No laila, he hopena maikaʻi kēia no kēlā me kēia hāmeʻa e hoʻohana ana i ke komo nui i ka HDFS (e like me Spark, a me nā mea ʻē aʻe), inā he māmā ke code noi (ʻo ia hoʻi, aia ka plug ma ka ʻaoʻao o ka mea kūʻai aku HDFS) a aia ka mana CPU manuahi. . No ka nānā ʻana, e hoʻāʻo kākou i ka hopena o ka hoʻohana ʻana o BlockCache optimization a me SSC tuning no ka heluhelu ʻana mai HBase.

Pehea e hoʻonui ai i ka wikiwiki heluhelu mai HBase a i 3 mau manawa a mai HDFS a i 5 mau manawa

Hiki ke ʻike ʻia ma lalo o ia mau kūlana ʻaʻole nui ka hopena e like me nā hoʻāʻo hoʻomaʻemaʻe (heluhelu me ka ʻole o ka hana ʻana), akā hiki ke ʻoki i kahi 80K hou ma aneʻi. ʻO ka hui pū ʻana, hāʻawi nā optimization ʻelua a hiki i ka 4x wikiwiki.

Ua hana pū ʻia kahi PR no kēia hoʻonui [HDFS-15202], i hoʻohui ʻia a loaʻa kēia hana i nā hoʻokuʻu e hiki mai ana.

A ʻo ka mea hope loa, he mea hoihoi ia e hoʻohālikelike i ka hana heluhelu ʻana o kahi waihona kolamu ākea like, Cassandra a me HBase.

No ka hana ʻana i kēia, ua hoʻomaka mākou i nā mea hoʻohana maʻamau YCSB hoʻāʻo hoʻāʻo ʻana mai ʻelua mau pūʻali (800 mau kaula i ka huina). Ma ka ʻaoʻao kikowaena - 4 mau manawa o RegionServer a me Cassandra ma 4 mau pūʻali (ʻaʻole nā ​​mea e holo ai nā mea kūʻai aku, e pale i kā lākou mana). Loaʻa nā heluhelu mai nā papa o ka nui:

HBase - 300 GB ma HDFS (100 GB ʻikepili maʻemaʻe)

Cassandra - 250 GB (helu hoʻopiʻi = 3)

ʻO kēlā mau. ua like ka nui o ka leo (ma HBase a ʻoi aku ka liʻiliʻi).

Nā ʻāpana HBase:

dfs.client.short.circuit.num = 5 (Ka hoʻonui ʻana i ka mea kūʻai aku HDFS)

hbase.lru.cache.heavy.eviction.count.limit = 30 - ʻo ia hoʻi, e hoʻomaka ka hana ʻana ma hope o 30 mau kipaku (~ 5 mau minuke)

hbase.lru.cache.heavy.eviction.mb.size.limit = 300 - ka nui o ka hoʻopaʻa ʻana a me ka hoʻokuke ʻana

Hoʻopili ʻia nā log YCSB a hōʻuluʻulu ʻia i nā kiʻi Excel:

Pehea e hoʻonui ai i ka wikiwiki heluhelu mai HBase a i 3 mau manawa a mai HDFS a i 5 mau manawa

E like me kāu e ʻike ai, hiki i kēia mau optimizations ke hoʻohālikelike i ka hana o kēia mau ʻikepili ma lalo o kēia mau kūlana a loaʻa iā 450 tausani heluhelu i kēlā me kēia kekona.

Lana ko mākou manaʻo e hiki ke hoʻohana i kēia ʻike i kekahi i ka wā o ka hakakā hoihoi no ka huahana.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka