ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

Loaʻa i nā kikowaena ʻikepili hou he mau haneli o nā mea hana i uhi ʻia e nā ʻano nānā like ʻole. Akā ʻo kahi ʻenekinia maikaʻi loa me ka nānā pono ʻana i ka lima e hiki ke pane pololei i kahi hemahema pūnaewele i loko o nā minuke wale nō. I loko o kahi hōʻike ma ka ʻaha kūkā ʻo Next Hop 2020, ua hōʻike wau i kahi ʻano hoʻolālā hoʻolālā kikowaena data i loaʻa kahi hiʻohiʻona kūʻokoʻa - hoʻōla ke kikowaena data iā ia iho i milliseconds. ʻOi aku ka pololei, hoʻoponopono ka ʻenekinia i ka pilikia, ʻoiai ʻaʻole ʻike nā lawelawe.

- I ka hoʻomaka ʻana, e hāʻawi wau i kahi wehewehe kikoʻī no ka poʻe, ʻaʻole paha i ʻike i ke ʻano o kahi DC hou.
ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

No nā ʻenekini pūnaewele he nui, hoʻomaka ka ʻoihana kikowaena data, ʻoiaʻiʻo, me ToR, me kahi hoʻololi i ka pā. Loaʻa i ʻelua ʻano loulou ka ToR. Hele nā ​​keiki liʻiliʻi i nā kikowaena, ʻo nā mea ʻē aʻe - ʻoi aku ka nui o N mau manawa o lākou - hele i nā spines pae mua, ʻo ia hoʻi, i kona uplinks. Hoʻohālikelike ʻia nā uplinks, a ua kaulike ʻia nā kaʻa ma waena o nā uplink ma muli o ka hash 5-tuple, e komo pū ana me proto, src_ip, dst_ip, src_port, dst_port. ʻAʻohe mea kupanaha ma ʻaneʻi.
ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

A laila, pehea ke ʻano o ka hoʻolālā ʻana o nā mokulele? ʻAʻole pili nā spines o ka pae mua i kekahi i kekahi, akā pili ʻia e nā superspins. ʻO ka leka X ke kuleana no nā superspins, ua aneane like ia me ka hoʻopili kea.
ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

A maopopo ia, ma kekahi ʻaoʻao, pili ka tori i nā spines a pau o ka pae mua. He aha ka mea nui ma kēia kiʻi? Inā loaʻa iā mākou ke kamaʻilio i loko o ka pā, a laila hele ka pilina, ʻoiaʻiʻo, ma o ToR. Inā hele ka pilina i loko o ka module, a laila hele ka pilina ma nā spines o ka pae mua. Inā intermodular ka pilina - e like me kēia, ToR 1 a me ToR 2 - a laila e hele ka pilina ma waena o nā spines o nā pae mua a me ka lua.
ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

ʻO ka manaʻo, hiki ke hoʻonui ʻia kēlā ʻano hoʻolālā. Inā loaʻa iā mākou ka mana awa, kahi mālama o ka lewa ma ke kikowaena data a me kahi fiber i kau mua ʻia, a laila hiki ke hoʻonui mau ʻia ka helu o nā mokulele, a laila e hoʻonui ai i ka mana holoʻokoʻa o ka ʻōnaehana. Ma ka pepa, maʻalahi loa kēia hana. Pēlā nō ia i ke ola maoli. Akā ʻaʻole pili ka moʻolelo o kēia lā.
ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

Makemake au e huki ʻia nā hopena kūpono. Nui nā ala i loko o ke kikowaena ʻikepili. He kūlana kūʻokoʻa lākou. Hoʻokahi ala i loko o ke kikowaena ʻikepili hiki ke hiki i loko o ToR wale nō. I loko o ka module, loaʻa iā mākou ka nui o nā ala me ka helu o nā mokulele. ʻO ka helu o nā ala ma waena o nā modula ua like ia me ka hua o ka helu o nā mokulele a me ka helu o nā superspins i kēlā me kēia mokulele. I mea e maopopo ai, e ʻike i ka pālākiō, e hāʻawi wau i nā helu i kūpono no kekahi o nā kikowaena data Yandex.
ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

ʻEwalu mokulele, ʻo kēlā me kēia mokulele he 32 superspins. ʻO ka hopena, ua ʻike ʻia he ʻewalu ala i loko o ka module, a me ka launa pū ʻana ma waena o ka module aia he 256 o lākou.

ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

