Hacker News

Waa maxay sababta qoondaynta C++ (m) ugu horraysa ay had iyo jeer u tahay 72 KB?

Faallo

10 min read Via joelsiks.com

Mewayz Team

Editorial Team

Hacker News

Sirta Ka Danbaysa Qoondayntaada C++ ee Kowaad

Waxaad qoraysaa barnaamij fudud oo C++ ah. Halintcusub. Afar bytes. Waxaad shidaystraceama profile-ka xusuusta ee aad jeceshahay, oo halkaasay jirtaa - nidaamkaagu wuxuu hadda ka codsaday qiyaastii 72 KB nidaamka hawlgalka. Ma aha 4 bytes. Ma aha 64 bytes. A buuxa 72 KB. Haddii aad waligaa dhugtay lambarkaas oo aad la yaabtay in qalabkaagu been kuu sheegayo, keligaa ma tihid. Dhaqankan u muuqda mid yaabka leh ayaa ah mid ka mid ah su'aalaha ugu badan ee ay isweyddiiyaan horumariyeyaasha C++ ee qodaya xusuusta gudaha markii ugu horreysay, jawaabtuna waxay nagu qaadanaysaa safar xiiso leh iyada oo loo marayo lakabyada u dhexeeya code-kaaga iyo qalabka dhabta ah.

Maxaa dhacaya markaad wacdo cusub

Si aad u fahamto 72 KB, waxaad u baahan tahay inaad raadraacdo silsiladda qoondaynta buuxda. Marka koodhkaaga C++ uu fuliyo cusub int, soo-sameeyaha ayaa taas u turjumaya wicitaankaoperator new, kaas oo inta badan nidaamyada Linux u wakiimallocka glibc. Laakiinmallocsi toos ah uma waydiiso kernel-ka 4 bytes ee xusuusta. Kernelku wuxuu ka shaqeeyaa bogag - caadiyan 4 KB x86_64 - iyo qiimaha wicitaanka nidaamka waa mid aad u weyn marka loo eego helitaanka xusuusta fudud. U yeedhidabrk()amamap() qoondaynta qof kasta waxay ka dhigaysaa barnaamij kasta oo aan fududayn inuu joogsado.

Halkii, qoondeeyaha xusuusta glibc - hirgelinta loo yaqaanptmalloc2, lafteedu waxay ka soo degtay Doug Lea's classicdlmalloc - wuxuu u shaqeeyaa sidii dhexdhexaadiye. Waxay ka codsataa qaybo waaweyn oo xusuusta ah kernel-ka xagga hore, ka dibna u xardhay qaybo yaryar sida barnaamijkaagu u baahan yahay. Tani waa sababta aasaasiga ah ee qoondayntaada 4-byte ee ugu horeysa waxay kicisaa codsi aad u weyn nidaamka hawlgalka. Qoondeeyaha ma aha mid khasaaraya. Waa istaraatiijiyad.

Dissecting the 72 KB: Meesha bayyteyadu tagaan

Qoondaynta bilowga ah waxay ka timaaddaa dhawr qaybood oo kala duwan oo ay tahay in wakhtiga runtime uu bilaabo ka hor inta aanu ku siinin xataa hal byte oo ah xusuusta la isticmaali karo. Fahamka qayb kastaa waxa ay sharraxaysaa sababta ay tiradu u degto halka ay ku taal.

Marka hore, glibc's malloc wuxuu bilaabaagoobta ugu weyn — qaab dhismeedka xisaabaadka aasaasiga ah ee dabagala dhammaan qoondaynta dunta ugu weyn. Goobtan waxa ka mid ah xogta badan ee tuulan, tilmaameyaal-liis bilaash ah, iyo qaab-dhismeedka qashinka ee cabbirrada kala duwan. Qoondeeyaha waxa uu ku kordhiyaa jabinta barnaamijkasbrk(), iyo kordhinta bilowga ah waxa lagu maamulaa xuduud gudaha ah oo loo yaqaanM_TOP_PAD, kaas oo u dhigma 128 KB oo suuf ah. Si kastaba ha ahaatee, codsiga bilawga ah ee dhabta ah waxa lagu hagaajiyaa toosinta bogga iyo booska nasashada ee jira, taas oo inta badan keenta codsi yar oo hore - caadi ahaan soo degaya meel u dhow sawirka 72 KB ee habka cusub ee la bilaabay.

