Hacker News

Apay a ti umuna a C++ (m)allocation ket kanayon a 72 KB?

Dagiti Komento

12 min read Via joelsiks.com

Mewayz Team

Editorial Team

Hacker News

Ti Misterio iti Likud ti Umuna a C++ Allocation-mo

Agsuratka iti simple a programa ti C++. Maymaysa a baro nga int. Uppat a byte. Ipaputokmo ti strace wenno ti paboritom a memory profiler, ket adda dayta — ti prosesom ket nagkiddaw laeng iti agarup a 72 KB manipud iti sistema ti panagpataray. Saan nga 4 byte. Saan nga 64 byte. Ti naan-anay a 72 KB. No napadasam a nakatungtung-ed iti dayta a numero ket pinampanunotmo no agul-ulbod kenka ti tooling-mo, saankan nga agmaymaysa. Daytoy a kasla karkarna a kababalin ket maysa kadagiti masansan a maisaludsod kadagiti C++ a developer a mangkalkali kadagiti akin-uneg ti memoria iti umuna a gundaway, ken ti sungbat ket mangiturong kadatayo iti makaawis a panagdaliasat kadagiti suson a nakatugaw iti nagbaetan ti kodigom ken ti aktual a hardware.

Ania ti Mapasamak No Awagam ti baro

Tapno maawatan ti 72 KB a bilang, kasapulam a tuntonen ti naan-anay a kadena ti pannakabingbingay. No ti kodigom ti C++ ket mangipatungpal ti baro nga int, ti kompiler ket ipatarusna dayta iti panagayab iti operator new, nga iti kaaduan a sistema ti Linux ket mangidelegado iti malloc manipud iti glibc. Ngem ti malloc ket saan a direkta a dumawat iti kernel para iti 4 a byte ti memoria. Ti kernel ket agtartaray kadagiti panid — kadawyan a 4 KB iti x86_64 — ken ti gastos ti panagayab ti sistema ket dakkel unay a relatibo iti simple a panagserrek ti memoria. Ti panagayab ti brk() wenno mmap() para iti tunggal maysa nga indibidual a pannakabingbingay ket mangaramidto ti ania man a saan a trivial a programa a manggiling iti panagsardeng.

Imbes ketdi, ti memory allocator ti glibc — ti maysa nga implementasion a tinawtawagan iti ptmalloc2, a mismo a nagtaud manipud iti klasiko a dlmalloc ni Doug Lea — ket agtignay a kas maysa a mangibabaet. Daytoy ket agkidkiddaw kadagiti dadakkel a bloke ti memoria manipud iti kernel a nasaksakbay, kalpasanna ikitikitna dagitoy kadagiti babbabassit a pedaso bayat a kasapulan ti programam dagitoy. Daytoy ti kangrunaan a rason ti umuna nga 4-byte a pannakabingbingaymo ket mangtignay ti dakdakkel nga amang a kiddaw iti sistema ti panagpataray. Saan a masayang ti allocator. Daytat’ panagbalin nga estratehiko.

Panangdisseksion ti 72 KB: Sadino ti Papanan dagiti Byte

Ti umuna a panagbingbingay nga overhead ket naggapu manipud kadagiti sumagmamano a naisangayan a paset a ti oras ti panagtaray ket masapul nga irugi sakbay a mabalinna nga ited kenka urayno ti maymaysa a byte ti mausar a memoria. Ti pannakaawat iti tunggal paset ket mangilawlawag no apay a ti numero ket agdisso iti pagdissuanna.

Umuna, ti malloc ti glibc ket mangirugi ti kangrunaan nga arena — ti kangrunaan nga estruktura ti panagidulin ti libro a mangsurot kadagiti amin a pannakabingbingay iti kangrunaan a thread. Daytoy nga arena ket mangiraman ti metadata para kadagiti bunton, dagiti nawaya-a-listaan ​​a mangitudo, ken dagiti estruktura ti bin para kadagiti nadumaduma a kadakkel ti panagbingbingay. Ti allokator ket mangpalawa ti panagsina ti programa babaen ti sbrk(), ken ti rugi a panagpaatiddog ​​ket iturturayan babaen ti akin-uneg a parametro a tinawtawagan iti M_TOP_PAD, a daytoy ket agdefault iti 128 KB ti padding. Nupay kasta, ti aktual nga umuna a kiddaw ket nabaliwan para iti panagitunos ti panid ken ti addan a posision ti panagsardeng, a masansan nga agresulta iti basbassit nga umuna a kiddaw — kadawyan a panagdisso iti asideg dayta a 72 KB a bilang iti baro a nairugi a proseso.

