Huli ma 1 TB/s ka māmā holo

TL; DR: ʻEhā mau makahiki i hala aku nei ua haʻalele wau iā Google me kahi manaʻo no kahi mea hana nānā kikowaena hou. ʻO ka manaʻo e hoʻohui i nā hana maʻamau i hoʻokahi lawelawe hōʻiliʻili a me ka loiloi log, ka hōʻiliʻili ana, makaʻala a me nā papa kuhikuhi. ʻO kekahi o nā loina, ʻo ia ka pono o ka lawelawe ʻana wikiwiki, e hāʻawi ana i nā devops me kahi ʻike maʻalahi, pili, ʻoluʻolu. Pono kēia i ka hoʻoponopono ʻana i nā pūʻulu ʻikepili multi-gigabyte i nā hapa o ke kekona ʻoiai e noho ana i loko o ka waihona kālā. He lohi a paʻakikī nā mea hana hoʻokele lāʻau e kū nei, no laila ua alo mākou i kahi paʻakikī maikaʻi: hoʻolālā akamai i kahi mea hana e hāʻawi i nā mea hoʻohana i kahi ʻike hou.

Hōʻike kēia ʻatikala pehea mākou ma Scalyr i hoʻoponopono ai i kēia pilikia ma o ka hoʻohana ʻana i nā ʻano kula kahiko, kahi hoʻokokoke ikaika, hoʻopau i nā papa pono ʻole a pale i nā hoʻolālā ʻikepili paʻakikī. Hiki iā ʻoe ke hoʻohana i kēia mau haʻawina i kāu mau pilikia ʻenehana.

Mana Kula Kahiko

Hoʻomaka maʻamau ka nānā ʻana i ka moʻolelo me kahi hulina: e ʻimi i nā memo āpau e pili ana i kekahi kumu. Ma Scalyr, he ʻumi a mau haneli mau gigabytes o nā lāʻau mai nā kikowaena he nui. ʻO nā ala hou, ma ke ʻano he lula, e pili ana i ke kūkulu ʻana i kekahi ʻano ʻikepili paʻakikī i hoʻopaʻa ʻia no ka ʻimi. Ua ʻike maoli au i kēia ma Google, kahi maikaʻi loa lākou i kēia ʻano mea. Akā ua hoʻoholo mākou i kahi ala ʻoi aku ka maikaʻi: ka nānā ʻana i nā lāʻau. A ua hana ia - hāʻawi mākou i kahi ʻimi hulina ʻoi aku ka wikiwiki o ka nui ma mua o kā mākou mau mea hoʻokūkū (e ʻike i ka animation ma ka hopena).

ʻO ka ʻike nui ʻo ia ka wikiwiki loa o nā kaʻina hana hou i nā hana maʻalahi a pololei. He mea maʻalahi kēia e nalo i nā ʻōnaehana paʻakikī, multi-layer e hilinaʻi nei i ka wikiwiki I/O a me nā hana pūnaewele, a ʻo ia mau ʻōnaehana maʻamau i kēia mau lā. No laila ua hoʻomohala mākou i kahi hoʻolālā e hōʻemi i nā papa a me nā ʻōpala keu. Me nā kaʻina hana he nui a me nā kikowaena i ka like, hiki i ka wikiwiki ʻimi i 1 TB i kēlā me kēia kekona.

Nā mea nui i lawe ʻia mai kēia ʻatikala:

  • ʻO ka ʻimi Brute-force kahi ala kūpono no ka hoʻoponopono ʻana i nā pilikia nui o ka honua maoli.
  • ʻO ka Brute force kahi ʻenehana hoʻolālā, ʻaʻole kahi hopena hana ʻole. E like me nā ʻenehana ʻē aʻe, ʻoi aku ka maikaʻi o kekahi mau pilikia ma mua o nā mea ʻē aʻe, a hiki ke hoʻokō maikaʻi ʻole a maikaʻi paha.
  • ʻOi aku ka maikaʻi o ka brute force no ka hoʻokō hale paʻa hoʻohua.
  • Pono ka hoʻohana maikaʻi ʻana i ka ikaika ʻoi aku ka maikaʻi o ka code a me ka hoʻohana ʻana i nā kumuwaiwai kūpono i ka manawa kūpono. He kūpono ia inā aia kāu mau kikowaena ma lalo o ke kaumaha o ka mea hoʻohana ʻole a noho mau ka hana mea hoʻohana i mea nui.
  • Hoʻokumu ka hana i ka hoʻolālā o ka ʻōnaehana holoʻokoʻa, ʻaʻole wale i ka algorithm loop loop.