ʻO ia hoʻi, inā mākou e hoʻomohala nei i kahi Cookbook, e hoʻāʻo nei e aʻo pehea e kūkulu ai i nā kikowaena data hoʻomanawanui hewa e hoʻōla iā lākou iho, a laila ʻo ka hoʻolālā planar ke koho kūpono. Hāʻawi ia iā ʻoe e hoʻoponopono i ka pilikia scaling, a ma ke ʻano he maʻalahi. Nui nā ala kūʻokoʻa. Ke waiho nei ka nīnau: pehea e ola ai kēlā ʻano hoʻolālā i nā hemahema? Aia nā hāʻule like ʻole. A e kūkākūkā kākou i kēia manawa.
ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

E maʻi kekahi o kā mākou superspins. Ma ʻaneʻi ua hoʻi au i ka hoʻolālā ʻana o nā mokulele ʻelua. E hoʻomau mākou me lākou ma ke ʻano he laʻana no ka mea e maʻalahi ke ʻike i nā mea e hana nei me ka liʻiliʻi o nā ʻāpana neʻe. E mai X11. Pehea e pili ai kēia i nā lawelawe e noho nei i loko o nā kikowaena ʻikepili? Pili ka nui i ke ʻano o ka hāʻule ʻana.
ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

Inā maikaʻi ka maikaʻi ʻole, hopu ʻia ia ma ke kiʻekiʻe o ka automation o ka BFD hoʻokahi, hoʻokomo hauʻoli ka automation i nā hui pilikia a hoʻokaʻawale i ka pilikia, a laila maikaʻi nā mea āpau. He nui ko mākou ala, hoʻohuli koke ʻia ke ala i nā ala ʻē aʻe, a ʻaʻole ʻike nā lawelawe i kekahi mea. He kūlana maikaʻi kēia.
ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

ʻO kahi hiʻohiʻona maikaʻi inā loaʻa iā mākou nā poho mau, a ʻaʻole ʻike ka automation i ka pilikia. No ka hoʻomaopopo ʻana i ka pili ʻana o kēia i ka noi, pono mākou e hoʻolilo i kahi manawa e kūkākūkā ai pehea e hana ai ka protocol TCP.
ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

Manaʻo wau ʻaʻole wau e hoʻopūhoihoi i kekahi me kēia ʻike: ʻo TCP kahi protocol lulu lima. ʻO ia hoʻi, ma ka hihia maʻalahi, hoʻouna ka mea hoʻouna i ʻelua mau ʻeke, a loaʻa iā lākou kahi ack kumulative: "Ua loaʻa iaʻu nā ʻeke ʻelua."
ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

Ma hope o kēlā, e hoʻouna hou ʻo ia i ʻelua mau ʻeke, a e hoʻi hou ke kūlana. Ke kala aku nei au ma mua no ka maʻalahi. Ua pololei kēia hiʻohiʻona inā ʻelua ka puka makani (ka helu o nā ʻeke e lele ana). ʻOiaʻiʻo, ʻaʻole pono kēia ma ka laulā. Akā ʻaʻole pili ka pōʻaiapili hoʻouna i ka nui o ka puka makani.
ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

He aha ka hopena inā nalowale ka pūʻolo 3? I kēia hihia, e loaʻa i ka mea loaʻa nā packet 1, 2 a me 4. A e haʻi pololei ʻo ia i ka mea hoʻouna me ka hoʻohana ʻana i ke koho SACK: "Ua ʻike ʻoe, ʻekolu i hele mai, akā ua nalowale ka waena." 'Ōleloʻo ia "Ack 2, SACK 4".
ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

ʻO ka mea hoʻouna i kēia manawa ke haʻi pololei i ka ʻeke i nalowale me ka pilikia ʻole.
ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

Akā inā nalowale ka ʻeke hope loa ma ka puka makani, ʻokoʻa loa ke kūlana.

Loaʻa i ka mea loaʻa nā ʻeke mua ʻekolu a hoʻomaka mua e kali. Mahalo i kekahi mau optimizations ma ka Linux kernel TCP stack, e kali ia no kahi paʻi paʻa, ke ʻole he hōʻike kikoʻī i nā hae ʻo ia ka ʻeke hope a i ʻole kekahi mea like. E kali a hiki i ka pau ʻana o ka manawa hoʻopaneʻe ACK a laila e hoʻouna i kahi hōʻoia no nā ʻeke mua ʻekolu. Akā i kēia manawa e kali ana ka mea hoʻouna. ʻAʻole ʻo ia i ʻike inā ua nalowale ka hā a i ʻole e hiki mai ana. A i ʻole e hoʻonui i ka pūnaewele, e hoʻāʻo ʻo ia e kali no ka hōʻike maopopo ʻana ua nalowale ka ʻeke, a i ʻole ka pau ʻana o ka manawa RTO.
ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

