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í
×
    dnes 12:11 | IT novinky

    Před 30 lety, tj. v úterý 30. dubna 1996, byl spuštěn Seznam.cz.

    Ladislav Hagara | Komentářů: 2
    dnes 11:44 | Komunita

    Byly zpracovány a zveřejněny všechny videozáznamy, které stojí za zveřejnění, z konference FOSDEM 2026.

    Ladislav Hagara | Komentářů: 1
    dnes 01:11 | IT novinky

    Od úterý 28. dubna musí nově uváděné notebooky v Evropské unii podporovat nabíjení přes USB-C. Jednotná nabíječka byla schválena Evropským parlamentem v říjnu 2022.

    Ladislav Hagara | Komentářů: 52
    včera 23:44 | Bezpečnostní upozornění

    Byly publikovány informace o kritické zranitelnosti CVE-2026-31431 pojmenované Copy Fail v Linuxu, konkrétně v kryptografii (AF_ALG). Běžný uživatel může získat práva roota (lokální eskalaci práv). Na všech distribucích Linuxu vydaných od roku 2017. Pomocí 732bajtového skriptu. V upstreamu je již opraveno. Zranitelnost byla nalezena pomocí AI Xint Code.

    Ladislav Hagara | Komentářů: 4
    včera 17:44 | Nová verze

    Textový editor Zed dospěl do verze 1.0. Představení v příspěvku na blogu.

    Ladislav Hagara | Komentářů: 0
    včera 04:44 | Komunita

    Vývojáři svobodného 3D softwaru Blender představili (𝕏, Mastodon, Bluesky) nejnovějšího firemního sponzora Blenderu. Je ním společnost Anthropic stojící za AI Claude a úroveň sponzoringu je Patron, tj. minimálně 240 tisíc eur ročně. Anthropic oznámil sponzorství v tiskové zprávě Claude for Creative Work.

    Ladislav Hagara | Komentářů: 8
    včera 03:55 | Nová verze

    VNC server wayvnc pro Wayland kompozitory postavené nad wlroots - ne GNOME, KDE nebo Weston - byl vydán ve verzi 0.10.0. Vydána byla také verze 1.0.0 související knihovny neatvnc.

    Ladislav Hagara | Komentářů: 0
    28.4. 16:22 | Nová verze

    Bylo oznámeno vydání Fedora Linuxu 44. Ve finální verzi vychází šest oficiálních edic: Fedora Workstation a Fedora KDE Plasma Desktop pro desktopové, Fedora Server pro serverové, Fedora IoT pro internet věcí, Fedora Cloud pro cloudové nasazení a Fedora CoreOS pro ty, kteří preferují neměnné systémy. Vedle nich jsou k dispozici také další atomické desktopy, spiny a laby. Podrobný přehled novinek v samostatných článcích na stránkách

    … více »
    Ladislav Hagara | Komentářů: 7
    28.4. 15:44 | Zajímavý článek

    David Malcolm se na blogu vývojářů Red Hatu rozepsal o vybraných novinkách v GCC 16, jež by mělo vyjít v nejbližších dnech. Vypíchnuta jsou vylepšení čitelnosti chybových zpráv v C++, aktualizovaný SARIF (Static Analysis Results Interchange Format) výstup a nová volba experimental-html v HTML výstupu.

    Ladislav Hagara | Komentářů: 0
    28.4. 15:11 | Nová verze

    Byla vydána verze R14.1.6 desktopového prostředí Trinity Desktop Environment (TDE, fork KDE 3.5, Wikipedie). Přehled novinek v poznámkách k vydání, podrobnosti v seznamu změn.

    JZD | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (14%)
     (8%)
     (2%)
     (13%)
     (31%)
     (3%)
     (6%)
     (3%)
     (15%)
     (24%)
    Celkem 1465 hlasů
     Komentářů: 30, poslední 3.4. 20:20
    Rozcestník

    Fragmentace paměti s hash_setem

    12.7.2009 14:42 | Přečteno: 1217× | programování

    Co se stane když se hash_map/hash_set s alokátorem spojí proti vám? Za velmi specifických podmínek může 15 MB bloků alokovaných hash_mapami/hash_setmi zabírat i 300 MB (resident size).

    Bug report

    Den začal optimisticky s bug reportem, že jedna operace zabírá na linuxu neskutečné množství paměti (aplikace přeložena pro windows že stejných zdrojaků tímhle bugem netrpěla).

    Říkám si, nějaký podivný memory leak. První zvláštní věc byla, že paměť narostla jenom jednou, při opakování daný operace už víc nenarostla. Možná kdesi v paměti zůstala zapomenuta kopie nějaké větší struktury. S debuggerem jsem zjistil že se to děje při vytváření tabulek křížových referencí, ale ani po pečlivém zkoumání jsem nenašel žádný zapomenutý new ani nic podobného.

    Tabulky křížových referencí jsou ve zkratce hash_mapa mapující ukazatel symbolu na ukazatel třídy XrefEntry, která obsahuje malý hash_set a dva malé std::sety ukazatelů (malý = řádově do stovky prvků).

    Valgrind vs top

    Co se dá dělat, podívám se na to s valgrindem. Leak tam nebyl ale ani podle valgrindu. Navíc valgrind ukazuje nárůst jenom o cca 15 MB reachable bloků, jenže top ukazuje nárůst o 300 MB v resident size. Vylučovací metodou zůstala jenom možnost fragmentace paměti. Že něco takového existuje jsem věděl, jenže nikdy předtím jsem na to nenarazil v míře, kdy by se 15 MB malých kousků roztahalo po 300 MB namapovaných stránkách.

    Po mnoha náhodných pokusech s tím něco udělat nakonec zabrala výměna hash_set za obyčejný std::set v XrefEntry. Při dané operaci tabulky referencí používají velké množství malých (hash_)setů (jako členy XrefEntry). Instance XrefEntry často vznikaly a zanikaly, tím pádem často vznikaly i členské (hash_)sety, kterých kterých obsah se často měnil (a prudce kolísali ve velikosti, tj. maximum skutečně použité paměti bylo o hodně vyšší než 15 MB malých bloků po skončení operace).

    Hash tabulka vs červeno-černý strom

    Výhoda std::map a std::set oproti hash_ verzím je nejspíš v tom, že nepotřebuje alokovat extra malé kousky paměti pro buckety (u gcc i msvc je map/set implementován jako červeno-černý strom). Co způsobilo takové roztahaní po paměti byla zřejmě velmi specifická posloupnost alokací a dealokací bucketů u těch hash_setů a std::allocatoru to moc nesedlo.

    Zkusil i jiné implementace map a setů. Např. boost::unordered_set měl v daném případě podobné problémy, ale roztahanost po paměti byla menší asi o 25%. Pro zajímavost, tady je porovnání několika dalších implementací (hash) tabulek:

    Comparison of Hash Table Libraries

    Hash tabulky mají konstantní složitost vkládání/vyhledávání/mazání, člověk by čekal že budou o hodně rychlejší než třeba červeno-černý strom s logaritmickou složitosti vkládání/vyhledávání/mazání. Prakticky u skutečných implementací musí být záznamů v tabulce hodně (nejméně desettisíce), aby byla hash tabulka rychlejší (extra režie). Neměřil jsem samozřejmě všechny implementace, ale boostí unordered a STL implementace (gcc, msvc) se chovají takhle.

           

    Hodnocení: 100 %

            špatnédobré        

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

    Komentáře

    Vložit další komentář

    12.7.2009 16:21 l4m4
    Rozbalit Rozbalit vše Re: Fragmentace paměti s hash_setem
    To je zase benchmark...

    For glib and ghthash, what is inserted is the pointer to the integer instead of the integer itself.

    A ještě to pak drze diskutuje, že nevýhoda C-implementací generických hash tabulek je, že se to takhle musí dělat. Přitom jsem neviděl kód, který by v do GHashTable integery ukládal jinak než přes GINT_TO_POINTER() (a podobná makra), tj. přímo do tabulky bez dalších alokací...
    limit_false avatar 13.7.2009 13:58 limit_false | skóre: 23 | blog: limit_false
    Rozbalit Rozbalit vše Re: Fragmentace paměti s hash_setem

    Njn, ja to cetl asi pred rokem kdyz jsem ten problem s fragmentaci pameti resil (taky jsem potreboval sablonoidne struktury, tim padem glib a ghthash vypadli). IMHO udelat poradny benchmark je neskutecne prace (proto vetsina benchmarku vypada tak jak vypada). Vzdy je lepsi (nebo spis nutny) si vsechno premerit (jine podminky, jine vysledky).

    When people want prime order group, give them prime order group.
    12.7.2009 20:01 petr_p | skóre: 59 | blog: pb
    Rozbalit Rozbalit vše Re: Fragmentace paměti s hash_setem
    Ehm, standardní knihovna je implementovaná z větší části v glibc, ne v gcc. Řekl bych, že i ty hash mapy nebo sety.
    12.7.2009 20:10 l4m4
    Rozbalit Rozbalit vše Re: Fragmentace paměti s hash_setem
    Podle mne myslel standardní knihovnu C++ (libstdc++ AKA STL). Ta přichází s gcc. Coby podmnožinu z definice zahrnuje i standardní knihovnu C, takže teď bychom mohli začít řešit, co je větší, nicméně STL je v gcc.
    limit_false avatar 13.7.2009 13:39 limit_false | skóre: 23 | blog: limit_false
    Rozbalit Rozbalit vše Re: Fragmentace paměti s hash_setem

    STL je urcite implementovana jako soucast gcc/msvc (i kdyz treba existuji separatni implementace jako STLport). C++ sablony navic ani nejde kompilovat (do strojoveho kodu; jedine do predkompilovanych headeru) pokud se neudela konkretni instanciace.

    Na druhe strane implementace sablon urcite pouziva funkce z glibc (treba malloc/free pres new/delete a std::allocator), tim padem vykon znacne zavisi i od glibc.

    Taky mam domnenku, ze od glibc zavisi rychlost vyjimek (tohle nemam jeste vyreseno, urcite jde o nejakou kombinaci z trojice glibc, binutils, libgcc_s.so), viz nasledujici pripad (__cxa_throw a _Unwind*):

    spousta vyjimek v CentOS 4

    spousta vyjimek v CentOS 5

    Obe mereni je stejny testcase (specialni extremni pripad s 70000 vyjimkama, nemilujete proste specialni pripady? ;-)). Vzdy prelozeno s gcc 4.1.2 (libgcc_s.so je soucasti gcc, tim padem i stejna libgcc_s.so odkud jsou _Unwind* funkce). Jednou na CentOS 4 s glibc 2.3.4 a jednou na CentOS 5 s glibc 2.5. Jedina rozdilna vec krome glibc jsou jiny verze binutils. No a ta CentOS 5 verze beha v danem pripade vic nez 5x rychleji.

    (Nejspis ten problem s vyjimkama bude mat neco do cineni s timhle: http://gcc.gnu.org/ml/gcc/2005-02/msg00627.html ).

    When people want prime order group, give them prime order group.
    limit_false avatar 13.7.2009 14:16 limit_false | skóre: 23 | blog: limit_false
    Rozbalit Rozbalit vše Re: Fragmentace paměti s hash_setem

    Pozn. v tech grafech pochazeji vsechny funkce pod __cxa_throw z libgcc_s.so krome dl_iterate_phdr (je z glibc) a __gxx_personality_v0 (je z libstdc++ i s uzlem pod nim).

    When people want prime order group, give them prime order group.
    14.7.2009 02:05 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Fragmentace paměti s hash_setem
    Na druhe strane implementace sablon urcite pouziva funkce z glibc (treba malloc/free pres new/delete a std::allocator)

    Ne nutně. Na unixových systémech to tak nejspíš většinou bude, ale nemusí to tak fungovat všude. Standardní C++ knihovna může být teoreticky naprosto nezávislá na standardní C knihovně.

    limit_false avatar 14.7.2009 12:36 limit_false | skóre: 23 | blog: limit_false
    Rozbalit Rozbalit vše Re: Fragmentace paměti s hash_setem

    Prilis si neumim predstavit jak by se implementovalo new/delete nebo std::allocator bez malloc nebo mmap. Snad jedine primym volanim do kernelu (pres preruseni), co je prilis low-level pro standardni C++ knihovnu.

    When people want prime order group, give them prime order group.
    14.7.2009 12:45 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Fragmentace paměti s hash_setem
    Prostě by si tu alokaci napsali autoři sami, stejně jako ji napsali autoři implementace malloc() a free() v libc. Uvědomte si, že C++ je jazyk zcela nezávislý na C, teoreticky byste mohl mít C++ i na platformě, kde vůbec neexistuje překladač céčka, a tedy ani standardní C knihovna. Koneckonců dřív používala i řada projektů psaných v C své vlastní náhražky za systémové malloc() a free() a autoři to zdůvodňovali tím, že jejich implementace jsou efektivnější, což by nebylo dost dobře možné, kdyby to byly jen nadstavby nad těmi systémovými implementacemi.
    limit_false avatar 14.7.2009 14:30 limit_false | skóre: 23 | blog: limit_false
    Rozbalit Rozbalit vše Re: Fragmentace paměti s hash_setem

    Tak tady doslo asi k nedorozumeni. Ja puvodne psal o zavislosti na glibc uz jenom proto (pripad Linuxu), ze na preimplementovani malloc/free potrebujete nejakou systemovou funkci jako mmap/brk, abyste mel _nejakou_ pamet nad ktorou postavite vlastni malloc/free. A mmap/brk je taky soucasti glibc (jinak musite volat kernel primo pres preruseni/syscall).

    When people want prime order group, give them prime order group.
    14.7.2009 18:07 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Fragmentace paměti s hash_setem
    A mmap/brk je taky soucasti glibc (jinak musite volat kernel primo pres preruseni/syscall).

    Odpověděl jste si sám: ty funkce nejsou nic jiného než wrappery nad příslušné syscally. A použití céčkových wrapperů není principiálně nutné. Navíc se na to pořád díváte příliš linuxocentricky.

    limit_false avatar 14.7.2009 23:23 limit_false | skóre: 23 | blog: limit_false
    Rozbalit Rozbalit vše Re: Fragmentace paměti s hash_setem

    True :-) Dival jsem se na na jiny implementace new, snad vsechny bezne non-embedded systemy volaji nejakou verzi malloc (vratane msvc). Pak jsem disassembloval mmap, abych videl ze nema extra rezii. K alokatorum se jeste dostanu.

    BTW nechapu tvrzeni "Standardní C++ knihovna může být teoreticky naprosto nezávislá na standardní C knihovně." AFAIK musi C++ alespon implementovat vsechny funkce C, treba taky malloc?

    When people want prime order group, give them prime order group.
    15.7.2009 00:31 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Fragmentace paměti s hash_setem
    Všechny rozhodně ne, jen některé. Funkce malloc() mezi nimi sice je, ale neznamená to, že musí jít o stejnou implementaci jako v libc. Vztah mezi funkcí malloc() a operátorem new je takový, že malloc() nesmí k alokaci použít new
    The functions calloc(), malloc(), and realloc() do not attempt to allocate storage by calling ::operator new().
    ale na druhou stranu se výslovně uvádí, že není specifikováno, zda operátor new používá malloc() nebo ne
    Whether the attempt involves a call to the Standard C library function malloc is unspecified.

    Takže operátor new může být nadstavba nad funkcí malloc(), ale stejně tak na ní může být úplně nezávislý. Funkce malloc() ale nesmí být implementována pomocí operátoru new, IMHO kvůli tomu, aby bylo možné beztrestně overloadovat new vlastní verzí využívající malloc().

    15.7.2009 00:36 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Fragmentace paměti s hash_setem
    Příkladem něčeho, co je garantováno v ISO C, ale v ISO C++ to být nemusí, jsou např. celočíselné typy definované v <stdint.h>. V C++ programu se obecně nemůžete spolehnout na to, že je budete mít k dispozici (ani ty, jejichž dostupnost garantuje norma jazyka C).

    Založit nové vláknoNahoru

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