Maikadua, manipud idi glibc 2.26, ti allocator ket mangirugi ti thread-local cache (tcache) iti umuna a panagusar. Ti tcache ket aglaon kadagiti 64 a bin (maysa iti tunggal maysa a klase ti kadakkel ti bassit-a-panagbingbingay), tunggal maysa ket makabael a mangtengngel aginggana kadagiti 7 a nai-cache a pedaso. Ti tcache_perthread_struct a mismo ket agkonsumo iti agarup a 1 KB, ngem ti aramid ti panangirugi iti daytoy ket mangtignay ti nalawlawa a panagisaad ti arena. Maikatlo, ti oras ti panagtaray ti C++ ket nakaaramiden kadagiti panagbingbingay sakbay pay a ti main()-mo ket agtaray — dagiti estatiko a konstruktor, ti panangrugi ti iostream a buffer para iti std::cout ken dagiti gagayyem, ken ti panagisaad ti lokal ket amin ket makatulong iti dayta nga umuna a tunton ti saka.

Ti Sistema ti Arena ken Apay a Nasirib ti Pre-Allocation

Ti pangngeddeng a nasakbay a mangituding ti dakkel a pedaso ti memoria imbes a kiddawen daytoy a saggaysa ket saan nga aksidente ti pannakaipatungpal. Daytoy ket inggagara a panagtagilako ti inhenieria a nairamut iti pinulpullo a tawen a kapadasan iti panagprograma kadagiti sistema. Tunggal panagayab iti brk() wenno mmap() ket mairaman ti panagbalbaliw ti konteksto manipud iti espasio ti agar-aramat aginggana ti espasio ti kernel, panagbalbaliw kadagiti panagimapa ti birtual a memoria ti proseso, ken dagiti mabalin a panagpabaro ti lamisaan ti panid. Iti moderno a hardware, ti maymaysa a panagayab ti sistema ket aggatad iti agarup a 100-200 a nanosegundos — awan pategna iti panagbukod, didigra iti sukog.

Ibilang ti programa a mangaramid ti 10,000 a babassit nga alokasion bayat ti panangrugi. No awan ti pre-allocation, kayatna a sawen dayta ti 10,000 nga awag ti sistema, nga aggatad iti agarup 1-2 milisegundos ti puro nga overhead. Iti maysa nga arena-a naibatay nga allokator, ti umuna a panagbingbingay ket mangtignay ti maymaysa a panagayab ti sistema, ken dagiti sumaganad a 9,999 a panagbingbingay ket naserbisioan nga interamente iti espasio ti agar-aramat babaen ti puntos nga aritmetika ken dagiti naisilpo-a-lista nga operasion — tunggal maysa ket mangala ti agarup a 10-50 a nanosegundos. Saan a mapagduaduaan ti matematika: mangabak ti pre-allocation babaen kadagiti order ti magnitude.

Ti 72 KB a makitam iti umuna nga alokasionmo ket saan a nasayang a memoria — daytoy ket maysa a panagpuonan ti panagaramid. Ti allocator ket agpusta a ti programam ket mangaramid iti ad-adu nga alokasion iti mabiiten, ket iti dandani tunggal pudno a senario, dayta a taya ket agbayad a guapo. Ti gastos ti saan a naus-usar a birtual nga espasio ti adres ket nasken a sero kadagiti moderno a 64-bit a sistema.

Birtual a Lagip vs. Pisikal a Lagip: Apay a Saan a Napateg

Ti gagangay a pakaseknan kadagiti agparparang-ay a makasabet iti daytoy a kababalin iti umuna a gundaway ket ti pannakasayang ti rekurso. No kasapulak laeng ti 4 a bytes, apay a ti programak ket agkonsumo iti 72 KB? Ti kritikal a pannakaawat ket ti ti birtual a memoria ket saan a pisikal a memoria. No ti glibc ket mangpalawa ti panagsina ti programa babaen ti 72 KB, ti kernel ket mangpabaro kadagiti panagimapa ti birtual a memoria ti proseso, ngem saan a dagus a mangsuporta kadagidiay a panid babaen ti pisikal a RAM. Dagiti aktual a pisikal a panid ket naited no kasapulan babaen ti dagiti biddut ti panid — no laeng ti programam ket agsurat iti espesipiko a pagtaengan a ti kernel ket mangituding ti pudno a panid ti memoria iti daytoy.

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

Daytoy ket kayatna a sawen nga urayno ti birtual a kadakkel ti prosesom ket dumakkel iti 72 KB, ti residente a kadakkel ti set (RSS) na — ti kaadu ti pisikal a RAM nga aktual a nabusbos — ket dumakkel babaen laeng dagiti panid nga aktual a sagidenmo. Para iti maymaysa a baro nga int, dayta ket kadawyan a maysa a 4 KB a panid, agraman ti ania man a panid a sakupen ti metadata ti arena. Ti nabati a birtual nga espasio ket agtugaw sadiay, a nakasagana para iti panagusar, nga awan ti magastos no di ti espasio ti adres — a daytoy ket addaanka iti 128 TB iti 64-bit a sistema ti Linux.