He aha ka RTO timeout? ʻO kēia ka palena kiʻekiʻe mai ka RTT i helu ʻia e ka TCP stack a me kekahi mau mea mau. He aha kēia mau, e kūkākūkā kākou i kēia manawa.
ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

Akā, he mea nui inā pōʻino hou mākou a nalowale ka ʻeke ʻehā, a laila pālua ka RTO. ʻO ia hoʻi, ʻo kēlā me kēia hoʻāʻo kūleʻa he pālua ia o ka manawa.
ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

I kēia manawa e ʻike kākou i ke ʻano o kēia waihona. Ma ka maʻamau, ʻo ka liʻiliʻi loa RTO he 200ms. ʻO kēia ka liʻiliʻi loa o ka RTO no nā ʻeke ʻikepili. No nā ʻeke SYN, ʻokoʻa ia, 1 kekona. E like me kāu e ʻike ai, ʻo ka hoʻāʻo mua e hoʻouna hou i nā ʻeke e lawe i 100 mau manawa lōʻihi ma mua o RTT i loko o ke kikowaena data.
ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

I kēia manawa e hoʻi i kā mākou hiʻohiʻona. He aha ka hana me ka lawelawe? Hoʻomaka ka lawelawe e nalowale i nā ʻeke. Laki mua ka lawelawe a nalowale kekahi mea i waenakonu o ka puka makani, a laila loaʻa iā ia kahi SACK, hoʻouna hou i nā ʻeke nalowale.
ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

Akā inā hoʻi hou ka pōʻino, a laila loaʻa iā mākou kahi RTO. He aha ka mea nui ma ʻaneʻi? ʻAe, loaʻa iā mākou nā ala he nui i ka pūnaewele. Akā, e hoʻomau ka hele ʻana o ke kaʻa TCP o kahi pilina TCP ma o ka puʻu haki like. ʻO ka poho o ka packet, inā ʻaʻole i hele wale kā mākou X11 kilokilo, ʻaʻole ia e alakaʻi i ke kahe ʻana i nā wahi pilikia ʻole. Ke hoʻāʻo nei mākou e hāʻawi i kahi ʻeke ma o ka puʻu haki like. Ke alakaʻi nei kēia i kahi hemahema: ʻo kahi kikowaena data he pūʻulu o nā noi pili, a hoʻomaka kekahi o nā pilina TCP o kēia mau noi āpau e hoʻohaʻahaʻa - no ka mea, pili ka superspin i nā noi āpau i loko o ka DC. E like me ka ʻōlelo ʻana: inā ʻaʻole ʻoe e kāmaʻa i ka lio, līlū ka lio; ka lio - ʻaʻole i haʻi ʻia ka hōʻike; ʻaʻole i hāʻawi ʻia ka ʻōlelo - nalo lākou i ke kaua. Ma ʻaneʻi wale nō ka helu ʻana no nā kekona mai ka manawa i hiki mai ai ka pilikia a hiki i ka pae o ka hoʻohaʻahaʻa e hoʻomaka ai nā lawelawe. ʻO ia hoʻi, ʻaʻole loaʻa nā mea hoʻohana i kekahi mea ma kahi.
ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

ʻElua mau hāʻina maʻamau e hoʻokō kekahi i kekahi. ʻO ka mea mua, ʻo ia nā lawelawe e hoʻāʻo nei e waiho i nā mauʻu a hoʻoponopono i ka pilikia e like me kēia: “E hoʻololi kāua i kekahi mea ma ka waihona TCP. A e hana kākou i nā manawa hoʻopaneʻe pae noiʻi a i ʻole nā ​​kau TCP lōʻihi me nā nānā olakino kūloko. ʻO ka pilikia, ʻo ia ʻano hoʻonā: a) ʻaʻole paʻakikī loa; b) hoʻāʻo maikaʻi ʻole ʻia. ʻO ia hoʻi, inā paha e hoʻonohonoho pono ka lawelawe i ka TCP stack i lilo ia i ʻoi aku ka maikaʻi, ʻo ka mea mua, ʻaʻole pili kēia i nā noi āpau a me nā kikowaena data āpau, a ʻo ka lua, ʻoi loa, ʻaʻole ia e hoʻomaopopo i ka mea i hana ʻia a me ka mea. ʻaʻole. ʻO ia hoʻi, hana ia, akā maikaʻi ʻole ka hana ʻana a ʻaʻole paona. A inā he pilikia pūnaewele, ʻo wai ka hewa? ʻOiaʻiʻo NOC. He aha ka hana a NOC?

ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

