E like me Aia kekahi pilikia me kahi lawelawe i hoʻolaha ʻia, e kapa kākou iā ia ʻo Alvin. I kēia manawa, ʻaʻole wau i ʻike i ka pilikia iaʻu iho; ua hōʻike mai nā kāne ma ka ʻaoʻao o ka mea kūʻai aku iaʻu.
I kekahi lā, ua ala au i kahi leka uila huhū e pili ana i ka latency kiʻekiʻe o Alvin, a mākou e hoʻolālā nei e hoʻomaka koke. ʻO ke kikoʻī, ua ʻike ka mea kūʻai aku i kahi latency 99th percentile ma kahi o 50 ms, ʻoi aku ka nui ma mua o kā mākou kālā latency. He mea kupanaha kēia, no ka mea, ua hoʻāʻo pono wau i ka lawelawe, ʻoi aku hoʻi no ka latency, he hoʻopiʻi pinepine ia.
Ma mua o ka hoʻouna ʻana iā Alvin no ka hoʻāʻo ʻana, ua holo au i nā hoʻokolohua he nui me 40 mau nīnau i kekona (QPS), a ua hōʻike ʻia nā mea a pau i ka latency ma lalo o 10 ms. Ua mākaukau wau e haʻi i koʻu manaʻo kūʻē i kā lākou mau hopena. Akā ma hope o ka nānā hou ʻana i ka leka uila, ua ʻike au i kahi mea hou: ʻaʻole maopopo iaʻu i hoʻāʻo i nā kūlana a lākou i ʻōlelo ai; ʻoi aku ka haʻahaʻa o kā lākou QPS ma mua o kaʻu. Ua hoʻāʻo au ma 40 QPS, a ua hoʻāʻo wale lākou ma 1. Ua holo au i kahi hoʻokolohua ʻē aʻe, i kēia manawa me kahi QPS haʻahaʻa, e hōʻoluʻolu iā lākou.
ʻOiai ke kākau nei au i kēia ma ka blog, ua ʻike paha ʻoe ua pololei kā lākou mau helu. Ua hoʻāʻo hou au i kaʻu mea kūʻai aku virtual, me ka hopena like: ʻo ka helu noi haʻahaʻa ʻaʻole wale e hoʻonui i ka latency, akā hoʻonui pū i ka helu o nā noi me ka latency ʻoi aku ma mua o 10 ms. I nā huaʻōlelo ʻē aʻe, ʻoiai ma 40k QPS, ma kahi o 50 mau noi i kekona i ʻoi aku ma mua o 50 ms, ma 1k QPS, aia he 100 mau noi i kekona i ʻoi aku ma mua o 50 ms. He mea kupanaha!

Ke hoʻohaiki nei i ka ʻimi
I ka wā e kū ai i kahi pilikia latency i loko o kahi ʻōnaehana i hoʻolaha ʻia me nā ʻāpana he nui, ʻo ka hana mua ka hana ʻana i kahi papa inoa pōkole o nā mea kānalua. E ʻeli hohonu kākou i loko o ke ʻano hana o Alvin:

ʻO kahi hoʻomaka maikaʻi kahi papa inoa o nā hoʻololi I/O i hoʻopau ʻia (nā kelepona pūnaewele, nā ʻimi disk, a pēlā aku). E ho'āʻo kākou e ʻike i kahi o ka latency. Ma waho aʻe o ka I/O maopopo me ka mea kūʻai aku, lawe ʻo Alvin i kahi hana hou aʻe: komo ia i ka hale kūʻai ʻikepili. Eia nō naʻe, ke holo nei kēia hale kūʻai ʻikepili ma ka hui like me Alvin, no laila e haʻahaʻa ka latency ma laila ma mua o ka mea kūʻai aku. No laila, eia ka papa inoa o nā mea kānalua:
- Kāhea pūnaewele mai ka mea kūʻai aku iā Alvin.
- Kāhea pūnaewele mai Alvin a i ka hale waihona ʻikepili.
- Huli i ka pā disk ma ka waihona ʻikepili.
- Kāhea pūnaewele mai ka waihona ʻikepili a i Alvin.
- Kāhea pūnaewele mai Alvin i ka mea kūʻai aku.
E ho'āʻo kākou e kaha i kekahi mau kiko.
ʻAʻohe pili o ka mālama ʻikepili me ia
ʻO ka mea mua, ua hoʻololi au iā Alvin i kikowaena ping-ping ʻaʻole e hana i nā noi. Ma ka loaʻa ʻana o kahi noi, hoʻihoʻi ia i kahi pane hakahaka. Inā emi ka latency, a laila aia kahi bug i ka hoʻokō ʻana o Alvin a i ʻole ka hale waihona ʻikepili—ʻaʻohe mea i lohe ʻole ʻia. Ma ka hoʻokolohua mua, loaʻa iā mākou kēia kiʻi:

