Hacker News

Nukatae C++ (m)mama gbãtɔ nye 72 KB ɣesiaɣi?

Nyaŋuɖoɖowo

14 min read Via joelsiks.com

Mewayz Team

Editorial Team

Hacker News

Nya ɣaɣla si Le Wò C++ Mama Gbãtɔ Me

Èŋlɔa C++ ɖoɖowɔɖi bɔbɔe aɖe. int yeye ɖeka. Byte ene. Èdo dzo strace alo ŋkuɖodzinu ƒe nɔnɔmetata si nèlɔ̃ wu, eye afimae wòle — ɖeko wò dɔwɔwɔ bia abe 72 KB ene tso dɔwɔɖoɖoa gbɔ. Menye byte 4 ye o. Menye byte 64 ye o. KB 72 bliboe. Ne èlé ŋku ɖe xexlẽdzesi ma ŋu dũu kpɔ hebia ɖokuiwò be ɖe yeƒe dɔwɔnuwo le alakpa dam na ye hã la, ke menye wò ɖeka koe o. Nuwɔna sia si dze abe ɖe wòwɔ nuku ene la nye nyabiase siwo wobiaa zi geɖe le C++ dɔwɔlawo dome le ŋkuɖodzinu ememenuwo kuku me zi gbãtɔ la dometɔ ɖeka, eye ŋuɖoɖoa kplɔ mí yi mɔzɔzɔ dodzidzɔname aɖe dzi to ƒuƒoƒo siwo bɔbɔ nɔ wò kɔda kple xɔtunu ŋutɔŋutɔ dome.

Nusi Dzɔna Ne Èyɔ yeye

Be nàse 72 KB ƒe xexlẽme gɔme la, ele be nàdi mama ƒe kɔsɔkɔsɔ bliboa. Ne wò C++ kɔda wɔ new int la, nuƒoƒoƒula la ɖea ema gɔme ɖe yɔyɔ na operator new, si le Linux ɖoɖo akpa gãtɔ me la, edea dɔ asi na malloc tso glibc gbɔ. Gake malloc mebiaa kernel la tẽ be wòana ŋkuɖodzinu byte 4 o. Kernel la wɔa dɔ le axawo me — zi geɖe la, 4 KB le x86_64 dzi — eye ga si wozãna ɖe ɖoɖo ƒe yɔyɔ ŋu lolo ŋutɔ ne wotsɔe sɔ kple ŋkuɖodzinu bɔbɔe ƒe mɔɖeɖe. Yɔyɔ brk() alo mmap() na mama ɖekaɖeka ɖesiaɖe ana ɖoɖowɔɖi ɖesiaɖe si menye nu tsɛ o natɔ te.

Ke boŋ glibc ƒe ŋkuɖodzinu mama — dɔwɔwɔ si woyɔna be ptmalloc2, si ŋutɔ dzɔ tso Doug Lea ƒe dlmalloc si wonya nyuie me — wɔa dɔ abe domenɔla ene. Ebiaa ŋkuɖodzinu gãwo tso kernel la gbɔ do ŋgɔ, emegbe ekpaa wo ɖe akpa suewo me ne wò ɖoɖowɔɖia hiã wo. Esiae nye susu vevitɔ si ta wò byte 4 ƒe mama gbãtɔ ʋãa biabia si lolo wu sã na dɔwɔɖoɖoa. Menye nu gblẽm le nu mamãla ŋu o. Enye aɖaŋudzedze.

72 KB la ɖeɖe ɖa: Afisi Byteawo Yi

Gbã ƒe mama ƒe gazazã tso akpa vovovo geɖe siwo wòle be dɔwɔwɔ ƒe ɣeyiɣia nadze egɔme hafi wòateŋu atsɔ ŋkuɖodzinu si woateŋu azã ƒe byte ɖeka gɔ̃ hã ade asi na wò. Akpa ɖesiaɖe gɔmesese ɖea nusita xexlẽmea ɖina ɖe afisi wòɖina ɖo la me.