(Ke wehewehe nei kēia ʻatikala i ka ʻimi ʻana i ka ʻikepili ma ka hoʻomanaʻo. I ka hapanui o nā hihia, ke hana ka mea hoʻohana i kahi huli lāʻau, ua hūnā nā kikowaena Scalyr. me nā kumuwaiwai helu nui).

ʻano hana ʻino

ʻO ka mea maʻamau, ʻimi ʻia kahi pūʻulu ʻikepili nui me ka hoʻohana ʻana i kahi huaʻōlelo huaʻōlelo. Ke hoʻohana ʻia i nā log server, ʻo ia ka ʻimi ʻana i kēlā me kēia huaʻōlelo kūʻokoʻa i loko o ka log. No kēlā me kēia hua'ōlelo, ponoʻoe e hana i kahi papa inoa o nā hoʻokomo a pau. He mea maʻalahi kēia i ka loaʻa ʻana o nā memo āpau me kēia huaʻōlelo, no ka laʻana, 'hewa', 'firefox' a i ʻole "transaction_16851951" - e nānā wale i ka index.

Ua hoʻohana au i kēia ala ma Google a ua hana maikaʻi. Akā ma Scalyr ke ʻimi nei mākou i nā logs byte byte.

No ke aha mai? Mai kahi manaʻo algorithmic abstract, ʻoi aku ka maikaʻi o nā huaʻōlelo huaʻōlelo ma mua o ka huli ikaika. Eia naʻe, ʻaʻole mākou e kūʻai aku i nā algorithms, kūʻai mākou i ka hana. A ʻo ka hana ʻaʻole wale e pili ana i nā algorithms, akā pili pū kekahi i ka ʻenehana ʻōnaehana. Pono mākou e noʻonoʻo i nā mea a pau: ka nui o ka ʻikepili, ke ʻano o ka huli ʻana, ka lako lako a me ka pōʻaiapili polokalamu. Ua hoʻoholo mākou no kā mākou pilikia kūikawā, ʻoi aku ka maikaʻi o kahi mea e like me 'grep' ma mua o kahi index.

He maikaʻi nā indexes, akā he mau palena. Hoʻokahi huaʻōlelo maʻalahi ke loaʻa. Akā ʻoi aku ka paʻakikī o ka ʻimi ʻana i nā memo me nā huaʻōlelo he nui, e like me 'googlebot' a me '404'. ʻO ka ʻimi ʻana i kahi huaʻōlelo e like me ka 'ʻokoʻa ʻole i hopu ʻia' e koi i kahi papa kuhikuhi paʻakikī e hoʻopaʻa i nā memo āpau me kēlā huaʻōlelo, akā i kahi kikoʻī o ka huaʻōlelo.

Hiki mai ka pilikia maoli ke ʻimi ʻole ʻoe i nā huaʻōlelo. E ʻōlelo mākou makemake ʻoe e ʻike i ka nui o ke kaʻa mai nā bots. ʻO ka manaʻo mua e ʻimi i nā lāʻau no ka huaʻōlelo 'bot'. Penei ʻoe e ʻike ai i kekahi mau bots: Googlebot, Bingbot a me nā mea ʻē aʻe he nui. Akā ma ʻaneʻi ʻaʻole he huaʻōlelo ka 'bot', akā he ʻāpana o ia mea. Inā ʻimi mākou i ka 'bot' ma ka papa kuhikuhi, ʻaʻole mākou e ʻike i nā pou me ka huaʻōlelo 'Googlebot'. Inā nānā ʻoe i kēlā me kēia huaʻōlelo i loko o ka papa kuhikuhi a laila e nānā i ka ʻōlelo kuhikuhi no nā huaʻōlelo i loaʻa, e lohi nui ka huli ʻana. ʻO ka hopena, ʻaʻole ʻae kekahi mau polokalamu log i ka ʻimi ʻōlelo hapa a i ʻole (ma ka maikaʻi) e ʻae i ka syntax kūikawā me ka hana haʻahaʻa. Makemake mākou e pale i kēia.