Daytoy a panaglalasin ket kritikal no agpropil ken mangmonitor kadagiti aplikasion ti produksion. No mangbangbangonka ti software a kasapulan a mangsurot ti pudno a panagusar ti rekurso — urayno daytoy ket maysa a SaaS a backend, maysa a mikroserbisio, wenno maysa nga analitiko a tubo a kas dagitoy nga agtartaray kadagiti plataporma a kas ti Mewayz para kadagiti panagpataray ti negosio — nasken a kanayon a bantayan ti RSS imbes a ti birtual a kadakkel. Dagiti ramit a kas ti /proc/[pid]/smaps, valgrind --tool=massif, ken pmap ket makaited kenka kadagiti umiso a pisikal a tugot ti saka ti memoria imbes a dagiti makaallilaw a bilang ti birtual a memoria.

Kasano a Dagiti Nadumaduma nga Allokator ket Mangtamingda ti Umuna nga Allokasion

Ti 72 KB a bilang ket espesipiko iti ptmalloc2 ti glibc. Dagiti dadduma nga alokador ket mangaramidda kadagiti nadumaduma a panagtagilako, ken ti damo nga allocation overhead ket agdumaduma a maitunos. Ti pannakaawat kadagitoy a panagdumaduma ket napateg no agpili ti allocator para kadagiti aplikasion a sensitibo iti panagaramid.

  • jemalloc (inus-usar babaen ti Facebook, FreeBSD) — Agus-usar ti ad-adu a granular nga estruktura ti arena nga addaan kadagiti thread-local a cache. Ti damo nga overhead ket aggargaraw a nangatngato (masansan a 200+ KB) ngem mangipaay ti nasaysayaat a multi-threaded a panagaramid gapu ti naikkat a panagsusuppiat ti kandado.
  • tcmalloc (Ti Thread-Caching Malloc ti Google) — Mangituding ti tunggal-thread a cache iti agarup a 2 MB babaen ti default, nga addaan iti agresibo a nasakbay a panagbingbingay. Ti umuna nga overhead ket nangatngato, ngem dagiti sumaganad a babassit a pannakabingbingay ket napardas unay.
  • musl libc's malloc — Agus-usar ti nasimsimple nga amang a disenio a naibatay iti mmap para kadagiti amin a pannakabingbingay. Ti umuna a gastos ket bassit (masansan a 4 KB laeng iti tunggal maysa a pannakabingbingay), ngem ti gastos iti tunggal maysa a pannakabingbingay ket nangatngato gapu kadagiti ad-adu a masansan nga awag ti sistema.
  • mimalloc (Microsoft) — Agus-usar ti segment-based a panagbingbingay nga addaan kadagiti 64 MB a paset. Ti umuna a pannakabingbingay ket mangtignay ti 64 MB a birtual a reserbasion (nga addaan iti bassit a pisikal a panagkumit), ti espasio ti adres ti panagtagilako para iti naisangayan a lokalidad ken throughput.

Ti panagpili iti nagbaetan dagitoy nga allokator ket agpannuray nga interamente iti karga ti trabahom. Para kadagiti napaut nga aplikasion ti serbidor nga addaan iti nadagsen a multi-threaded a panagbingbingay, ti jemalloc wenno tcmalloc ket kadawyan a nalablabes ngem ti default ti glibc. Para kadagiti memoria-a-natengngel a naikabil a sistema, ti nasimsimple a pamay-an ti musl ket mabalin a nasaysayaat iti laksid ti nababbaba a throughput. Para kadagiti kaaduan a sapasap-a-panggep nga aplikasion ti desktop ken serbidor, ti 72 KB nga umuna nga overhead ti ptmalloc2 ket mangibagi ti nainkalintegan a default nga agtrabaho a nasayaat nga awan ti panagtuno.

Panangituno ti Umuna a Kababalin ti Panagbingbingay

No ti default a 72 KB nga umuna nga overhead ket pudno a problemado para iti kaso ti panagusarmo — nalabit nga ag-spawning ka kadagiti rinibu nga ababa ti panagbiagna a proseso, tunggal maysa ket mangaramid laeng kadagiti sumagmamano a pannakabingbingay — ti glibc ket mangipaay kadagiti sumagmamano a tunable babaen ti mallopt() ken ti MALLOC_ a pamilia dagiti variable ti aglawlaw.