E like me kā mākou e ʻike nei, ʻaʻohe hoʻomaikaʻi ʻana i ka wā e hoʻohana ai i kahi kikowaena ping-ping. ʻO ke ʻano kēia, ʻaʻole e hoʻonui ka mālama ʻikepili i ka latency, a ua hoʻemi ʻia ka papa inoa o nā mea kānalua i ka hapalua:
- Kāhea pūnaewele mai ka mea kūʻai aku iā Alvin.
- Kāhea pūnaewele mai Alvin i ka mea kūʻai aku.
Maikaʻi loa! Ke pōkole nei ka papa inoa. Ua manaʻo wau ua kokoke wau e ʻike i ke kumu.
gRPC
ʻO kēia ka manawa e hoʻolauna iā ʻoe i kahi mea pāʻani hou: He waihona puke wehe kēia mai Google no ke kamaʻilio ʻana ma waena o ke kaʻina hana. . ^ E Ha yM. ʻOiai gRPC Ua hoʻonohonoho maikaʻi ʻia a hoʻohana nui ʻia, ʻo kēia kaʻu manawa mua e hoʻohana ai i loko o kahi ʻōnaehana o kēia unahi, a ua manaʻo wau ʻaʻole kūpono kaʻu hoʻokō ʻana, ʻo ia hoʻi.
loaʻa nui gRPC i loko o ka waihona i hāpai i kahi nīnau hou: malia paha ʻo kaʻu hoʻokō ʻana a i ʻole ka gRPC He aha ke kumu o ka pilikia latency? E hoʻohui kākou i kahi mea kānalua hou i ka papa inoa:
- Kāhea ka mea kūʻai aku i ka hale waihona puke
gRPC - waihona
gRPCma ka mea kūʻai aku, hana i kahi kelepona pūnaewele i ka hale waihona pukegRPCma ke kikowaena - waihona
gRPCnā helu wahi iā Alvin (ʻaʻohe hana i ka hihia o ka kikowaena ping-pong)
I mea e hāʻawi ai iā ʻoe i kahi manaʻo no ke ʻano o ke code, ʻaʻole ʻokoʻa loa kaʻu hoʻokō client/Alvin mai nā mea client-server. .
Hoʻomaopopo: Ua maʻalahi iki ka papa inoa ma luna nei e like me
gRPCʻae i ka hoʻohana ʻana i kahi kumu hoʻohālike threading maʻamau (template?), kahi i hoʻopili ʻia ai ka hoʻokō hoʻokōgRPCa me ka hoʻokō ʻana o ka mea hoʻohana. No ka maʻalahi, e pili mākou me kēia kumu hoʻohālike.
E hoʻoponopono ka profiling i nā mea āpau
Ma hope o ke kāpae ʻana i nā waihona ʻikepili, ua manaʻo wau ua kokoke wau e pau: "I kēia manawa ua maʻalahi kēlā! E hoʻopili kākou i ka ʻaoʻao pilikino a ʻike i kahi e hana nei ka latency. " ʻO wau , no ka mea, he wikiwiki loa nā CPU a ʻaʻole pinepine lākou ke kumu o ka bottleneck. Loaʻa ka hapa nui o nā lohi i ka wā e pono ai ke kaʻina hana e hoʻōki i ka hana ʻana e hana i kahi mea ʻē aʻe. Ua hoʻolālā ʻia ka profiling CPU pololei no kēia kumu: hoʻopaʻa pololei ia i nā mea āpau. a hoʻākāka i kahi e lohi ai.
Ua lawe au i ʻehā mau ʻikepili: hoʻokahi me ka QPS kiʻekiʻe (latency haʻahaʻa) a hoʻokahi me kahi kikowaena ping-pong ma QPS haʻahaʻa (latency kiʻekiʻe), ma nā ʻaoʻao o ka mea kūʻai aku a me ke kikowaena. I mea e maopopo ai, ua lawe pū wau i kahi ʻikepili CPU laʻana. I ka hoʻohālikelike ʻana i nā ʻikepili, ʻimi pinepine wau i nā puʻu kāhea maʻamau. No ka laʻana, ʻoi aku ka nui o nā kuapo pōʻaiapili o ka ʻaoʻao latency kiʻekiʻe (10x a ʻoi aku paha). Akā i koʻu hihia, ua like ka nui o nā kuapo pōʻaiapili. I koʻu hopohopo, ʻaʻohe mea koʻikoʻi ma laila.
Nā hana hoʻoponopono hou aʻe
Ua makemake nui au. ʻAʻole au i ʻike i nā mea hana ʻē aʻe e hoʻohana ai, a ʻo kaʻu hoʻolālā aʻe, ʻo ia ke hana hou ʻana i nā hoʻokolohua me nā ʻano like ʻole ma mua o ka ʻike maopopo ʻana i ka pilikia.
Pehea inā
Mai kinohi mai, ua hopohopo wau no ka lohi kikoʻī o 50ms. He manawa lōʻihi loa ia. Ua hoʻoholo wau e ʻoki i nā ʻāpana o ke code a hiki iaʻu ke ʻike pono i ka ʻāpana e hana ana i ka hewa. A laila hele mai ka hoʻokolohua, a ua holo pono ia.
E like me ka mea maʻamau, i ka nānā ʻana i hope, ua maopopo nā mea a pau. Ua kau au i ka mea kūʻai aku ma ka mīkini like me Alvin a hoʻouna aku i ke noi iā localhostA ua nalowale ka piʻi ʻana o ka latency!