ʻO kahi pilikia ʻē aʻe ʻo ia ka hōʻailona. Makemake ʻoe e ʻimi i nā noi a pau mai 50.168.29.7? Pehea e pili ana i ka debugging log i loaʻa [error]? Hoʻokuʻu pinepine nā mea kākau inoa i nā kaha kikoʻī.

ʻO ka hope, makemake nā ʻenekinia i nā mea hana ikaika, a i kekahi manawa hiki ke hoʻoponopono ʻia kahi pilikia me ka ʻōlelo maʻamau. ʻAʻole kūpono ka huaʻōlelo huaʻōlelo no kēia.

Eia kekahi, nā kuhikuhi paʻakikī. Pono e hoʻohui ʻia kēlā me kēia memo i nā papa inoa huaʻōlelo. Pono e mālama ʻia kēia mau papa inoa ma kahi ʻano maʻalahi hiki ke huli i nā manawa a pau. Pono e unuhi ʻia nā nīnau me nā māmalaʻōlelo, nā ʻāpana huaʻōlelo, a i ʻole nā ​​ʻōlelo maʻamau i loko o nā hana papa inoa nui, a nānā ʻia nā hopena a hui pū ʻia e hana i kahi hoʻonohonoho hopena. I loko o ka pōʻaiapili o kahi lawelawe nui, multi-tenant, hana kēia paʻakikī i nā pilikia hana i ʻike ʻole ʻia i ka wā e nānā ana i nā algorithms.

Lawe ʻia ka nui o ka nui o nā huaʻōlelo huaʻōlelo, a ʻo ka mālama ʻana he kumu kūʻai nui ia ma kahi ʻōnaehana hoʻokele lāʻau.

Ma kekahi ʻaoʻao, hiki i kēlā me kēia hulina ke hoʻopau i ka mana helu. Mahalo ko mākou poʻe hoʻohana i nā hulina kiʻekiʻe no nā nīnau kūʻokoʻa, akā ʻaʻole hiki ke hana ʻia kēlā mau nīnau. No nā nīnau huli maʻamau, no ka laʻana, no ka dashboard, hoʻohana mākou i nā ʻenehana kūikawā (e wehewehe mākou iā lākou ma ka ʻatikala aʻe). ʻAʻole pinepine nā noi ʻē aʻe a ʻaʻole hiki iā ʻoe ke hana ʻoi aku ma mua o hoʻokahi i ka manawa. Akā ʻaʻole kēia manaʻo ʻaʻole paʻa kā mākou mau kikowaena: paʻa lākou i ka hana o ka loaʻa ʻana, ka nānā ʻana a me ka hoʻopaʻa ʻana i nā leka hou, ka loiloi ʻana i nā mākaʻikaʻi, ke kaomi ʻana i ka ʻikepili kahiko, a pēlā aku. No laila, loaʻa iā mākou kahi lako o nā kaʻina hana hiki ke hoʻohana ʻia e hoʻokō i nā nīnau.

Hoʻohana ka Brute Force inā loaʻa iā ʻoe kahi pilikia koʻikoʻi (a me ka ikaika nui)

Hana maikaʻi ka Brute force i nā pilikia maʻalahi me nā puka lou liʻiliʻi. I ka manawa pinepine hiki iā ʻoe ke hoʻopaneʻe i ka loop loop e holo i nā wikiwiki kiʻekiʻe loa. Inā paʻakikī ke code, ʻoi aku ka paʻakikī o ka hoʻoponopono ʻana.

Loaʻa i kā mākou code hulina kahi puka i loko. Mālama mākou i nā memo ma nā ʻaoʻao ma 4K; Aia i kēlā me kēia ʻaoʻao kekahi mau memo (ma UTF-8) a me ka metadata no kēlā me kēia memo. ʻO ka metadata kahi ʻano e hoʻopili ai i ka lōʻihi o ka waiwai, ID memo kūloko, a me nā kahua ʻē aʻe. Ua like ke ano o ka huli ana.

Huli ma 1 TB/s ka māmā holo