Manaʻo nā lawelawe he nui ma NOC, e like me kēia ka hana. Akā ʻo ka ʻoiaʻiʻo, ʻaʻole wale.
ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

ʻO ka NOC i ka papahana maʻamau ke komo nei i ka hoʻomohala ʻana i nā mākaʻikaʻi he nui. ʻO kēia ka nānā ʻana i ka pahu ʻeleʻele a me ka nānā pahu keʻokeʻo. E pili ana i ka laʻana o ka pahu ʻeleʻele-ka nānā ʻana i nā spines hai aku ʻO Alexander Klimenko ma ka hope Next Hop. Ma ke ala, hana kēia nānā. Akā ʻo ka nānā pono ʻana e loaʻa ka manawa lag. ʻO ka maʻamau he mau minuke. Ma hope o ka hana ʻana, pono i ka poʻe ʻenekinia e hana i ka manawa e nānā pālua i kāna hana, hoʻokaʻawale i ka pilikia, a laila hoʻopau i ka wahi pilikia. ʻO ia hoʻi, ma ka hihia maikaʻi loa, ʻo ka mālama ʻana i ka pilikia e lawe i 5 mau minuke, ma kahi o 20 mau minuke, inā ʻaʻole ʻike koke ʻia kahi i loaʻa ai nā poho. Ua maopopo i kēia manawa a pau - 5 a i ʻole 20 mau minuke - e hoʻomau ʻia kā mākou lawelawe, ʻaʻole maikaʻi paha.
ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

He aha kāu makemake e loaʻa? Nui nā ala a mākou. A ke ala pololei mai nei nā pilikia no ka hoʻomau ʻana o ke kahe ʻana o TCP i ka pōmaikaʻi e hoʻohana i ke ala like. Pono mākou i kahi mea e hiki ai iā mākou ke hoʻohana i nā ala he nui i loko o kahi pilina TCP hoʻokahi. Me he mea lā ua loaʻa iā mākou ka hopena. Aia kekahi TCP, i kapa ʻia - multipath TCP, ʻo ia hoʻi, TCP no nā ala he nui. ʻOiaʻiʻo, ua hoʻomohala ʻia no kahi hana ʻokoʻa loa - no nā poʻe kelepona i loaʻa i kekahi mau polokalamu pūnaewele. No ka hoʻonui ʻana i ka hoʻololi ʻana a i ʻole ka hana ʻana i ke ʻano kumu mua / backup, ua hoʻomohala ʻia kahi ʻano hana e hana pono ai i kekahi mau threads (sessions) no ka noi a hiki iā ʻoe ke hoʻololi i waena o lākou inā he hemahema. A i ʻole, e like me kaʻu i ʻōlelo ai, e hoʻonui i ka bandwidth.

Akā aia kahi nuance ma aneʻi. No ka hoʻomaopopo ʻana i ke ʻano o ia mea, pono mākou e nānā i ka hoʻonohonoho ʻana o nā kahawai.
ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

Hoʻonohonoho ʻia nā loina ma ke kaʻina. Hoʻokomo mua ʻia ke kahawai mua. Hoʻonohonoho ʻia nā kahe ma hope me ka hoʻohana ʻana i ke kuki i ʻae ʻia i loko o kēlā pae. A eia ka pilikia.
ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

ʻO ka pilikia inā ʻaʻole i hoʻokomo ʻia ka milo mua, ʻaʻole e piʻi mai ka lua a me ke kolu. ʻO ia hoʻi, ʻaʻole hoʻonā ka multipath TCP i ka nalowale o ka ʻeke SYN i ke kahawai mua. A inā nalowale ka SYN, lilo ka multipath TCP i TCP maʻamau. No laila, i loko o kahi kikowaena kikowaena data, ʻaʻole ia e kōkua iā mākou e hoʻoponopono i ka pilikia o nā poho i ka hale hana a aʻo pehea e hoʻohana ai i nā ala he nui i ka hihia o ka hemahema.
ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