Labaad, laga soo bilaabo glibc 2.26, qoondeeyuhu waxa uu bilaabay cache-maxalli ah(tcache) isticmaalka kowaad. Tcache-ku waxa uu ka kooban yahay 64 biin (halkiiba cabbir cabbir yar oo qoondayn ah), mid kastaa waxa uu awood u leeyahay in uu hayo ilaa 7 qaybood oo kaydsan. tcache_perthread_struct lafteedu waxay isticmaashaa ilaa 1 KB, laakiin ficilka bilaabista waxa ay kicisaa habaynta saaxada balaadhan. Seddexaad, wakhtiga runtime C++ waxa uu horay u sameeyay qoondaynta ka hor inta aanad shaqaynin main()

Nidaamka Garoonka iyo sababta Qoondaynta Horay u tahay mid caqli badan

Go'aanka ah in hore loo qoondeeyo qayb weyn oo xusuusta ah halkii laga codsan lahaa qayb-qayb-qayb maaha shil fulineed. Waa ganacsi ula kac ah oo ku qotoma tobanaan sano oo waayo-aragnimo barnaamijeed nidaam ah. Wicitaan kasta oo brk()ama map()ku lug leeyahay beddelka macnaha guud ee booska isticmaalaha una beddelo booska kernel-ka, wax ka beddelka khariidadaha xusuusta farsamada ee habka, iyo cusboonaysiinta miiska bogga. Qalab casri ah, hal wicitaan oo nadaam ah ayaa ku kacaya qiyaastii 100-200 nanoseconds - wax yar oo go'doon ah, masiibo baaxad leh.

Ka fiirso barnaamijka ka dhigaya 10,000 qoondayn yar inta lagu jiro bilowga. Qoondayn hore la'aanteed, taasi waxay la macno tahay 10,000 oo wicis ah, oo ku kacaya ku dhawaad ​​1-2 millise seconds oo saafi ah. Qoondeeyaha goobta ku salaysan, qoondaynta ugu horreysa waxay kicisaa hal wicitaan oo nidaam ah, iyo qoondaynta 9,999 ee soo socota ayaa gebi ahaanba loogu adeegay goobta isticmaalaha iyada oo loo marayo xisaabinta tilmaame iyo hawlgallada liiska isku xidhan - mid kastaa wuxuu qaadanayaa qiyaastii 10-50 nanoseconds. Xisaabtu maaha mid mugdi ah: qoondaynta ka hor waxay ku guulaysataa amarrada baaxadda leh.

72 KB ee aad ku aragto qoondayntaada ugu horeysa maaha xusuusta luntay - waa maalgelin waxqabad. Qoondeeyaha waxa uu sharxayaa in barnaamijkaagu uu samayn doono qoondayn badan dhawaan, iyo ku dhawaad ​​xaalad kasta oo dunida dhabta ah, sharadkaas ayaa si qurux badan u bixinaya. Qiimaha booska ciwaanka casriga ah ee aan la isticmaalin ayaa asal ahaan eber ka ah nidaamyada 64-bit ee casriga ah.

Xusuusta Virtual vs. Xusuusta Jirka: Maxay Aan Muhiim U Lahayn

Welwelka guud ee ka dhex jira horumariyeyaasha marka ugu horraysa la kulma dhaqankan waa qashinka kheyraadka. Haddii aan u baahdo 4 bytes oo keliya, muxuu barnaamijkaygu u cunayaa 72 KB? Aragtida muhiimka ah ayaa ah inxusuusta dhabta ahi aanay ahayn xusuusta jidheed. Marka glibc ku kordhiyo jebinta barnaamijka 72 KB, kernelku wuxuu cusboonaysiiyaa habka khariidadaha xusuusta farsamada, laakiin isla markaaba dib uguma soo celinayso boggaga RAM jireed. Bogagga dhabta ah ee dhabta ah waxaa loo qoondeeyay baahida iyada oo loo marayo khaladaadka bogga- kaliya marka barnaamijkaagu u qoro ciwaan gaar ah ayaa kernelku u qoondeeyaa bog xusuuseed dhab ah.

Tani waxay la macno tahay in kasta oo cabbirka farsamaysan ee habkaagu uu kordho 72 KB, xajmiga dejisan ee dadka deggan(RSS) - qaddarka RAM-ka dhabta ah ee run ahaantii la isticmaalo - waxay kordhisaa oo keliya bogagga aad dhab ahaantii taabato. Halintcusub, kaas oo caadi ahaan ah hal bog oo 4 KB ah, oo lagu daray bog kasta oo goobta xogaha badan ay ku jiraan. Meesha soo hadhay ee farsamada gacanta ayaa ku fadhida, diyaar u ah in la isticmaalo, waxna kuma kharash garayso marka laga reebo booska ciwaanka - kaas oo aad haysato 128 TB nidaamka Linux 64-bit ah.