Gbã la, glibc ƒe malloc dzea main arena gɔme — agbalẽdzikpɔkpɔ ƒe ɖoɖo gbãtɔ si léa ŋku ɖe mamawo katã ŋu le ka vevitɔa dzi. Anyigba sia lɔ metadata na heap, free-list pointers, kple bin structures na mama ƒe lolome vovovowo ɖe eme. Alocator kekea ɖoɖowɔɖi ƒe gbagbã ɖe enu to sbrk() dzi, eye kekeɖenudɔ gbãtɔa ɖua edzi to ememe parameter si woyɔna be M_TOP_PAD, si nye 128 KB ƒe padding gbã. Ke hã, wotrɔa asi le biabia gbãtɔ ŋutɔŋutɔ ŋu na axa ƒe ɖoɖowɔwɔ kple gbagbãƒe si li, si zi geɖe hea biabia gbãtɔ si le sue wu vɛ — zi geɖe la, eɖina ɖe 72 KB ƒe xexlẽme ma gbɔ le dɔwɔwɔ si wodze egɔme yeyee dzi.

Evelia, tso glibc 2.26 ta la, mamala dzea thread-local cache (tcache) gɔme le zazã gbãtɔ me. Bin 64 le tcache la me (ɖeka le mama sue ƒe lolome ƒe hatsotso ɖesiaɖe me), ɖesiaɖe ateŋu alé cached chunks 7. tcache_perthread_struct ŋutɔ ɖua abe KB 1 ene, gake nuwɔna si nye be edze egɔme la ʋãa fefewɔƒea ƒe ɖoɖo si keke ta wu. Etɔ̃lia, C++ ƒe dɔwɔwɔ ƒe ɣeyiɣia wɔ mamawo xoxo hafi wò main() gɔ̃ hã nawɔ dɔ — static constructors, iostream buffer initialization na std::cout kple xɔlɔ̃wo, kple locale setup katã kpena ɖe heap footprint gbãtɔ ma ŋu.

Arena System kple Nusita Do Ŋgɔ Na Numamã Nye Nunya

Nyametsotso be woama ŋkuɖodzinu ƒe akpa gã aɖe do ŋgɔ tsɔ wu be woabiae ɖekaɖeka la menye afɔku le dɔwɔwɔ me o. Enye mɔ̃ɖaŋudɔwɔwɔ ƒe asitsatsa si woɖo koŋ wɔ si ƒo ke ɖe to ɖe ƒe bla nanewo ƒe nuteƒekpɔkpɔ le ɖoɖowo ƒe ɖoɖowɔwɔ me. Yɔyɔ ɖesiaɖe na brk() alo mmap() lɔ nya siwo ƒo xlãe ƒe tɔtrɔ tso zãla ƒe teƒe yi kernel teƒe, tɔtrɔ le dɔwɔwɔ ƒe ŋkuɖodzinu ŋutɔŋutɔ ƒe nɔnɔmetatawo ŋu, kple axadzikplɔ̃ ƒe tɔtrɔ siwo ateŋu adzɔ ɖe eme. Le egbegbe xɔtunuwo me la, ɖoɖo ɖeka yɔyɔ xɔa abe nanoseconds 100-200 ene — nu maɖinu le wo ɖokui si, afɔku gã aɖe le eƒe lolome nu.

Bu ɖoɖowɔɖi aɖe si wɔa mama sue 10,000 le gɔmedzedzea me ŋu kpɔ. Ne womeɖoe do ŋgɔ o la, ema afia be woaƒo ka na ɖoɖowɔɖia ƒe kaƒoƒo 10,000, si axɔ ga si woatsɔ awɔ dɔ dzadzɛ si ade milisekɔnd 1-2. Le fefewɔƒe-si wotu ɖe mamala dzi la, mama gbãtɔ ʋãa ɖoɖo ƒe yɔyɔ ɖeka, eye wowɔa dɔ na mama 9,999 siwo kplɔe ɖo bliboe le zãla ƒe teƒe to pointer arithmetic kple linked-list dɔwɔwɔwo me — ɖesiaɖe xɔa abe nanoseconds 10-50 ene. Akɔntabubua me mekɔ o: do ŋgɔ na mama ɖua dzi le woƒe lolome ƒe ɖoɖo nu.

ƒe nyawo

72 KB si nèkpɔ le wò mama gbãtɔ dzi la menye ŋkuɖodzinu gbegblẽ o — enye dɔwɔwɔ ƒe gadede. Ame si ma nu la le tsatsa dam be wò ɖoɖowɔɖia awɔ ga geɖe kpuie, eye le xexeame ŋutɔŋutɔ ƒe nɔnɔme ɖesiaɖe kloe me la, tsatsadada ma ɖea vi nyuie. Virtual address space si womezã o ƒe gazazã nye zero koŋ le egbegbe 64-bit ɖoɖowo me.