He aha ka mea hiki ke kōkua iā mākou? Ua kuhi mua kekahi o ʻoukou mai ka inoa ʻo ka IPv6 flow label header field he kahua koʻikoʻi i kā mākou moʻolelo hou aku. ʻOiaʻiʻo, he kahua kēia i hōʻike ʻia ma v6, ʻaʻole ia ma v4, lawe ia i 20 bits, a ua hoʻopaʻapaʻa ʻia e pili ana i kona hoʻohana ʻana no ka manawa lōʻihi. He mea hoihoi loa kēia - aia nā hoʻopaʻapaʻa, ua hoʻopaʻa ʻia kekahi mea i loko o ke kāʻei o ka RFC, a i ka manawa like, ua ʻike ʻia kahi hoʻokō i ka kernel Linux ʻaʻole i kākau ʻia ma nā wahi āpau.
ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

Manaʻo wau iā ʻoe e hui pū me aʻu i kahi noiʻi liʻiliʻi. E nānā kākou i nā mea e hana nei ma ka Linux kernel i nā makahiki i hala iho nei.

ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

makahiki 2014. Hoʻohui kekahi ʻenekinia mai kahi hui nui a kaulana i ka hana o ka kernel Linux i ka hilinaʻi o ka waiwai o ka lepili kahe ma ka hash o ke kumu. He aha kā lākou e hoʻāʻo nei e hoʻoponopono ma ʻaneʻi? Ua pili kēia iā RFC 6438 i kūkākūkā i kēia pilikia. I loko o ke kikowaena ʻikepili, hoʻopili pinepine ʻia ʻo IPv4 i nā ʻeke IPv6, no ka mea ʻo IPv6 ka hale hana ponoʻī, akā pono e hāʻawi ʻia ʻo IPv4. No ka manawa lōʻihi, aia nā pilikia me nā hoʻololi hiki ʻole ke nānā ma lalo o ʻelua mau poʻomanaʻo IP e kiʻi i TCP a i ʻole UDP a loaʻa iā src_ports, dst_ports ma laila. Ua ʻike ʻia ʻo ka hash, inā ʻoe e nānā i nā poʻomanaʻo IP ʻelua mua, ua hoʻohuli ʻia ua kokoke paʻa. I mea e pale aku ai i kēia, i mea e hana pono ai ke kaupaona ʻana o kēia kaʻa i hoʻopili ʻia, ua manaʻo ʻia e hoʻohui i kahi hash mai ka ʻeke 5-tuple encapsulated i ka waiwai o ke kahua lepili kahe. Ma kahi like i hana ʻia no nā papa hana encapsulation ʻē aʻe, no UDP, no GRE, i ka hope i hoʻohana ʻia ke kahua GRE Key. ʻO kekahi ala a i ʻole, maopopo nā pahuhopu ma aneʻi. A ma ka liʻiliʻi loa i kēlā manawa ua pono lākou.

ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

I ka makahiki 2015, loaʻa mai kahi papa hou mai ka ʻenekini hanohano like. He hoihoi loa ia. Ua ʻōlelo ʻia ka mea aʻe - e hoʻokaʻawale mākou i ka hash inā loaʻa kahi hanana ala ala maikaʻi ʻole. He aha ka hanana ala ala ʻino? ʻO kēia ka RTO a mākou i kūkākūkā ai ma mua, ʻo ia hoʻi, ʻo ka nalowale o ka huelo puka makani he hanana maikaʻi ʻole. ʻOiaʻiʻo, paʻakikī ke koho ʻana i ia mea.

ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

ʻO 2016, kahi hui mahalo ʻia, nui hoʻi. Hoʻopau ia i nā koʻokoʻo hope loa a hoʻololi ʻia ka hash a mākou i hana mua ai i ka randomized i kēlā me kēia SYN retransmit a ma hope o kēlā me kēia RTO timeout. A i loko o kēia leka, no ka manawa mua a hope, kani ka pahuhopu hope loa - e hōʻoia i ka hele ʻana i ka wā o ka nalowale a i ʻole ka nui o nā kahawai i hiki ke hoʻololi hou ʻia, me ka hoʻohana ʻana i nā ala he nui. ʻOiaʻiʻo, ma hope o ka nui o nā paʻi, hiki iā ʻoe ke loaʻa iā lākou.

ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

ʻOiai ʻaʻole, ʻaʻole hiki iā ʻoe, no ka mea ʻaʻohe hoʻolaha hoʻokahi ma kēia kumuhana. Akā ʻike mākou!

ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

A inā ʻaʻole maopopo iā ʻoe ka mea i hana ʻia, e haʻi aku wau iā ʻoe i kēia manawa.
ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

