abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    včera 08:11 | Komunita

    Firma X zaslala předžalobní výzvu vývojáři projektu Nitter (Wikipedia), open-source alternativního frontendu k sociální síti X (ex-Twitter), a provozovatelům instancí jako XCancel, které umožňovaly číst příspěvky bez přihlášení, reklam a javascriptu. Údajně se dopouštějí „sběru dat“. Zdrojový kód Nitteru vývojář archivoval. Vývoj již dříve přerušil v roce 2024 po tehdejším omezení API X. X je dceřiná společnost SpaceXAI Elona Muska, provozující mj. kontroverzního chatbota Grok.

    |🇵🇸 | Komentářů: 13
    včera 02:22 | Nová verze

    Bylo vydáno Ubuntu 26.04.1 LTS, tj. první opravné vydání Ubuntu 26.04 LTS s kódovým názvem Resolute Raccoon. Přehled novinek a oprav na Discourse.

    Ladislav Hagara | Komentářů: 1
    včera 02:11 | Zajímavý článek

    Národní úřad pro kybernetickou a informační bezpečnost (NÚKIB) vydal Zprávu o stavu kybernetické bezpečnosti ČR za rok 2025 (pdf). Incidentů ubylo, sofistikovanost útočníků roste.

    Ladislav Hagara | Komentářů: 0
    včera 00:55 | Nová verze

    Open source softwarový stack AMD ROCm (Wikipedie) pro vývoj AI a HPC na GPU od AMD byl vydán v nové major verzi 10.0. S ROCm.AI. Přehled novinek v aktualizované dokumentaci.

    Ladislav Hagara | Komentářů: 0
    27.8. 22:11 | Bezpečnostní upozornění

    Finanční skupina Partners se stala minulou neděli obětí kybernetického útoku, při kterém se útočníci dostali k některým osobním údajům klientů. Společnost o tom informovala ve čtvrtek. Ujišťuje, že peníze klientů nejsou v ohrožení. „Kybernetický útok zasáhl část IT infrastruktury naší společnosti. Ihned po zjištění útoku jsme s pomocí externích bezpečnostních odborníků začali intenzivně pracovat na minimalizaci škod. Útočníci se

    … více »
    Ladislav Hagara | Komentářů: 0
    27.8. 03:55 | IT novinky

    Americká technologická společnost Meta Platforms se dohodla, že zaplatí až zhruba 18 miliard dolarů (asi 373 miliard Kč) za mimosoudní urovnání sporu o závislosti dětí na sociálních sítích a provede významné změny pro jejich používání mladistvými. Téměř tři desítky států USA firmu v roce 2023 obvinily z toho, že sítě Facebook a Instagram vědomě navrhla tak, aby u dětí vyvolávaly závislost, a zatajovala tyto dopady před veřejností. Firma se

    … více »
    Ladislav Hagara | Komentářů: 3
    27.8. 02:55 | Komunita

    Byl publikován aktuální přehled dění a novinek z vývoje Asahi Linuxu, tj. Linuxu pro Apple Silicon. Blíží se vydání podporující čipy M3. Vývojáře lze podpořit na GitHub Sponsors a Open Collective.

    Ladislav Hagara | Komentářů: 0
    26.8. 16:55 | Nová verze

    Kancelářský balík LibreOffice byl vydán ve verzi 26.8. Mimo jiné vylepšuje typografii a kompatibilitu s formáty MS Office, více v poznámkách k vydání.

    |🇵🇸 | Komentářů: 0
    26.8. 14:55 | Nová verze

    Armbian, tj. linuxová distribuce založená na Debianu a Ubuntu optimalizovaná pro jednodeskové počítače na platformě ARM a RISC-V, ke stažení ale také pro Intel a AMD, byl vydán ve verzi 26.8. Přehled novinek v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 7
    26.8. 11:44 | Nová verze

    Byla vydána nová verze 23.1.0, tj. první stabilní verze z nové řady 23.1.x, překladačové infrastruktury LLVM (Wikipedie). Přehled novinek v poznámkách k vydání: LLVM, Clang, LLD, Extra Clang Tools, Libc++, Polly a Flang.

    Ladislav Hagara | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (10%)
     (7%)
     (2%)
     (19%)
     (29%)
     (7%)
     (6%)
     (2%)
     (15%)
     (22%)
    Celkem 2509 hlasů
     Komentářů: 31, poslední 13.8. 00:27
    Rozcestník

    Za vším hledej new/malloc

    17.7.2009 18:13 | Přečteno: 1982× | programování | Výběrový blog

    Nejbizarnejší performance bugy měly vždy do činění s new/malloc. Když 65% času algoritmu se stráví v new/malloc, je to znamení že alokátor bude třeba nejspíš vyměnit.

    Dlouho jsme řešili proč některé operace naší aplikace trvají extrémně dlouho na msvc. Stejný testcase přeložen s msvc 7.1 na windows zabral klidně i 10x víc času než na linuxu s gcc 4.1.2 (opět extrémní případy).

    Malé kousky paměti

    Pokaždé v testcase figuroval celkem veliký syntaktický strom (AST) s řádově 500 tisíc uzlů a tím pádem veliké tabulky křížových referencí. Uzel v AST stromu navíc obsaje atributy, typicky několik pointrů na referencované deklarace, někdy několik textových atributů nebo seznam elementů (třeba pro volání metody). Každý uzel je alokován přes new jako smart pointer (tzn. mnoho alokací malých kousků paměti).

    Testcase pozůstával z nalezení tranzitivního uzávěru části stromu (aby se posléze skopírovaly i deklarace referencované přes weak pointery), kopie uzávěru a vybudování tabulek referencí pro skopírovaný podstrom (pak nějaké další operace).

    Profiler odhalil že 50-75% času ve windows bylo stráveno v - new/malloc !!!. Přesněji ve systémových funkcích RtlAllocateHeap, RtlReAllocateHeap, RtlInitializeCriticalSection volané přes new/malloc. Výsledky profileru jako na následovném obrázku vůbec nebyly výjimečné:

    profiler ukazuje 67% v