ƒe nyawo

Ŋkuɖodzi ŋutɔŋutɔ vs. Ŋkuɖodzi ŋutɔŋutɔ: Nusita Mehiã O

Nusi ŋu dɔwɔla siwo doa go nuwɔna sia zi gbãtɔ tsi dzi ɖo zi geɖe enye nunɔamesiwo ƒe gbegblẽ. Ne byte 4 koe mehiã la, nukatae nye ɖoɖowɔɖia le 72 KB zãm? Gɔmesese vevitɔe nye be ŋkuɖodzinu ŋutɔŋutɔ menye ŋkuɖodzinu ŋutɔŋutɔ o. Ne glibc keke ɖoɖowɔɖi ƒe gbagbã ɖe enu 72 KB la, kernel la trɔa asi le dɔwɔwɔ ƒe virtual memory mappings ŋu, gake metsɔa physical RAM ɖoa megbe na axa mawo enumake o. Woma axa ŋutɔŋutɔ ŋutɔŋutɔwo ɖe didi nu to axa ƒe vodadawo dzi — ne wò ɖoɖowɔɖi ŋlɔ ɖe adrɛs aɖe koŋ dzi ko hafi kernel la dea ŋkuɖodzinu ƒe axa ŋutɔŋutɔ nɛ.

💡 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 →

Esia fia be togbɔ be wò dɔwɔwɔ ƒe virtual lolome dzina ɖe edzi 72 KB hã la, eƒe resident set size (RSS) — physical RAM ƒe agbɔsɔsɔme si wozã ŋutɔŋutɔ — dzina ɖe edzi to axa siwo ŋu nèka asi ŋutɔŋutɔ la ko. Le new int ɖeka gome la, zi geɖe la, ema nyea axa ɖeka si ƒe lolome nye 4 KB, tsɔ kpe ɖe axa ɖesiaɖe si arena metadata la xɔ ŋu. Virtual space susɔea bɔbɔ nɔ afima, wole klalo na zazã, mexɔa naneke o negbe adrɛs teƒe — si ƒe TB 128 le asiwò le 64-bit Linux system dzi.

Vovototo sia le vevie ŋutɔ ne wole nɔnɔmetatawo wɔm eye wole ŋku lém ɖe nuwɔwɔ ƒe dɔwɔɖoɖowo ŋu. Ne èle kɔmpiuta dɔwɔɖoɖo siwo hiã be woalé ŋku ɖe nunɔamesiwo zazã ŋutɔŋutɔ ŋu — eɖanye SaaS megbenya, microservice, alo numekuku ƒe mɔ̃ abe esiwo zɔna le mɔ̃wo abe Mewayz dzi hena asitsatsa ƒe dɔwɔnawo ene o — ele be nàlé ŋku ɖe RSS ŋu ɣesiaɣi tsɔ wu be nàlé ŋku ɖe eƒe lolome ŋutɔŋutɔ ŋu. Dɔwɔnuwo abe /proc/[pid]/smaps, valgrind --tool=massif, kple pmap ateŋu ana wò ŋutilã me ŋkuɖodzinu ƒe afɔti siwo sɔ pɛpɛpɛ tsɔ wu be nàflu ŋkuɖodzinu ŋutɔŋutɔ ƒe xexlẽdzesiwo.

Alesi Mama Vovovowo Kpɔa Mama Gbãtɔ Gbɔ