He mana maʻalahi kēia o ke code maoli. Akā ma ʻaneʻi, ʻike ʻia nā mea hoʻokomo he nui, nā kope ʻikepili, a me nā kelepona hana. Maikaʻi ka JVM i ka hoʻonui ʻana i nā kelepona hana a me ka hoʻokaʻawale ʻana i nā mea ephemeral, no laila ʻoi aku ka maikaʻi o kēia code ma mua o kā mākou pono. I ka wā hoʻāʻo, hoʻohana maikaʻi nā mea kūʻai aku. Akā, ma hope ua lawe mākou i ka pae aʻe.

(E nīnau paha ʻoe no ke aha mākou e mālama ai i nā memo ma kēia ʻano me nā ʻaoʻao 4K, kikokikona a me nā metadata, ma mua o ka hana ʻana me nā lāʻau pololei. Pūnaehana waihona. Hoʻohui pinepine ʻia ka huli kikokikona me nā kānana ʻano DBMS ma nā ʻaoʻao ma hope o ka pau ʻana o ka lāʻau.

I ka wā mua, ʻike ʻia ʻaʻole kūpono kēlā code no ka hoʻonui ʻana i ka ikaika. "Ka hana maoli" ma String.indexOf() ʻaʻole i hoʻomalu i ka ʻaoʻao CPU. ʻO ia hoʻi, ʻo ka hoʻonui ʻana i kēia ʻano hana wale nō ʻaʻole ia e lawe i kahi hopena koʻikoʻi.

E mālama mākou i nā metadata ma ka hoʻomaka o kēlā me kēia ʻaoʻao, a paʻa ka kikokikona o nā memo āpau ma UTF-8 ma kekahi ʻaoʻao. I ka hoʻohana ʻana i kēia, kākau hou mākou i ka loop e huli i ka ʻaoʻao holoʻokoʻa i ka manawa hoʻokahi:

Huli ma 1 TB/s ka māmā holo

Hana pololei kēia mana ma ka ʻike raw byte[] a huli i nā memo a pau ma ka ʻaoʻao 4K holoʻokoʻa.

ʻOi aku ka maʻalahi o kēia no ka hana brute force. Kāhea ʻia ka loop hulina kūloko no ka ʻaoʻao 4K holoʻokoʻa, ma mua o ka hoʻokaʻawale ʻana i kēlā me kēia pou. ʻAʻohe kope o ka ʻikepili, ʻaʻohe hoʻokaʻawale o nā mea. A ʻoi aku ka paʻakikī o nā hana metadata i kapa ʻia inā maikaʻi ka hopena, ʻaʻole ma kēlā me kēia memo. ʻO kēia ala mākou i hoʻopau ai i hoʻokahi tona o ke poʻo, a ʻo ke koena o ka ukana i hoʻopaʻa ʻia i loko o kahi loop hulina liʻiliʻi i loko, i kūpono no ka hoʻonui hou ʻana.

Hoʻokumu ʻia kā mākou hulina hulina algorithm manaʻo nui o Leonid Volnitsky. Ua like ia me ka Boyer-Moore algorithm, e lele ana ma kahi o ka lōʻihi o ke kaula huli i kēlā me kēia ʻanuʻu. ʻO ka ʻokoʻa nui, ʻo ia ka nānā ʻana i ʻelua bytes i ka manawa e hōʻemi i nā pāʻani wahaheʻe.

Pono kā mākou hoʻokō ʻana i kahi papa ʻimi 64K no kēlā me kēia hulina, akā ʻaʻohe mea e hoʻohālikelike ʻia i nā gigabytes o ka ʻikepili a mākou e ʻimi nei. Hoʻoponopono ka loop loop i nā gigabytes i kēlā me kēia kekona ma ke kumu hoʻokahi. I ka hoʻomaʻamaʻa, ʻo ka hana paʻa ma kahi o 1,25 GB i kēlā me kēia kekona ma kēlā me kēia kumu, a aia kahi lumi no ka hoʻomaikaʻi ʻana. Hiki ke hoʻopau i kekahi o ke poʻo ma waho o ka loop loop, a manaʻo mākou e hoʻokolohua me kahi loop i loko ma C ma kahi o Java.

Hoʻohana mākou i ka ikaika

Ua kūkākūkā mākou e hiki ke hoʻokō ʻia ka ʻimi ʻana i ka lāʻau "ma ke ʻano", akā pehea ka "mana" i loaʻa iā mākou? Nui loa.

1 kumu: Ke hoʻohana pololei ʻia, ʻoi aku ka ikaika o kahi kumu hoʻokahi o kahi kaʻina hana hou i kona pono ponoʻī.

8 cores: Ke holo nei mākou ma Amazon hi1.4xlarge a me i2.4xlarge SSD servers, kēlā me kēia me 8 cores (16 threads). E like me ka mea i ʻōlelo ʻia ma luna, paʻa pinepine kēia mau cores me nā hana hope. Ke hana ka mea hoʻohana i kahi hulina, hoʻokuʻu ʻia nā hana hope, e hoʻokuʻu ana i nā cores 8 āpau no ka ʻimi. Hoʻopau maʻamau ka huli ʻana i kekona ʻāpana, a laila hoʻomaka hou ka hana hope (ʻo ka polokalamu throttling e hōʻoia ʻaʻole e keʻakeʻa ka pahu o nā nīnau hulina i nā hana koʻikoʻi koʻikoʻi).

16 cores: no ka hilinaʻi, hoʻonohonoho mākou i nā kikowaena i nā pūʻulu haku/kauā. Loaʻa i kēlā me kēia haku hoʻokahi SSD a hoʻokahi kikowaena EBS ma lalo o kāna kauoha. Inā hāʻule ka server nui, lawe koke ka SSD server i kona wahi. Kokoke i nā manawa a pau, hana maikaʻi ka haku a me ke kauā, i hiki ke ʻimi ʻia kēlā me kēia poloka ʻikepili ma nā kikowaena ʻokoʻa ʻelua (ʻo ka EBS kauā kauā he palupalu nāwaliwali, no laila ʻaʻole mākou e noʻonoʻo iā ia). Māhele mākou i ka hana ma waena o lākou, i loaʻa iā mākou he 16 cores i loaʻa.

Nui nā cores: I ka wā e hiki mai ana, e puʻunaue mākou i ka ʻikepili ma waena o nā kikowaena ma ke ʻano e komo ai lākou a pau i ka hana ʻana i kēlā me kēia noi mea ʻole. E hana ana kēlā me kēia kumu. [E hoʻomaopopo: ua hoʻokō mākou i ka hoʻolālā a hoʻonui i ka wikiwiki o ka huli ʻana i 1 TB/s, e ʻike i ka leka ma ka hope o ka ʻatikala].

Mālama ka maʻalahi i ka hilinaʻi

ʻO kekahi pōmaikaʻi ʻē aʻe o ke ʻano brute force ʻo ia ka hana kūlike. ʻO ka mea maʻamau, ʻaʻole maʻalahi ka huli ʻana i nā kikoʻī o ka pilikia a me ka hoʻonohonoho ʻikepili (manaʻo wau ʻo ia ke kumu i kapa ʻia ai ʻo "coarse").

Hoʻopuka ka huaʻōlelo huaʻōlelo i nā hopena wikiwiki loa, a i kekahi manawa ʻaʻole. E ʻōlelo mākou he 50 GB o nā lāʻau i ʻike ʻia ka huaʻōlelo 'customer_5987235982' ʻekolu mau manawa. ʻO ka huli ʻana no kēia huaʻōlelo e helu pono i ʻekolu mau wahi mai ka papa kuhikuhi a hoʻopau koke. Akā hiki i nā hulina wildcard paʻakikī ke nānā i nā kaukani huaʻōlelo a lōʻihi ka manawa.

Ma ka ʻaoʻao ʻē aʻe, ʻoi aku ka nui a i ʻole ka liʻiliʻi o ka huli ʻana i ka ikaika like no kekahi nīnau. ʻOi aku ka maikaʻi o ka ʻimi ʻana i nā huaʻōlelo lōʻihi, akā ʻoi aku ka wikiwiki o ka ʻimi ʻana i hoʻokahi huaʻōlelo.

ʻO ka maʻalahi o ke ʻano hana brute force ʻo ia ka mea kokoke i kāna hana i kona kiʻekiʻe theoretical. He liʻiliʻi nā koho no ka hoʻonui ʻana i ka disk i manaʻo ʻole ʻia, hoʻopaʻapaʻa paʻa, alualu kuhikuhi, a me nā kaukani kumu ʻē aʻe o ka hāʻule. Ua nānā wale au i nā noi i hana ʻia e nā mea hoʻohana ʻo Scalyr i ka pule i hala ma kā mākou kikowaena paʻa loa. He 14 mau noi. ʻOi aku ka ʻewalu o lākou i hoʻokahi kekona; 000% hoʻopau i loko o 99 milliseconds (inā ʻaʻole ʻoe i hoʻohana i nā mea hana loiloi log, hilinaʻi iaʻu: he wikiwiki).

He mea nui ka hana kūpaʻa a hilinaʻi no ka maʻalahi o ka hoʻohana ʻana i ka lawelawe. Inā lohi ia i kēlā me kēia manawa, e ʻike nā mea hoʻohana he mea hilinaʻi ʻole a makemake ʻole e hoʻohana.

E hoʻopaʻa inoa ma ka hana

Eia kahi wikiō pōkole e hōʻike ana iā Scalyr i ka hana. Loaʻa iā mākou kahi moʻokāki demo kahi e lawe ai mākou i kēlā me kēia hanana i kēlā me kēia waihona Github lehulehu. Ma kēia demo, nānā au i ka waiwai o ka ʻikepili o hoʻokahi pule: ma kahi o 600 MB o nā lāʻau maka.

Ua hoʻopaʻa ola ʻia ka wikiō, me ka ʻole o ka hoʻomākaukau kūikawā, ma kaʻu pākaukau (ma kahi o 5000 mau kilomita mai ke kikowaena). ʻO ka hana āu e ʻike ai ma muli o ka nui hoʻopololei i nā mea kūʻai pūnaewele, a me kahi hope wikiwiki a hilinaʻi. I kēlā me kēia manawa he hoʻomaha ʻole me ka hōʻailona 'hoʻouka', ʻo wau ke hoʻomaha nei i hiki iā ʻoe ke heluhelu i kaʻu e paʻi nei.

Huli ma 1 TB/s ka māmā holo

I ka hopena

I ka hoʻoili ʻana i ka nui o ka ʻikepili, he mea nui e koho i kahi algorithm maikaʻi, akā ʻo "maikaʻi" ʻaʻole ia he "manaʻo." E noʻonoʻo pehea e hana ai kāu code i ka hana. ʻO ka loiloi ʻana o nā algorithms e waiho i kekahi mau mea i hiki ke lilo i mea nui i ka honua maoli. ʻOi aku ka maʻalahi o nā algorithms maʻalahi a paʻa i nā kūlana lihi.

E noʻonoʻo pū i ka pōʻaiapili kahi e hoʻokō ʻia ai ke code. I kā mākou hihia, pono mākou i nā kikowaena ikaika e hoʻokele i nā hana hope. Hoʻomaka pinepine nā mea hoʻohana i nā huli, no laila hiki iā mākou ke hōʻaiʻē i kahi hui holoʻokoʻa o nā kikowaena no ka manawa pōkole e pono ai e hoʻopau i kēlā me kēia hulina.

Ke hoʻohana nei i ke ʻano hana ʻino, ua hoʻokō mākou i kahi huli wikiwiki, hilinaʻi, maʻalahi ma waena o kahi pūʻulu o nā lāʻau. Manaʻo mākou he mea pono kēia mau manaʻo no kāu mau papahana.

Hoʻoponopono: Ua hoʻololi ʻia ke poʻo inoa a me ka kikokikona mai "Huli ma 20 GB i kēlā me kēia kekona" i "Huli ma 1 TB i kēlā me kēia kekona" e hōʻike i ka piʻi ʻana o ka hana i nā makahiki i hala. ʻO kēia piʻi ʻana o ka wikiwiki ma muli o ka hoʻololi ʻana i ke ʻano a me ka helu o nā kikowaena EC2 a mākou e kau nei i kēia lā e lawelawe i kā mākou waihona mea kūʻai. Aia nā hoʻololi e hiki koke mai ana e hāʻawi i kahi hoʻoikaika nui i ka hoʻokō hana, a ʻaʻole hiki iā mākou ke kali e kaʻana like iā lākou.

Source: www.habr.com

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