Ua hewa kekahi mea me ka pūnaewele.
Ke Aʻo ʻana i nā Mākaukau ʻenekinia Pūnaewele
Pono wau e ʻae: he weliweli koʻu ʻike i ka hoʻopili pūnaewele, ʻoiai ke noʻonoʻo nei au e hana pū ana me ia i kēlā me kēia lā. Akā, ʻo ka pūnaewele ka mea kānalua nui, a pono wau e aʻo pehea e hoʻoponopono ai.
ʻO ka mea pōmaikaʻi, makemake ka pūnaewele i ka poʻe makemake e aʻo. ʻO ka hui pū ʻana o ka ping a me ka tracert me he mea lā he hoʻomaka maikaʻi loa ia no ka hoʻoponopono ʻana i nā pilikia halihali pūnaewele.
ʻO ka mea mua, ua hoʻokuʻu wau i ke awa TCP a Alvin. Ua hoʻohana au i nā palena paʻamau—ʻaʻohe mea kūikawā. Ma waho aʻe o hoʻokahi tausani pings, ʻaʻohe hoʻokahi i ʻoi aku ma mua o 10 ms, koe wale nō ka mea mua no ka hoʻomehana ʻana. Kūʻē kēia i ka piʻi ʻana o ka latency i ʻike ʻia o 50 ms ma ka 99th percentile: ma laila, no kēlā me kēia 100 noi, pono mākou e ʻike ma kahi o hoʻokahi noi me ka latency o 50 ms.
A laila ua hoʻāʻo wau Malia paha he pilikia me kekahi o nā kikowaena ma waena o Alvin a me ka mea kūʻai aku. Akā ua hoʻi mai ka mea hahai me ka lima ʻole.
No laila, ʻaʻole i hoʻokumu ʻia ka lohi e kaʻu code, ka hoʻokō gRPC, a i ʻole ka pūnaewele. Ua hoʻomaka wau e hopohopo ʻaʻole loa wau e hoʻomaopopo.
I kēia manawa, he aha ka OS a mākou e hoʻohana nei?
gRPC hoʻohana nui ʻia ma Linux, akā no Windows He mea kupanaha kēia. Ua hoʻoholo wau e hana i kahi hoʻokolohua i holo pono: Ua hana wau i kahi mīkini virtual. Linux, i hōʻuluʻulu ʻia ʻo Alvin no Linux a wehe aʻela ia.