72 KB ƒe xexlẽdzesi la nye glibc ƒe ptmaloc2 koŋ. Mamãla bubuwo wɔa asitsatsa vovovowo, eye ga si woama le gɔmedzedzea me la toa vovo le esia nu. Vovototo siawo gɔmesese le vevie ne èle mamala tiam na dɔwɔwɔ siwo ŋu wobua dɔwɔwɔ le.

    ƒe nyawo
  • jemalloc (Facebook, FreeBSD zãnɛ) — Zãa fefewɔƒe ƒe ɖoɖo si le granular wu kple thread-local caches. Gbãtɔ ƒe gazazãwo dina be yeakɔ wu (zi geɖe la, 200+ KB) gake enaa ka geɖe ƒe dɔwɔwɔ nyuie wu le gaƒoɖokui ƒe dzrewɔwɔ si dzi ɖe kpɔtɔ ta.
  • tcmalloc (Google ƒe Thread-Caching Malloc) — Ma ka ɖesiaɖe ƒe cache si ade 2 MB le gɔmedzedzea me, kple aggressive do ŋgɔ ƒe mama. Gbãtɔ ƒe gazazãwo lolo wu, gake mama sue siwo kplɔe ɖo la le kabakaba ŋutɔ.
  • musl libc ƒe malloc — Zãa aɖaŋu si le bɔbɔe wu sã si wotu ɖe mmap dzi na mamawo katã. Gbãtɔ ƒe gazazã le sue (zi geɖe la, KB 4 koe le mama ɖesiaɖe me), gake ga si wozãna ɖe mama ɖesiaɖe ŋu lolo wu le ɖoɖo ƒe kaƒoƒo enuenu ta.
  • mimalloc (Microsoft) — Zãa mama si wotu ɖe akpa dzi kple akpa 64 MB. Gbãtɔ ƒe mama ʋãa 64 MB ƒe virtual reservation (kple ŋutilã me ɖokuitsɔtsɔna suetɔ kekeake), asitsatsa ƒe adrɛs teƒe na nuto tɔxɛ kple throughput.
ƒe nyawo

Tiatia si woawɔ le mama siawo dome nɔ te ɖe wò dɔwɔwɔ ƒe agba dzi bliboe. Le server dɔwɔwɔ siwo le dɔ wɔm ɣeyiɣi didi kple multi-threaded allocation kpekpewo gome la, zi geɖe la, jemalloc alo tcmalloc wɔa dɔ wu glibc ƒe default. Le ŋkuɖodzinu-constrained embedded systems gome la, musl ƒe mɔnu bɔbɔetɔ ate ŋu anyo wu togbɔ be eƒe dɔwɔwɔ le ʋɛ wu hã. Le taɖodzinu gbadzaa ƒe kplɔ̃dzi kple dɔdzikpɔla ƒe dɔwɔwɔ akpa gãtɔ gome la, ptmalloc2 ƒe 72 KB ƒe gɔmedzedze ƒe gazazã tsi tre ɖi na ɖoɖo si sɔ si wɔa dɔ nyuie ne womewɔa dɔ nyuie o.

Tɔtrɔ ɖe Mama ƒe Nuwɔna Gbãtɔ ŋu

Ne 72 KB ƒe gɔmedzedze ƒe gazazã gbãtɔ nye kuxi vavã na wò zazã ƒe nɔnɔme — ɖewohĩ èle dɔwɔwɔ akpe geɖe siwo nɔa anyi kpuie la dzim, wo dometɔ ɖesiaɖe le mama ʋɛ aɖewo ko wɔm — glibc naa tunables geɖe to mallopt() kple MALLOC_ ƒomea ƒe nutome tɔtrɔwo dzi.

M_TOP_PAD ƒe nɔnɔmetata la kpɔa ŋkuɖodzinu bubu agbɔsɔsɔme si mamala la abia wu esi hiã enumake. Ne èɖoe ɖe 0 kple mallopt(M_TOP_PAD, 0) la, egblɔna na mamala be wòabia nusi hiã ko, si ɖea gbãtɔ ƒe gazazã dzi kpɔtɔna ŋutɔ. M_MMAP_THRESHOLD ƒe nɔnɔmetata kpɔa lolome si le etame si mamawo zãa mmap ɖe fefewɔƒea teƒe. M_TRIM_THRESHOLD kpɔa ŋusẽ ne wogbugbɔ ŋkuɖodzinu si woɖe asi le la yi OS la me. Eye esi wònye glibc 2.26 ta la, glibc.malloc.tcache_count kple glibc.malloc.tcache_max tunables na nèkpɔa thread cache ƒe nuwɔna dzi.

Ke hã, nuxlɔ̃amenya aɖe: ne ètrɔ asi le parameter siawo ŋu nyuie evɔ womatsɔ benchmarking o la, egblẽa nu le nuwo ŋu ɣesiaɣi kloe. Wonɔ te ɖe xexeame ŋutɔŋutɔ ƒe nɔnɔmetata gbogbo aɖewo dzi tia nusiwo woɖo ɖi, eye wole tsitre ɖi na teƒe vivi aɖe na dɔ akpa gãtɔ. Negbe ɖe kpeɖodzi sẽŋuwo le asiwò tso nuwɔwɔ ƒe nɔnɔmetatawo me be malloc ƒe ta dzi nye aŋetu — eye nèdzidze wò tɔtrɔwo ƒe ŋusẽkpɔɖeamedzi — gblẽ defaults la ɖi. Allocator ƒe nyonyome kaba nye yak lũlũ ƒomevi aɖe si me ayedzedze le etɔxɛe si xɔ mɔ̃ɖaŋu gaƒoƒo manyaxlẽwo hena viɖe sue aɖe ko.