💡 DID YOU KNOW?

Mewayz replaces 8+ business tools in one platform

CRM · Invoicing · HR · Projects · Booking · eCommerce · POS · Analytics. Free forever plan available.

Start Free →
Kala duwanaanshuhu waa muhiim marka la soo bandhigayo oo la kormeerayo codsiyada wax soo saarka. Haddii aad dhiseyso softiweer u baahan in lagu raad raaco isticmaalka kheyraadka dhabta ah - haddii ay tahay SaaS dhabarka dambe, adeeg-yaraha, ama dhuumaha falanqaynta sida kuwa ku shaqeeya aaladaha sidaMewayzhawlaha ganacsiga - waa inaad had iyo jeer la socotaa RSS halkii aad ka heli lahayd cabbir muuqaal ah. Aaladaha sida /proc/[pid]/smaps, valgrind --tool=massif, iyopmapku waxay ku siin karaan raad xusuuseed sax ah halkii aad marin habaabiso tirooyinka xusuusta dalwaddii.

Sida Kala Duwan ee Qoondeeyayaasha u Qabanayaan Qoondaynta Koowaad

Shaxda 72 KB waxay gaar u tahay glibc's ptmalloc2. Qoondeeyayaasha kale waxay sameeyaan baayacmushtar kala duwan, qoondaynta bilowga horena way u kala duwan tahay si waafaqsan. Fahamka kala duwanaanshahan ayaa qiimo leh marka la dooranayo qoondeeyaha codsiyada xasaasiga ah.

  • jemalloc (oo ay adeegsato Facebook, FreeBSD) — Waxay isticmaashaa qaab-dhismeedka garoon aad u weyn oo leh khasnado dun-maxalli ah. Sarrifka hore waxa uu u janjeeraa inuu sareeyo (badanaa 200+ KB) laakiin waxa uu keenaa hawl qabad ka sii wanaagsan oo isku xidhan sababtoo ah muranka qufulka oo yaraatay.
  • tcmalloc ( Google's Thread-Caching Malloc) — Waxay u qoondaysaa khasnad kasta oo xadhig ah oo ku dhow 2 MB si toos ah, oo leh qoondayn hor leh oo gardarro ah. Sarrifka hore waa ka sarreeyaa, laakiin qoondaynta yaryar ee soo socota aad bay u dhakhso badan tahay.
  • musl libc's malloc — Wuxuu adeegsadaa naqshad aad uga fudud oo ku salaysanmapdhammaan qoondaynta. Sarrifka hore aad buu ugu yar yahay (badanaa kaliya 4 KB qoondayntiiba), laakiin kharashkii meelayntu waa ka sarreeyaa sababtoo ah wicitaanno badan oo habaysan.
  • mimalloc (Microsoft) — Waxay isticmaashaa qoondaynta qayb-ku-salaysan oo leh 64 MB oo qaybood. Qoondaynta kowaad waxay dhalinaysaa boos celin 64 MB ah (oo leh go'aan jidheed oo aad u yar), booska ciwaanka ganacsiga ee meel gaar ah iyo wax soo saar.

Doorashada u dhaxaysa qoondeeyayaashan waxay gebi ahaanba ku xidhan tahay culayska shaqadaada. Codsiyada server-ka ee mudada dheer socda ee leh qoondaynta dunta badan ee culus, jemalloc ama tcmalloc ayaa caadi ahaan ka sarreeya glibc-da caadiga ah. Nidaamyada isku dhejisan ee xusuusta xaddidan, habka fudud ee musl ayaa laga yaabaa in la door bidayo inkasta oo wax soo saarka hoose uu hooseeyo. Inta badan barnaamijyada desktop-ujeedada-guud iyo server-ka, ptmalloc2's 72 KB dusha sare ee bilowga ah waxay u taagan tahay default macquul ah oo si fiican u shaqeeya iyada oo aan la hagaajin.

Hagaajinta Dhaqanka Qoondaynta Hore

Haddii heerka sare ee 72 KB ee ugu horreeya uu si dhab ah dhib u leeyahay kiiskaaga isticmaalka - laga yaabee inaad dhalinayso kumanaan geeddi-socod oo gaaban, mid kastaa wuxuu samaynayaa kaliya sacab muggeed oo qoondayn ah - glibc wuxuu bixiyaa dhowr tunables iyada oo loo marayo mallopt ()iyo MALLOC_qoyska doorsoomayaasha deegaanka.

Habka M_TOP_PAD ayaa xukuma inta xusuusta dheeriga ah ee qoondeeyaha codsado wixii ka baxsan waxa isla markiiba loo baahan yahay. Dejinta 0 oo leh mallopt(M_TOP_PAD, 0)waxay u sheegaysaa qoondeeyaha inuu codsado kaliya waxa loo baahan yahay, taasoo hoos u dhigaysa dulsaarka bilowga ah si weyn. HalbeeggaM_MMAP_THRESHOLDwuxuu maamulaa cabbirka sare kaas oo qoondayntu adeegsatomap beddelkii goobta. The M_TRIM_THRESHOLDku wuxuu xakameeyaa marka xusuusta xorta ah lagu soo celiyo OS. Oo tan iyo glibc 2.26, theglibc.malloc.tcache_countiyoglibc.malloc.tcache_max tunables ayaa kuu ogolaanaya inaad xakamayso habdhaqanka cache dunta.

Si kastaba ha ahaatee, kelmad taxaddar leh: hagaajinta halbeegyadan iyada oo aan si taxaddar leh loo eegayn waxay had iyo jeer wax ka sii dhigtaa. Khaladaadka waxa lagu doortay iyada oo lagu salaynayo xog-ururinta dhabta ah ee aduunka, waxayna u taagan yihiin meel macaan inta badan culayska shaqada. Ilaa aad ka haysato caddayn xooggan oo ka soo baxday soo saarista in malloc-ka-sare uu yahay cidhiidhi - oo aad cabbirtay saamaynta isbeddelladaada - ka tag khaladaadka kali. Hagaajinta degdega ah ee qoondeeyaha ayaa ah qaab si gaar ah loo xiiro yak oo qaatay saacado injineernimo oo aan la tirin karin faa'iido aan muuqan.

Waxa Tani Na Baraysaa Barnaamijyada Nidaamyada

72 KB qarsoodiga qoondaynta koowaad waa, guntiisa, cashar ku saabsanlakabyada abstraction. C++ waxay ku siinaysaa dhalanteed ah inint cusubu qoondeeyo 4 bytes. Halbeegga luqadda ayaa sidaas leh. Qaabka maskaxdaada ayaa sidaas leh. Laakiin inta u dhaxaysa koodkaaga iyo qalabka waxa uu fadhiyaa nidaamyo casri ah oo casri ah - wakhtiga runtime C++, qaybiyaha maktabadda C, nidaamka-hoosaadka xusuusta kernel-ka, iyo qalabka MMU iyo TLB - mid kastaa waxa uu ku darayaa hab-dhaqankiisa, hagaajintiisa, iyo korkiisa.

Tani ma aha cillad. Waa barta dhan ee nidaamka software. Lakab kastaa wuxuu u jiraa inuu xalliyo mushkilad dhab ah: qoondeeyaha ayaa jira markaa uma baahnid inaad samayso wicitaano nidaam qoondayn kasta. Nidaamka xusuusta dalwaddu waa jiraa si aadan si toos ah u maareyn xusuusta jireed. Maamulaha khaladka bogga ayaa jira sidaa darteed xusuusta waxaa loo go'aamiyay caajisnimo oo hufan. Lakab kastaa wuxuu ka ganacsanayaa qadar yar oo daahfurnaan ah oo loogu talagalay xaddi badan oo waxqabad iyo ku habboonaansho ah.

Horumariyayaashu waxay dhisaan hababka ugu kalsoonaan karo, hababka ugu waxqabadka sare leh waa kuwa fahmaya lakabyadan - ma aha sababtoo ah waxay u baahan yihiin inay si joogto ah uga fekeraan iyaga, laakiin sababtoo ah marka ay dhacdo wax lama filaan ah (sida qoondaynta 72 KB qarsoodi ah), waxay leeyihiin qaabka maskaxda si ay u fahmaan sababta. Haddii aad dhisayso nidaamka ganacsiga wakhtiga-dhabta ah, mashiinka ciyaarta, ama goob ganacsi oo u adeegaysa kumanaan isticmaaleyaal ah, awoodda aad u malaynayso waxa koodhkaagu dhab ahaantii ku sameeyo heerka nidaamka waa waxa ka sooca horumariyeyaasha karti u leh kuwa gaarka ah. 72 KB ma aha cayayaan. Waa qoondeeyahaagu shaqadiisa si cajiib ah ayuu u gutaa.

dhiso ganacsigaaga OS maanta

laga bilaabo kuwa madaxa banaan ilaa wakaaladaha, Mewayz waxa ay awoodaa 138,000+ ganacsiyo leh 207 qaybood oo isku dhafan. Ku bilow bilaash, cusbooneysi markaad koraan.

Samee akoon bilaash ah →