RtlReAllocateHeap

    Co uděláte když vám kód zpomaluje builtin malloc/new? Windows nemá mechanizmus typu LD_PRELOAD, výměna builtin alokátoru (new/malloc) je celkem "chlupatá" záležitost. Dlouho jsme to řešili minimalizací kopírovaní struktur s velikým počtem malých kousků paměti (části AST, rebuild tabulky referencí). Vždy to alespoň částečně zabralo, ale nakonec to nebylo dostačující.

    Specializované alokátory

    (Téměř) každá STL "kontejnerová" šablona má jako poslední argument alokátor, který je možno změnit ze std::allocator na vlastní alokátor. Podle profileru by specializovaný alokátor pomohl nejvíc AST stromu a tabulkám referencí. Nejjednodušší to bylo vyzkoušet u tabulky referencí (velká hash_mapa mapující ukazatel symbolu na ukazatel strukturu XrefEntry s třema std::sety).

    Volba náhradního alokátoru padla na pythoní alokátor, protože jsem ho celkem dobře znal - kdysi jsem ho ladil kvůli možným memory leakům (nebyly nakonec v alokátoru, ale ve volajícím kódu). Pythoní alokátor není thread-safe, ale pro dané omezené použití v tabulkách referencí to nevadilo. Jediný trik navíc je nutnost přeložit pythoní alokátor s překladačem C a ne C++ (předpokládá specifické chování překladače C, co sice není úplně čisté, ale je to hodně dobře vyzkoušeno - psát vlastní alokátor je zábava na tak dva roky).

    Pythoní alokátor je specializován na alokování velkého množství malých bloků (inty, listy apod). Různé bloky strká do různých "arén" s granularitou 8 bajtů (do limitu 256 bajtů, větší alokace jsou žádány od builtin mallocu). Pro podrobný popis se podívejte se na komentáře v Pythoním Objects/obmalloc.c.

    Pro použití pythoního alokátoru se STL se přidala šablona implementující model STL alokátoru, který volá PyObject_Malloc a PyObject_Free místo běžných alokačních funkcí. Tato šablona se použila jako alokátor v tabulkách referencí (u zmíněný hash_mapy a členských std::setů XrefEntry). Pak ještě zlepšily výkon per-class operatory new a delete u XrefEntry, které taky volaly pythoní alokátor.

    Low Fragmentation Heap (LFH)

    Výměna std::allocator za pythoní alokátor zrychlila ve windows problematické speciální případy o cca 40%. I když stále to bylo viditelně pomalejší než na linuxu.

    Snad s úplně podivně zvráceným štestím jsem po tisícere googlení a po roku řešení msvc/windows alokátoru další náznak našel na stackoverflow.com. Dotaz byl na úplně jiný problém, ale v komentářích byla zmínka o Low Fragmentation Heap (LFH). LFH je vhodná zrovna pro případy, kdy se alokuje velké množství po malých kouscích. LFH interně pak obsluhuje požadavky do 16 kB, větší jsou alokovány "starým" alokátorem. Od Vist výše je LFH defaultní heap.

    V MSDN jsem našel způsob, jak nastavit LFH pro heap aktuálního procesu, ale navíc zabralo to pokroucené štěstí a zkusil jsem to nastavit pro všechny heapy procesu (použití LFH pro heap získanou přet GetProcessHeap to nemělo žádný výsledek v rychlosti). Zázrak! Spousta operací zahrnující kopii části AST stromu se zrychlila navíc o 25-50% !

    Jinak LFH je celkem černá magie a existuje spousta důvodů, proč se LFH nemusí povést zapnout.

    Zapnutí Low Fragmentation Heap (LFH)

    Nastavení LFH pro všechny heapy procesu.

    Porovnání alokátorů

    Hlavný rozdíl je v bezpečnosti použití v multi-thread aplikacích. (Dále budu psát zkráceně pyalloc místo pythoní alokátor). Pyalloc thread-safe není, ostatní dva jsou (gcc/glibc, msvc). Ve speciálních případech v tomhle zápisku neměl pyalloc žádný měřitelný efekt oproti linuxovému gcc/glibc (gcc 4.1.2, glibc 2.5), jak v rychlosti tak ve množství spotřebované paměti. Nejspíš by měl efekt při fragmentaci paměti u hash_setu (viz minulý zápisek).

    U msvc/windows byl lepší pyalloc jak v rychlosti a i v memory footprintu proti msvc/windows alokátoru bez LFH (v množství použité paměti byl pyalloc většinou o 2-5% lepší, nejhorší naměřený případ byl 0.5% overhead pyallocu). U msvc/windows byl pyalloc vždy lepší v množství použité paměti proti čistému LFH (o cca 5-10%).

    msvc/pyalloc+LFH proti msvc/LFH:
    pyalloc+LFH vždy lepší o 2-10% v množství spotřebované paměti a o 10-20% lepší v rychlosti v případech kde hodně záviselo na budování a hledání v tabulkách referencí.

           

    Hodnocení: 100 %

            špatnédobré        

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    17.7.2009 19:14 snajpa | skóre: 20 | blog: snajpuv_blocek | Brno
    Rozbalit Rozbalit vše Re: Za vším hledej new/malloc
    Nečetl jsem předchozí diskuze pod podobnými články, možná to tam zaznělo, ale proč mi to připadá jako výstup z google translate?
    --- vpsFree.cz --- Virtuální servery svobodně
    17.7.2009 20:03 12345 | skóre: 41 | blog:
    Rozbalit Rozbalit vše Re: Za vším hledej new/malloc
    To by u Google byla pořádná oslava, kdyby něčeho takového dosáhli :-)
    17.7.2009 21:37 snajpa | skóre: 20 | blog: snajpuv_blocek | Brno
    Rozbalit Rozbalit vše Re: Za vším hledej new/malloc
    Asi to bude tím, že to je klasická programátorština :-D
    --- vpsFree.cz --- Virtuální servery svobodně
    limit_false avatar 17.7.2009 22:09 limit_false | skóre: 23 | blog: limit_false
    Rozbalit Rozbalit vše Re: Za vším hledej new/malloc

    Chvili mi trvalo nez mi doslo co se mysli pod "jak kdyby to vypadlo z google translate". Ale std::programatorstina je spravna odpoved, BTW ja tak normalne mluvim a nejsem zdaleka sam ;-)

    When people want prime order group, give them prime order group.
    17.7.2009 19:32 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
    Rozbalit Rozbalit vše Re: Za vším hledej new/malloc
    nicmene, kdyz jsem si prosel i vase predchozi prispevky... vychazi mi, ze byste si usetril hromadu casu a nervu, kdybyste s klidem ignoroval datove struktury z STL a napsal si je sam... tolik kodu to zase neni a clovek si je muze prizpusobit aktualnim potrebam.
    Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
    limit_false avatar 17.7.2009 22:06 limit_false | skóre: 23 | blog: limit_false
    Rozbalit Rozbalit vše Re: Za vším hledej new/malloc

    Zrovna ten syntakticky strom je napsan "po domacku" a i tak se projevovaly problemy s alokatorem. Alokatoru se proste nezbavite ;-) Nemyslim ze by "vlastni STL" prineslo nejake zlepseni navic.

    Vsechny zminene performance problemy jsou nejake specialni pripady, "vlastni STL" by mela akorat jine specialni pripady.

    When people want prime order group, give them prime order group.
    17.7.2009 23:19 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
    Rozbalit Rozbalit vše Re: Za vším hledej new/malloc
    moc do projektu nevidim, takze nechci moc kecat...
    Nemyslim ze by "vlastni STL" prineslo nejake zlepseni navic.
    no, nemyslel jsem prepisovat cele STL (dokazi si predstavit hezci knihovnu)

    ...ale spis jsem myslel naimplementovat jednotlive datove struktury presne na miru problemu... ja treba z duvodu zlobiveho alokatoru mam jednu implementaci RB-stromu, kde kazdy RB strom si na zacatku naalokuje velky kus pameti a postupne si z nej bere uzly... a jelikoz nepotrebuji odebirat uzly ze stromu... staci mi na konci prace udelat jedno velke free().
    "vlastni STL" by mela akorat jine specialni pripady.
    ale zase jsou to specialni pripady, ktere muzete lip podchytit...
    Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
    limit_false avatar 18.7.2009 00:20 limit_false | skóre: 23 | blog: limit_false
    Rozbalit Rozbalit vše Re: Za vším hledej new/malloc

    Kdyz se jenom pridava, je to o hodne jednodussi nez kdyz se casto strida pridavani/odebirani (muj pripad), protoze pak vznikaji diry v alokovane pameti kam je potreba nacpat nove alokovane veci.

    Pro ruzne kontejnery (at jiz STL nebo kontejnery ruznych jinych jazyku) je dulezita rozumna predikce jak moc se jeste bude vkladat a jaka rezerva se udela, kdyz pri nejakem add() misto dojde. Tady jdou dva pozadavky proti sobe: minimalizovat pocet alokaci a minimalizovat velikost spotrebovane pameti.

    Mnoho STL kontejneru ma metodu reserve, a muzete si porucit predalokovani pameti. Jenze to moc nepomuze kdyz je hodne instanci malych struktur.

    ale zase jsou to specialni pripady, ktere muzete lip podchytit...

    Myslim ze to vyjde uplne nastejno. Aby vlastni specializovane struktury fungovaly lepe, musite mit celkem striktni omezujici podmniky, jinak specialni pripady budou proste jine.

     

    When people want prime order group, give them prime order group.
    18.7.2009 00:45 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
    Rozbalit Rozbalit vše Re: Za vším hledej new/malloc
    Kdyz se jenom pridava, je to o hodne jednodussi nez kdyz se casto strida pridavani/odebirani (muj pripad), protoze pak vznikaji diry v alokovane pameti kam je potreba nacpat nove alokovane veci.
    to nebyla podstata toho, co jsem chtel rict... jde o to, ze pak budete mit kod pod vetsi kontrolou a nemusite pouzivat ,,general purpose'' reseni, ktera musi delat kompromisy a muzete pouzit ruzne vychytavky...
    Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
    17.7.2009 21:41 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: Za vším hledej new/malloc
    Já bych za vším spíš hledal delete/free. ;-)
    In Ada the typical infinite loop would normally be terminated by detonation.
    17.7.2009 23:28 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
    Rozbalit Rozbalit vše Re: Za vším hledej new/malloc
    to muze byt dost dobre mozne... zajimalo by me, co by se stalo kdyby jako alokator byl pouziti nejaky s garbage collectorem... imho, podle me by si nemuseli vest vubec spatne... garbage collectory maji radi spoustu malych objektu...
    Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
    limit_false avatar 18.7.2009 00:01 limit_false | skóre: 23 | blog: limit_false
    Rozbalit Rozbalit vše Re: Za vším hledej new/malloc

    Prave na tenhle zpusob je navrzen pythoni alokator (proto mel takovy uspech i kdyz byl pouzit jen v nekolika "hotspot" strukturach). Neni vubec problem uvolnit pamet po objektu, spise efektivne najit misto pro novy objekt. Diry v alokovane pameti budou vznikat at delate co delate.

    When people want prime order group, give them prime order group.
    18.7.2009 01:03 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
    Rozbalit Rozbalit vše Re: Za vším hledej new/malloc
    Neni vubec problem uvolnit pamet po objektu, spise efektivne najit misto pro novy objekt.
    tak toto je u rady GC vyreseno velice rychle... ;-]
    Diry v alokovane pameti budou vznikat at delate co delate
    prave proto jsem zminoval pouziti GC. bezne alokatory maji jeste docela rezii s udrzovani seznamu uvolnenych objektu... navic pri pouziti compacting GC odpada problem s fragmentaci dat...
    Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
    18.7.2009 12:15 Roger
    Rozbalit Rozbalit vše Re: Za vším hledej new/malloc

    Compacting GC byla prvni vec, ktera me pri cteni te zoufale historky napadla... Alokace je, ehm, docela rychla a odpadaji problemy s fragmentaci.

    Docela by me zajimalo, jak by si vedl.

    limit_false avatar 18.7.2009 16:12 limit_false | skóre: 23 | blog: limit_false
    Rozbalit Rozbalit vše Re: Za vším hledej new/malloc

    Nejvetsi problem by byl s tou "compacting" casti. Tabulky referenci by se daly upravit, aby s presunem pocitaly, u AST stromu je to absolutne vylouceno. Na druhe strane je mozne ztratit dost casu updatovanim pointru po presunu a indirekci navic. Jak by to dopadlo v tomhle pripade by me taky zajimalo, ale to se asi nedovim.

    When people want prime order group, give them prime order group.
    17.7.2009 22:35 Deleted [8409] | skóre: 14 | blog: darkblog
    Rozbalit Rozbalit vše Re: Za vším hledej new/malloc
    V google V8 je trošičku jiný trik, který jsem použil i v knihovně AsmJit. Pokud je potřeba alokovat mnoho objektů a všechny tyto objekty mají krátkou životnost (a třeba i velikost), je možné alokovat tyto objekty pomocí vlastního heapu, který se ve finále celý uvolní a ty objekty zaniknou s ním. Nevim jestli jsem to vysvětlil dobře, kdyžtak mrknout na zdrojáky AsmJit nebo GoogleV8 (hledat Zone objects)
    20.7.2009 17:35 Ivan
    Rozbalit Rozbalit vše Re: Za vším hledej new/malloc

    Hmm je zvlastni ze si wokna vedly tak spatne. Pokud si dobre pamatuju nejaky prednasku tak NT kernel ma mnohem bohatejsi API. Dokonce si od nej muzete vytorit ruzne alokatory pro ruzne velke objekty a on pak prideluje pamet z ruznych poolu. Cele to ma byt efektivnejsi nez alokace pameti na Unixu. Kdovi jestli se tahle super featura NT kernelu jeste dneska pouziva.

     

     

    21.7.2009 16:11 PaKr | skóre: 9
    Rozbalit Rozbalit vše Re: Za vším hledej new/malloc

    Kdysi jsem řešil podobný problém a v Microsoftu mi poradili řešení pomocí funkce _set_sbh_threshold() a ono to zafungovalo.

    http://groups.google.cz/group/microsoft.public.vc.language/browse_thread/thread/dbbc89b1f7b86021/ff8fb3f72c757725?hl=cs#ff8fb3f72c757725

    limit_false avatar 22.7.2009 00:06 limit_false | skóre: 23 | blog: limit_false
    Rozbalit Rozbalit vše Re: Za vším hledej new/malloc

    Diky za tip, vyzkousime to. Z popisu funkce _set_sbh_threshold zatim nevim, jestli to taky plati na operator new (tipuju ze nejspis jo).

    When people want prime order group, give them prime order group.
    limit_false avatar 23.7.2009 13:51 limit_false | skóre: 23 | blog: limit_false
    Rozbalit Rozbalit vše Re: Za vším hledej new/malloc

    Tak jsem to vyzkousel. Velikosti jsem volil 70, 256, 504, 1016 (posledni byla default do win 2000, pak se to vyplo nastavenim na nulu). Jednou v kombinaci s LFH, pak bez LFH. Vysledkem je, ze v uvadenych pripadech to bylo vzdy o 20-50% horsi nez jenom LFH.

    Pokud vim, LFH se chova hodne podobne jak ten pythoni alokator, tj. zdruzuje po blocich podobne velikosti, tady je celkem pekny schema: http://www.i.u-tokyo.ac.jp/edu/training/ss/lecture/new-documents/Lectures/16-UserModeHeap/UserModeHeapManager.ppt

    When people want prime order group, give them prime order group.

    Založit nové vláknoNahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.