He aha nā mea i hana ʻia, he aha nā hana i hoʻohui ʻia i ka kernel Linux? Txhash hoʻololi i kahi waiwai ma hope o kēlā me kēia hanana RTO. ʻO kēia ka hopena ala ala ʻino. Pili ka hash i kēia txhash a pili ka lepili kahe i ka hash skb. Aia kekahi mau helu ma nā hana ma aneʻi, ʻaʻole hiki ke kau ʻia nā kikoʻī āpau ma kahi paheʻe. Inā makemake kekahi, hiki iā ʻoe ke hele i ke code kernel a nānā.

He aha ka mea nui ma ʻaneʻi? Hoʻololi ka waiwai o ke kahua lepili kahe i kahi helu ma hope o kēlā me kēia RTO. Pehea e pili ai kēia i kā mākou kahawai TCP pōʻino?
ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

I ka hihia o kahi SACK, ʻaʻohe mea i loli no ka mea ke hoʻāʻo nei mākou e hoʻouna hou i kahi ʻeke nalowale i ʻike ʻia. I kēia manawa maikaʻi.
ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

Akā i ka hihia o RTO, inā ua hoʻohui mākou i kahi lepili kahe i ka hana hash ma ToR, hiki i ke kaʻa ke hele i kahi ala ʻē aʻe. A ʻoi aku ka nui o nā mokulele, ʻoi aku ka nui o ka loaʻa ʻana o kahi ala ʻaʻole i hoʻopilikia ʻia e ka hāʻule ʻana ma kahi hāmeʻa.
ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

Hoʻokahi pilikia i koe - RTO. ʻO kahi ala ʻē aʻe, ʻoiaʻiʻo, loaʻa, akā nui ka manawa i hoʻopau ʻia ma laila. He nui ka 200ms. ʻO ka lua ka maʻamau hihiu. Ma mua, ua kamaʻilio wau e pili ana i nā manawa manawa e hoʻonohonoho i nā lawelawe. No laila, ʻo ka lua ka manawa manawa e hoʻonohonoho maʻamau i kahi lawelawe ma ka pae noi, a ma kēia ʻano e kūpono loa ka lawelawe. Eia kekahi, ʻōlelo hou au, ʻo ka RTT maoli i loko o kahi kikowaena data hou ma kahi o 1 millisecond.
ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

He aha ka mea e hiki ke hana e pili ana i ka RTO timeouts? Hiki ke maʻalahi ka hoʻonohonoho ʻana i ka manawa hoʻopau i ka RTO inā nalowale nā ​​paʻi ʻikepili mai kahi o ka mea hoʻohana: aia kahi pono IP, a ʻo kekahi o kāna mau ʻāpana he rto_min like. Ke noʻonoʻo nei, ʻoiaʻiʻo, pono ʻoe e hoʻohuli iā RTO ʻaʻole ma ka honua holoʻokoʻa, akā no nā prefix i hāʻawi ʻia, ʻano hana maikaʻi kēlā ʻano hana.
ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

ʻOiaʻiʻo, me SYN_RTO ʻoi aku ka hewa o nā mea a pau. Ua kuʻi maoli ʻia i lalo. Hoʻopaʻa ʻia ka waiwai i ke kumu - 1 kekona, a ʻo ia nō. ʻAʻole hiki iā ʻoe ke kiʻi iā ia mai kahi mea hoʻohana. Hoʻokahi wale nō ala.
ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

Hele mai ka eBPF i ka hoʻopakele. No ka maʻalahi, he mau polokalamu C liʻiliʻi kēia. Hiki ke hoʻokomo ʻia i loko o nā makau ma nā wahi like ʻole i ka hoʻokō ʻana i ka pahu kernel a me ka waihona TCP, kahi e hiki ai iā ʻoe ke hoʻololi i kahi helu nui loa o nā hoʻonohonoho. Ma keʻano laulā, he ʻano lōʻihi ka eBPF. Ma kahi o ka ʻike ʻana i ka nui o nā ʻāpana sysctl hou a hoʻonui i ka pono IP, aia ka neʻe i ke kuhikuhi o eBPF a hoʻonui i kāna hana. Me eBPF, hiki iā ʻoe ke hoʻololi i nā mana congestion a me nā ʻano hoʻonohonoho TCP ʻē aʻe.
ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

Akā he mea nui iā mākou me ke kōkua o ia mea hiki iā ʻoe ke wili i nā waiwai o SYN_RTO. A aia kekahi laʻana i hoʻolaha ʻia ma ka lehulehu: https://elixir.bootlin.com/linux/latest/source/samples/bpf/tcp_synrto_kern.c. He aha ka hana ma ʻaneʻi? Ke hana nei ka laʻana, akā i loko o ia iho he koʻikoʻi loa. Manaʻo ʻia ma loko o ke kikowaena data e hoʻohālikelike mākou i nā bits 44 mua, inā pili lākou, a laila ʻike mākou iā mākou iho i loko o ka DC. A i kēia hihia, hoʻololi mākou i ka waiwai o SYN_RTO timeout i 4ms. Hiki ke hana ʻia ka hana like me ka nani. Akā, hōʻike kēia hiʻohiʻona maʻalahi i ka mea a) hiki; b) maʻalahi.

ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