A eia ka mea i hana ʻia: ma ke kikowaena ping-pong Linux ʻaʻohe lohi e like me kahi kikowaena like Windows, ʻoiai ua like ke kumu ʻikepili. Ua ʻike ʻia aia ka pilikia ma ka hoʻokō ʻana o gRPC no Windows.
Ka algorithm a Nagle
I kēia manawa a pau, ua manaʻo wau ua nele wau i kahi hae gRPCI kēia manawa ua maopopo iaʻu aia kēia ma loko gRPC ua nalowale ka hae WindowsUa loaʻa iaʻu kahi waihona puke RPC kūloko aʻu i hilinaʻi ai e hana maikaʻi no nā hae āpau i hoʻonohonoho ʻia. A laila ua hoʻohui au i kēia mau hae a pau i ka gRPC a hoʻolaha iā Alvin i Windows, ma ke kikowaena ping-pong paʻa ma lalo Windows!

Aneane Pau: Ua hoʻomaka wau e wehe i nā hae i hoʻohui ʻia pākahi a hiki i ka hoʻi ʻana mai o ka regression, i hiki iaʻu ke kuhikuhi i kona kumu. ʻO ia ka mea kaulana ʻole , ke kuapo algorithm a Nagle.
hoʻāʻo e hōʻemi i ka helu o nā packets i hoʻouna ʻia ma luna o ka pūnaewele ma o ka hoʻopaneʻe ʻana i ka hoʻouna ʻana o nā leka a hiki i ka nui o ka packet ma mua o kahi helu o nā bytes. ʻOiai he mea ʻoluʻolu paha kēia no ka mea hoʻohana maʻamau, he mea luku ia no nā kikowaena manawa maoli, ʻoiai e hoʻopaneʻe ka OS i kekahi mau leka, e hana ana i nā lags ma QPS haʻahaʻa. gRPC ua kau ʻia kēia hae i ka hoʻokō ʻana Linux no nā sockets TCP, akā ʻaʻole no WindowsʻO wau kēia .
hopena
ʻO ke kiʻekiʻe o ka latency ma ka QPS haʻahaʻa i hana ʻia e kahi OS optimization. I ka nānā ʻana i hope, ʻaʻole i ʻike ka profiling i ka latency no ka mea ua holo ʻia ma ke ʻano kernel, ʻaʻole ma ʻAʻole maopopo iaʻu inā hiki ke nānā ʻia ka algorithm a Nagle ma o nā hopu ʻana o ETW, akā he mea hoihoi ia.
No ka hoʻokolohua localhost, ʻaʻole paha i pili i kekahi code pūnaewele maoli, a ʻaʻole i holo ka algorithm a Nagle, no laila ua nalo aku nā pilikia latency i ka wā i komo ai ka mea kūʻai aku iā Alvin ma o localhost.
I ka manawa aʻe e ʻike ai ʻoe i ka piʻi ʻana o ka latency i ka emi ʻana o ka nui o nā noi i kēlā me kēia kekona, pono e kau ʻia ka algorithm a Nagle ma kāu papa inoa o nā mea kānalua!
Source: www.habr.com
