WebHU - Programozási kérdések és válaszok

Módszerek a memóriafogyasztás csökkentésére az ArangoDB-ben

Jelenleg van egy ArangoDB-fürtünk, amely a 3.0.10-es verziót futtatja egy POC-hoz, amely körülbelül 81 GB-nyi lemezen van tárolva, és körülbelül 98 GB-os főmemória-felhasználás van elosztva 5 elsődleges DB-kiszolgáló között. Körülbelül 200 millió csúcs és 350 millió él van. 3 Edge gyűjtemény és 3 dokumentumgyűjtemény van, a memória nagy részét (80%-át) a szélek jelenléte foglalja el

Módszereket vizsgálok a fő memóriafogyasztás csökkentésére. Érdeklődnék, hogy vannak-e módszerek az adatok tömörítésére/szerializálására, hogy kevesebb főmemória kerüljön felhasználásra.

A memóriacsökkentés oka az infrastruktúra költségeinek csökkentése, hajlandó vagyok kompromisszumot kötni a sebességgel a használati esetemhez.

Kérem, tudassa velem, ha vannak módszerek az ArangoDB fő memóriafogyasztásának csökkentésére


  • Miért próbálja csökkenteni a memóriahasználatot? A sebesség miatt van? Az erőforrások elérhetősége? Milyen adatokkal rendelkezik? Szüksége van arra, hogy lekérdezze adatainak legnagyobb részét? Milyen adatstruktúrákat használ? 07.11.2016
  • @Nate : Köszönöm a hozzászólásokat, frissítettem a kérdéssel kapcsolatos információkat és részletesebbé tettem. 08.11.2016
  • Mennyi adatot tárol a széleken? Ezek az adatok duplikálva vannak? 10.11.2016

Válaszok:


1

Eltartott egy ideig, amíg rájöttünk, hogy az eredeti javaslatunk, hogy ezt vm.overcommit_memory-ről 2-ra állítsuk, nem minden helyzetben jó.

Úgy tűnik, hogy néhány környezettel probléma van az ArangoDB csomagban található jemalloc memórialefoglalójával.

A vm.overcommit_memory kernelbeállítások 2 értékénél az allokátornak problémája volt a meglévő memórialeképezések felosztásával, ami miatt egy arangod folyamat memórialeképezéseinek száma nőtt az idő múlásával. Ez oda vezethetett, hogy a kernel nem hajlandó több memóriát átadni az arangod folyamatnak, még akkor is, ha a fizikai memória még mindig rendelkezésre áll. A kernel legfeljebb vm.max_map_count memória-leképezést ad minden folyamathoz, amely sok Linux-környezetben alapértelmezés szerint 65530.

Egy másik probléma a jemalloc futtatásakor, ha a vm.overcommit_memory értéke 2, hogy bizonyos munkaterheléseknél a Linux kernel által lekötött memóriaként követett memória mennyisége is növekszik az idő múlásával, és nem csökken. Így végül előfordulhat, hogy az ArangoDB démonfolyamat (arangod) nem kap több memóriát egyszerűen azért, mert eléri a beállított túllépési korlátot (fizikai RAM * overcommit_ratio + csereterület).

A megoldás tehát az, hogy a vm.overcommit_memory értékét 2-ről 1-re vagy 0-re módosítjuk. Ez mindkét problémát megoldja. Továbbra is folyamatosan növekvő virtuális memóriafelhasználást figyelünk meg, amikor a jemalloc-ot bármilyen túllépési beállítással használjuk, de a gyakorlatban ez nem okozhat problémát. Tehát ha a vm.overcommit_memory értékét 2-ről 0-re vagy 1-ra állítja (a 0 a Linux rendszermag alapértelmezett beállítása), ennek javítania kell a helyzeten.

A probléma megoldásának másik módja, amelyhez azonban az ArangoDB forrásból való fordítása szükséges, az, hogy egy buildet jemalloc nélkül fordítunk (-DUSE_JEMALLOC=Off cmakingkor). Ezt csak alternatívaként sorolom ide a teljesség kedvéért. A rendszer libc allokátorával elég stabil memóriahasználatot kell látnia. Kipróbáltunk egy másik allokátort is, pontosan a libmusl-ből, és ez is elég stabil memóriahasználatot mutat az idő múlásával. A fő probléma, ami miatt az allokátor cseréje nem triviális probléma, az az, hogy a jemalloc egyébként nagyon jó teljesítményjellemzőkkel rendelkezik.

(idézve Jan Steemannt, ahogy az megtalálható a githubon)

A rocksdb tárolómotorhoz időközben számos új kiegészítést készítettek. Bemutatjuk, hogyan működik a memóriakezelés a rocksdb-ben.

A rocksdb tárolómotor számos opciója az opciókon keresztül kívülről is elérhető.

Egy felhasználó megbeszélései és kutatása két további beállítási lehetőséget eredményezett ArangoDB 3.7:

  • --rocksdb.cache-index-and-filter-blocks-with-high-priority
  • --rocksdb.pin-l0-filter-and-index-blocks-in-cache
  • --rocksdb.pin-top-level-index-and-filter
25.02.2019
Új anyagok

A rádiógomb ellenőrzött eseményének használata a jQueryben
Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

Miért érdemes elkezdeni a kódolást 2023-ban?
01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

🎙 Random Noise #2  – Örökbefogadás és hit
az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..