He aha kā mākou i ʻike ai? ʻO ka hoʻolālā planar e ʻae i ka scaling, ua lilo ia i mea pono loa iā mākou ke hoʻohuli mākou i ka lepili kahe ma ToR a loaʻa ka manawa e kahe a puni nā wahi pilikia. ʻO ke ala maikaʻi loa e hoʻohaʻahaʻa i nā waiwai RTO a me SYN-RTO e hoʻohana i nā polokalamu eBPF. Ke waiho nei ka nīnau: palekana ka hoʻohana ʻana i ka lepili kahe no ke kaulike? A aia kekahi nuance maanei.
ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

Inā paha he lawelawe kāu ma ka pūnaewele e noho ana ma anycast. ʻO ka mea pōʻino, ʻaʻohe oʻu manawa e hele i nā kikoʻī e pili ana i kekahicast, akā he lawelawe hoʻolaha kahi i loaʻa ai nā kikowaena kino like ʻole ma ka leka uila IP like. A eia kekahi pilikia: hiki i ka hanana RTO ke hiki ʻaʻole wale i ka wā e hele ai ke kaʻa i ka hale hana. Hiki ke hana ʻia ma ka pae hoʻopaʻa ToR: i ka wā i loaʻa ai kahi hanana incast, hiki ke hana ʻia ma luna o ka mea hoʻokipa ke hoʻokahe ka mea hoʻokipa i kekahi mea. Ke kū mai kahi hanana RTO a hoʻololi i ka lepili kahe. I kēia hihia, hiki ke hele i ke kaʻa i kekahi laʻana anycast. Inā paha he stateful anycast, aia i loko o kahi kūlana pili - hiki ke lilo i L3 Balancer a i ʻole kekahi lawelawe ʻē aʻe. A laila, puka mai kahi pilikia, no ka mea ma hope o ka RTO, hiki mai ka pilina TCP i ke kikowaena, ʻaʻole ʻike i kēia pili TCP. A inā ʻaʻohe o mākou kaʻana mokuʻāina ma waena o nā kikowaena anycast, a laila e hoʻokuʻu ʻia kēlā mau kaʻa a e haki ka pilina TCP.
ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

He aha ka mea hiki ke hana maanei? I loko o kāu kaiapuni i hoʻomalu ʻia, kahi e hiki ai iā ʻoe ke kaupaona ʻana i ka lepili kahe, pono ʻoe e hoʻoponopono i ka waiwai o ka lepili kahe i ke komo ʻana i nā kikowaena anycast. ʻO ke ala maʻalahi ka hana ʻana ma o ka papahana eBPF like. Akā, eia kahi mea koʻikoʻi - he aha kāu e hana ai inā ʻaʻole ʻoe e hana i kahi kikowaena kikowaena data, akā he mea lawelawe kelepona? ʻO kēia kou pilikia: e hoʻomaka me kekahi mau mana o Juniper a me Arista, hoʻokomo lākou i ka lepili kahe i ka hana hash ma ke ʻano maʻamau - e ʻoiaʻiʻo, ʻaʻohe kumu aʻu i maopopo ai. Hiki iā ʻoe ke hoʻokuʻu i nā pilina TCP mai nā mea hoʻohana e hele ana ma kāu pūnaewele. No laila, makemake nui au e nānā i kāu hoʻonohonoho router ma kēia wahi.

ʻO kekahi ala a i ʻole, ʻike wau ua mākaukau mākou e neʻe i nā hoʻokolohua.
ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