Ti parametro ti M_TOP_PAD ket mangkontrol no kasano kaadu ti ekstra a memoria ti kiddaw ti allocator iti labes ti dagus a kasapulan. Ti panangisaad iti daytoy iti 0 babaen ti mallopt(M_TOP_PAD, 0) ket mangibaga iti allokator a dumawat laeng iti kasapulan, a mangkissay iti rugi nga overhead iti dakkel. Ti parametro ti M_MMAP_THRESHOLD ket mangkontrol ti kadakkel iti ngato a dagiti panagbingbingay ket agus-usar ti mmap imbes a ti arena. Ti M_TRIM_THRESHOLD ket mangkontrol no ti nawaya a memoria ket maisubli iti OS. Ket manipud idi glibc 2.26, dagiti glibc.malloc.tcache_count ken glibc.malloc.tcache_max a tunable ket palubosannaka a mangkontrol ti kababalin ti thread cache.

Nupay kasta, maysa a sao ti panagannad: ti panangituno kadagitoy a parametro nga awan ti naannad a panagbenchmark ket gistay kanayon a mangpakaro kadagiti bambanag. Dagiti default ket napili a naibatay iti nasaknap a pudno a lubong a panagpropil, ken dagitoy ket mangibagi ti nasam-it a lugar para iti dakkel a kaaduan kadagiti karga ti trabaho. Malaksid no addaanka iti napigsa nga ebidensia manipud iti production profiling a ti malloc overhead ket maysa a bottleneck — ken narukodmo ti epekto dagiti panagbalbaliwmo — bay-am laeng dagiti default. Ti nasapa a panagoptimisar ti allocator ket maysa a partikular a nasikap a porma ti panagbarbas ti yak a nangbusbos kadagiti di mabilang nga oras ti inhenieria para iti saan unay a pagimbagan.

No Ania ti Isuro Daytoy Kadatayo Maipapan iti Panagprograma ti Sistema

Ti 72 KB nga umuna-a-panagbingbingay a misterio ket, iti tengnga daytoy, maysa a leksion maipapan kadagiti abstraction layers. Ti C++ ket mangted kenka ti ilusion a ti baro nga int ket mangituding ti 4 a byte. Kasta ti kuna ti pagalagadan ti pagsasao. Kasta ti kuna ti mental model-mo. Ngem iti nagbaetan ti kodigom ken ti hardware ket agtugaw ti maysa a bunton dagiti sopistikado a sistema — ti oras ti panagtaray ti C++, ti C library allocator, ti birtual a subsistema ti memoria ti kernel, ken ti MMU ken TLB ti hardware — tunggal maysa ket manginayon kadagiti bukodna a kababalin, panagoptimisar, ken overhead.

Saan a pagkurangan daytoy. Dayta ti intero a punto ti systems software. Tunggal sapasap ket adda tapno mangrisut ti pudno a parikut: adda ti allokator isu a saanmo a kasapulan ti agaramid kadagiti panagayab ti sistema para iti tunggal maysa a panagbingbingay. Adda ti birtual a sistema ti memoria isu a saanmo a kasapulan a direkta nga imanehar ti pisikal a memoria. Adda ti page fault handler isu a ti memoria ket naikumit a natangken ken episiente. Tunggal suson ket agtagilako ti bassit a kaadu ti kinalawag para iti dakkel a kaadu ti panagaramid ken kombeniente.

Dagiti agparparang-ay a mangbangon kadagiti kaaduan a mapagtalkan, kangatuan ti panagaramidna a sistema ket dagidiay makaawat kadagitoy a sapasap — saan a gapu ta kasapulanda a panunoten dagitoy a kanayon, ngem gapu ta no adda banag a di ninamnama a mapasamak (kas ti misterioso a 72 KB a pannakabingbingay), addaanda iti mental a modelo tapno maawatan no apay. Mangbangbangonka man iti aktual nga oras a sistema ti panagtagilako, makina ti ay-ayam, wenno plataporma ti negosio a mangserserbi kadagiti rinibu nga agus-usar, ti abilidad a mangrason maipapan iti aktual nga ar-aramiden ti kodigom iti lebel ti sistema ket isu ti mangisina kadagiti makabael a developer manipud kadagiti naisangsangayan. Ti 72 KB ket saan a bug. Dayta ti allocator-mo nga agar-aramid iti trabahona a naraniag.

Ibangon ti OS ti Negosyom Ita nga aldaw

Manipud kadagiti freelancer aginggana kadagiti ahensia, ti Mewayz ket mangpabileg kadagiti 138,000+ a negosio nga addaan kadagiti 207 a naikaykaysa a modulo. Mangrugika a libre, ag-upgrade inton dumakkelka.

Mangaramid ti Libre nga Kuenta →

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