Nusi Esia Fia Mí Tso Systems Programming Ŋu

72 KB ƒe mama gbãtɔ ƒe nya ɣaɣla la nye, le eƒe gɔmedzedzea me la, nusɔsrɔ̃ tso abstraction layers ŋu. C++ naa wò susu be new int ma byte 4. Gbegbɔgblɔ ƒe dzidzenua gblɔe nenema. Wò susu ƒe kpɔɖeŋua gblɔe nenema. Gake le wò kɔda kple xɔtunu dome la, ɖoɖo deŋgɔwo ƒe ƒuƒoƒo aɖe bɔbɔ nɔ anyi — C++ ƒe dɔwɔwɔ ƒe ɣeyiɣi, C agbalẽdzraɖoƒe ƒe mama, kernel ƒe virtual memory subsystem, kple xɔtunu ƒe MMU kple TLB — wo dometɔ ɖesiaɖe tsɔa eya ŋutɔ ƒe nuwɔna, nyonyo, kple edzi kpena ɖe eŋu.

Esia menye vodada o. Enye nu vevitɔ si le systems software ŋu. Layer ɖesiaɖe li be woakpɔ kuxi ŋutɔŋutɔ gbɔ: allocator la li eyata mehiã be nàwɔ system calls na allocation ɖesiaɖe o. Virtual memory system la li eyata mehiã be nàkpɔ physical memory dzi tẽ o. Axa ƒe vodadawo gbɔkpɔla li eyata wowɔa ŋkuɖodzinu kuviatɔe eye wòwɔa dɔ nyuie. Layer ɖesiaɖe dzraa nu sue aɖe si le gaglãgbe hena dɔwɔwɔ kple alesi wòanɔ bɔbɔe.

Dɔwɔla siwo tua ɖoɖo siwo ŋu kakaɖedzi le wu, siwo wɔa dɔ nyuie wu la nye amesiwo sea ƒuƒoƒo siawo gɔme — menye le esi wòhiã be woabu wo ŋu ɣesiaɣi ta o, ke boŋ le esi nane si womele mɔ kpɔm na o dzɔ (abe 72 KB ƒe mama ɣaɣla ene), susu ƒe kpɔɖeŋu le wo si be woase nusitae gɔme. Eɖanye asitsatsa ƒe ɖoɖo si le ɣeyiɣi ŋutɔŋutɔ me, fefewɔmɔ̃, alo asitsaƒe si le subɔsubɔm na ezãla akpe geɖe o, ŋutete si le asiwò be nàde ŋugble le nusi wò kɔpiwɔwɔ wɔna ŋutɔŋutɔ le ɖoɖoa ƒe ɖoƒe ŋue nye nusi ma dɔwɔla bibiwo ɖa tso esiwo to vovo gbɔ. 72 KB la menye nu gbegblẽ o. Enye wò allocator si le eƒe dɔ wɔm nyuie.

Tu Wò Dɔwɔƒe ƒe OS Egbea

Tso dɔwɔla siwo le wo ɖokui si dzi va ɖo dɔwɔƒewo dzi la, Mewayz naa ŋusẽ asitsaha 138,000+ kple modules 207 siwo wotsɔ wɔ ɖekae. Dze egɔme femaxee, do ŋgɔ ne ètsi.

Wɔ Akɔntabubu Femaxee →
ƒe nyawo

Try Mewayz Free

All-in-one platform for CRM, invoicing, projects, HR & more. No credit card required.

Start managing your business smarter today

Join 30,000+ businesses. Free forever plan · No credit card required.

Ready to put this into practice?

Join 30,000+ businesses using Mewayz. Free forever plan — no credit card required.

Start Free Trial →

Ready to take action?

Start your free Mewayz trial today

All-in-one business platform. No credit card required.

Start Free →

14-day free trial · No credit card · Cancel anytime