I ko mākou huli ʻana i ka lepili kahe ma ToR, hoʻomākaukau i ka eBPF o ka ʻelele, e noho nei ma luna o nā pūʻali, ua hoʻoholo mākou ʻaʻole e kali no ka hāʻule nui e hiki mai ana, akā e hana i nā pahū hoʻomalu. Lawe mākou iā ToR, nona nā uplinks ʻehā, a hoʻokuʻu i kekahi o lākou. Ua huki lākou i kahi lula, ʻōlelo lākou - ke nalowale nei ʻoe i nā ʻeke āpau. E like me kāu e ʻike ai ma ka ʻaoʻao hema, loaʻa iā mākou ka nānā ʻana i kēlā me kēia packet, i hāʻule i 75%, ʻo ia hoʻi, ua nalowale ka 25% o nā ʻeke. Aia ma ka ʻākau nā kiʻi o nā lawelawe e noho ana ma hope o kēia ToR. ʻO ka ʻoiaʻiʻo, ʻo ia nā kiʻi kaʻa o nā hui me nā kikowaena i loko o ka pā. E like me kāu e ʻike ai, hāʻule lākou i lalo. No ke aha lākou i hāʻule ai i lalo - ʻaʻole ma 25%, akā i kekahi mau manawa ma 3-4 mau manawa? Inā maikaʻi ʻole ka pilina TCP, hoʻomau ʻo ia e hoʻāʻo e hōʻea ma o ka interface haʻihaʻi. Hoʻonui ʻia kēia e ka hana maʻamau o ka lawelawe i loko o ka DC - no hoʻokahi noi mea hoʻohana, ua hoʻokumu ʻia nā noi N i nā lawelawe kūloko, a e hele ka pane i ka mea hoʻohana, i ka wā e pane ai nā kumu ʻikepili a pau, a i ʻole ke hoʻomaka ʻia kahi manawa pau. ka pae noi, pono e hoʻonohonoho ʻia. ʻO ia hoʻi, ʻino loa nā mea a pau.
ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

I kēia manawa ka hoʻokolohua like, akā me ka lepili kahe i hiki. E like me kāu e ʻike ai, ma ka ʻaoʻao hema, ua hāʻule kā mākou mākaʻikaʻi pūʻulu e ka 25%. He pololei loa kēia, no ka mea, ʻaʻole ia i ʻike i kekahi mea e pili ana i ka retransmits, hoʻouna ʻo ia i nā ʻeke a helu wale i ka ratio o ka helu o nā ʻeke i hāʻawi ʻia a nalowale.

A ma ka ʻākau ka papa kuhikuhi o nā lawelawe. ʻAʻole ʻoe e ʻike i ka hopena o kahi hui pilikia ma aneʻi. Ua kahe ka huakaʻi i kēlā mau milliseconds mai ka wahi pilikia i nā uplinks ʻekolu i koe i hoʻopilikia ʻole ʻia e ka pilikia. Loaʻa iā mākou kahi pūnaewele e ho'ōla iā ia iho.

ʻO kahi pūnaewele e ho'ōla iā ia iho: ke kilokilo o ka Flow Label a me ka mea hoʻopale a puni ka kernel Linux. Hōʻike ʻo Yandex

ʻO kēia kaʻu paheʻe hope loa, ka manawa e ʻimi ai. I kēia manawa, manaʻolana wau e ʻike ʻoe i ke kūkulu ʻana i kahi kikowaena kikowaena data hoʻōla ponoʻī. ʻAʻole pono ʻoe e hele i loko o ka waihona Linux kernel a ʻimi i nā ʻāpana kūikawā ma laila, ʻike ʻoe ua hoʻoponopono ka Flow label i ka pilikia i kēia hihia, akā pono ʻoe e hoʻokokoke pono i kēia ʻano. A ke hoʻoikaika hou nei au inā he mea lawe ʻoe, ʻaʻole pono ʻoe e hoʻohana i ka lepili kahe ma ke ʻano he hana hash, i ʻole e uhaʻi ʻoe i nā kau o kāu mea hoʻohana.

No nā mea ʻenekinia pūnaewele, pono e hoʻololi i ka manaʻo: ʻaʻole hoʻomaka ka pūnaewele me ToR, ʻaʻole me kahi hāmeʻa pūnaewele, akā me kahi mea hoʻokipa. ʻO kahi hiʻohiʻona maikaʻi loa pehea mākou e hoʻohana ai i ka eBPF e hoʻololi i ka RTO a e hoʻoponopono i ka lepili kahe i nā lawelawe anycast.

Kūpono maoli ka mīkini lepili kahe no nā hoʻohana ʻē aʻe i loko o ka māhele hoʻomalu i hoʻomalu ʻia. Hiki i kēia ke kaʻa ma waena o nā kikowaena data, a i ʻole hiki iā ʻoe ke hoʻohana i ia ʻano mechanics i kahi ala kūikawā e kāohi ai i ka hele ʻana i waho. Akā, e kamaʻilio wau e pili ana i kēia, manaʻolana wau, i ka manawa aʻe. Mahalo nui iā ʻoe no kou nānā ʻana.

Source: www.habr.com