A Mediastreamer2 VoIP motor felfedezése. 12. rész

A cikk anyaga az én zen csatorna.

A Mediastreamer2 VoIP motor felfedezése. 12. rész

Az utolsĂłban cikk, MegĂ­gĂ©rtem, hogy megvizsgĂĄlom a ticker terhelĂ©sĂ©nek felmĂ©rĂ©sĂ©t Ă©s a mĂ©dia streamer tĂșlzott szĂĄmĂ­tĂĄsi terhelĂ©se elleni kĂŒzdelem mĂłdjait. De Ășgy döntöttem, hogy logikusabb lenne, ha kitĂ©rnĂ©k az adatmozgĂĄssal kapcsolatos kĂ©zmƱves szƱrƑk hibakeresĂ©sĂ©nek kĂ©rdĂ©seire, Ă©s csak ezutĂĄn foglalkoznĂ©k a teljesĂ­tmĂ©nyoptimalizĂĄlĂĄssal.

KĂ©zmƱves szƱrƑk hibakeresĂ©se

MiutĂĄn az elƑzƑ cikkben megnĂ©ztĂŒk az adatok mozgatĂĄsĂĄnak mechanizmusĂĄt a mĂ©dia streamerben, logikus lenne a benne rejlƑ veszĂ©lyekrƑl beszĂ©lni. Az „adatfolyam” elv egyik jellemzƑje, hogy a halombĂłl az adatfolyam forrĂĄsĂĄnĂĄl elhelyezkedƑ szƱrƑkben foglaljĂĄk le a memĂłriĂĄt, Ă©s az ĂĄramlĂĄs vĂ©gĂ©n elhelyezett szƱrƑk felszabadĂ­tjĂĄk Ă©s visszajuttatjĂĄk a memĂłriĂĄt a kupacba. pĂĄlya. EzenkĂ­vĂŒl valahol a kettƑ között törtĂ©nhet Ășj adatok lĂ©trehozĂĄsa Ă©s megsemmisĂ­tĂ©se. A memĂłriafelszabadĂ­tĂĄst ĂĄltalĂĄban mĂĄs szƱrƑ hajtja vĂ©gre, mint az, amelyik lĂ©trehozta az adatblokkot.

A transzparens memĂłriafigyelĂ©s szempontjĂĄbĂłl cĂ©lszerƱ lenne, ha a szƱrƑ egy bemeneti blokk vĂ©telekor azt feldolgozĂĄs utĂĄn azonnal megsemmisĂ­tenĂ©, a memĂłria felszabadĂ­tĂĄsĂĄval, Ă©s egy Ășjonnan lĂ©trehozott blokkot adna ki kimeneti adatokkal. Ebben az esetben a szƱrƑ memĂłriaszivĂĄrgĂĄsa könnyen nyomon követhetƑ - ha az analizĂĄtor szivĂĄrgĂĄst Ă©szlel a szƱrƑben, akkor a következƑ szƱrƑ nem semmisĂ­ti meg megfelelƑen a bejövƑ blokkokat, Ă©s hiba van benne. A nagy teljesĂ­tmĂ©ny fenntartĂĄsa szempontjĂĄbĂłl azonban ez az adatblokkokkal valĂł munkavĂ©gzĂ©s nem produktĂ­v – nagyszĂĄmĂș mƱvelethez vezet az adatblokkok memĂłriĂĄjĂĄnak lefoglalĂĄsĂĄra/felszabadĂ­tĂĄsĂĄra, hasznos kimenet nĂ©lkĂŒl.

Emiatt a mĂ©dia streamer szƱrƑk, hogy ne lassĂ­tsĂĄk az adatfeldolgozĂĄst, olyan funkciĂłkat hasznĂĄlnak, amelyek egyszerƱ mĂĄsolatokat kĂ©szĂ­tenek az ĂŒzenetek mĂĄsolĂĄsakor (az elƑzƑ cikkben beszĂ©ltĂŒnk rĂłluk). Ezek a funkciĂłk csak akkor hozzĂĄk lĂ©tre az ĂŒzenet fejlĂ©cĂ©nek Ășj pĂ©ldĂĄnyĂĄt, ha „csatolnak” hozzĂĄ egy adatblokkot a mĂĄsolandĂł „rĂ©gi” ĂŒzenetbƑl. Ennek eredmĂ©nyekĂ©nt egy adatblokkhoz kĂ©t fejlĂ©c kapcsolĂłdik, Ă©s az adatblokkban lĂ©vƑ referenciaszĂĄmlĂĄlĂł növekszik. De Ășgy fog kinĂ©zni, mint kĂ©t ĂŒzenet. Egy ilyen „szocializĂĄlt” adatblokknĂĄl több ĂŒzenet is lehet, pĂ©ldĂĄul az MS_TEE szƱrƑ egy tucat ilyen fĂ©nymĂĄsolatot generĂĄl egyszerre, elosztva azokat a kimenetei között. Ha a lĂĄnc összes szƱrƑje megfelelƑen mƱködik, a folyamat vĂ©gĂ©re ennek a referenciaszĂĄmlĂĄlĂłnak el kell Ă©rnie a nullĂĄt, Ă©s a memĂłriafelszabadĂ­tĂĄsi fĂŒggvĂ©ny meghĂ­vĂĄsra kerĂŒl: ms_free(). Ha a hĂ­vĂĄs nem törtĂ©nik meg, akkor ez a memĂłriadarab többĂ© nem kerĂŒl vissza a kupacba, azaz. "szivĂĄrogni fog". A könnyƱ mĂĄsolatok hasznĂĄlatĂĄnak ĂĄra annak a kĂ©pessĂ©gĂ©nek elvesztĂ©se, hogy könnyen megĂĄllapĂ­thatĂł legyen (mint a normĂĄl mĂĄsolatok esetĂ©ben), hogy melyik grafikonszƱrƑ szivĂĄrog ki a memĂłriĂĄbĂłl.

Mivel a mĂ©dia streamer fejlesztƑi felelƑsek a natĂ­v szƱrƑk memĂłriaszivĂĄrgĂĄsĂĄnak megtalĂĄlĂĄsĂĄĂ©rt, valĂłszĂ­nƱleg nem kell hibakeresĂ©st vĂ©geznie. A kĂ©zmƱves szƱrƑvel azonban sajĂĄt boldogsĂĄgod szöcske vagy, Ă©s a kĂłdodban lĂ©vƑ szivĂĄrgĂĄsok keresĂ©sĂ©vel töltött idƑ a pontossĂĄgodtĂłl fĂŒgg. A hibakeresĂ©si idƑ csökkentĂ©se Ă©rdekĂ©ben a szƱrƑk fejlesztĂ©se sorĂĄn figyelembe kell vennĂŒnk a szivĂĄrgĂĄsĂ©szlelĂ©si technikĂĄkat. Emellett elƑfordulhat, hogy a szivĂĄrgĂĄs csak akkor jelenik meg, ha a szƱrƑt egy valĂłs rendszerben alkalmazzĂĄk, ahol a „gyanĂșsĂ­tottak” szĂĄma ĂłriĂĄsi Ă©s a hibakeresĂ©si idƑ korlĂĄtozott.

Hogyan nyilvĂĄnul meg a memĂłriazavar?

Logikus azt feltĂ©telezni, hogy a program kimenetĂ©ben felsƑ megmutatja az alkalmazĂĄs ĂĄltal elfoglalt memĂłria növekvƑ szĂĄzalĂ©kĂĄt.

A kĂŒlsƑ megnyilvĂĄnulĂĄs az lesz, hogy egy bizonyos ponton a rendszer lassan reagĂĄl az egĂ©r mozgĂĄsĂĄra, Ă©s lassan Ășjrarajzolja a kĂ©pernyƑt. Az is lehetsĂ©ges, hogy a rendszernaplĂł növekedni fog, Ă©s helyet foglal a merevlemezen. Ebben az esetben az alkalmazĂĄs furcsĂĄn kezd viselkedni, nem reagĂĄl a parancsokra, nem tud megnyitni egy fĂĄjlt stb.

A szivĂĄrgĂĄs Ă©szlelĂ©sĂ©hez memĂłriaanalizĂĄtort (a tovĂĄbbiakban analizĂĄtor) hasznĂĄlunk. Lehet, hogy valgrind (jĂł cikk rĂłla) vagy beĂ©pĂ­tve a fordĂ­tĂłba gcc MemorySanitizer vagy bĂĄrmi mĂĄst. Ha az analizĂĄtor azt mutatja, hogy az egyik grafikonszƱrƑben szivĂĄrgĂĄs lĂ©p fel, akkor ez azt jelenti, hogy ideje alkalmazni az alĂĄbbiakban ismertetett mĂłdszerek valamelyikĂ©t.

Három fenyƑ módszer

Ahogy fentebb emlĂ­tettĂŒk, memĂłriaszivĂĄrgĂĄs esetĂ©n az analizĂĄtor arra a szƱrƑre mutat, amely memĂłriafoglalĂĄst kĂ©rt a kupacbĂłl. De nem mutat rĂĄ arra a szƱrƑre, amelyik „elfelejtette” visszakĂŒldeni, ami valĂłjĂĄban a tettes. Így az elemzƑ csak megerƑsĂ­theti fĂ©lelmeinket, de nem jelzi annak gyökerĂ©t.

A „rossz” szƱrƑ helyĂ©nek meghatĂĄrozĂĄsĂĄhoz a grafikonon csökkentheti a grafikont azon csomĂłpontok minimĂĄlis szĂĄmĂĄra, amelyeknĂ©l az analizĂĄtor mĂ©g mindig szivĂĄrgĂĄst Ă©szlel, Ă©s lokalizĂĄlja a problĂ©mĂĄs szƱrƑt a fennmaradĂł hĂĄrom fenyƑben.

ElƑfordulhat azonban, hogy a szƱrƑk szĂĄmĂĄnak csökkentĂ©sĂ©vel a grafikonon megzavarja a szƱrƑk Ă©s a rendszer mĂĄs elemei közötti interakciĂł normĂĄl menetĂ©t, Ă©s a szivĂĄrgĂĄs megszƱnik. Ebben az esetben teljes mĂ©retƱ grafikonnal kell dolgoznia, Ă©s az alĂĄbbiakban vĂĄzolt megközelĂ­tĂ©st kell alkalmaznia.

CsĂșszĂł szigetelƑ mĂłdszer

A bemutatĂĄs egyszerƱsĂ­tĂ©se Ă©rdekĂ©ben olyan grafikont fogunk hasznĂĄlni, amely egy szƱrƑlĂĄncbĂłl ĂĄll. Ɛ lĂĄthatĂł a kĂ©pen.

A Mediastreamer2 VoIP motor felfedezése. 12. rész

Egy normĂĄl grafikon, amelyen a kĂ©sz mĂ©dia streamer szƱrƑkkel egyĂŒtt nĂ©gy darab F1...F4 kĂ©zmƱves szƱrƑt hasznĂĄlnak, nĂ©gy kĂŒlönbözƑ tĂ­pusbĂłl, amelyeket Ön mĂĄr rĂ©gen kĂ©szĂ­tett, Ă©s nincs kĂ©tsĂ©ge a helyessĂ©gĂŒkrƑl. TĂ©telezzĂŒk fel azonban, hogy közĂŒlĂŒk többnek memĂłriaszivĂĄrgĂĄsa van. Az analizĂĄtor figyelĂ©sĂ©re szolgĂĄlĂł programunkat futtatva a jelentĂ©sĂ©bƑl megtudjuk, hogy egy bizonyos szƱrƑ bizonyos mennyisĂ©gƱ memĂłriĂĄt kĂ©rt, Ă©s nem adta vissza a kupacba N szĂĄmĂș alkalommal. Könnyen kitalĂĄlhatja, hogy lesz egy hivatkozĂĄs az MS_VOID_SOURCE tĂ­pusĂș belsƑ szƱrƑfunkciĂłkra. Az Ƒ feladata, hogy emlĂ©ket vegyen a kupacbĂłl. MĂĄs szƱrƑknek vissza kell juttatniuk oda. Azok. Ă©szleljĂŒk a szivĂĄrgĂĄs tĂ©nyĂ©t.

Annak meghatĂĄrozĂĄsĂĄra, hogy a folyamat melyik szakaszĂĄn törtĂ©nt tĂ©tlensĂ©g, ami memĂłriaszivĂĄrgĂĄshoz vezetett, egy tovĂĄbbi szƱrƑ bevezetĂ©se javasolt, amely egyszerƱen ĂĄthelyezi az ĂŒzeneteket a bemenetrƑl a kimenetre, ugyanakkor lĂ©trehozza a bemeneti ĂŒzenet nem vilĂĄgos mĂĄsolatĂĄt. , hanem egy normĂĄl „nehĂ©z”, majd teljesen törli a belĂ©pĂ©skor kapott ĂŒzenetet. Az ilyen szƱrƑt szigetelƑnek nevezzĂŒk. Úgy gondoljuk, hogy mivel a szƱrƑ egyszerƱ, nincs benne szivĂĄrgĂĄs. És mĂ©g egy pozitĂ­v tulajdonsĂĄg - ha hozzĂĄadjuk bĂĄrhovĂĄ a grafikonon, ez semmilyen mĂłdon nem befolyĂĄsolja az ĂĄramkör mƱködĂ©sĂ©t. A szƱrƑ-levĂĄlasztĂłt kör alakban ĂĄbrĂĄzoljuk kettƑs ĂĄramkörrel.

A levĂĄlasztĂłt közvetlenĂŒl a voidsource szƱrƑ utĂĄn kapcsoljuk be:
A Mediastreamer2 VoIP motor felfedezése. 12. rész

IsmĂ©t lefuttatjuk a programot az analizĂĄtorral, Ă©s azt lĂĄtjuk, hogy ezĂșttal az analizĂĄtor a szigetelƑt fogja hibĂĄztatni. VĂ©gĂŒl is Ƒ az, aki most adatblokkokat hoz lĂ©tre, amelyeket aztĂĄn egy ismeretlen gondatlan szƱrƑ (vagy szƱrƑk) elveszĂ­t. KövetkezƑ lĂ©pĂ©skĂ©nt mozgassa a szigetelƑt a lĂĄnc mentĂ©n jobbra, egy szƱrƑvel, Ă©s kezdje Ășjra az elemzĂ©st. TehĂĄt az izolĂĄtort lĂ©pĂ©srƑl lĂ©pĂ©sre jobbra mozgatva olyan helyzetet kapunk, hogy a következƑ analizĂĄtor jelentĂ©sben a „kiszivĂĄrgott” memĂłriablokkok szĂĄma csökkenni fog. Ez azt jelenti, hogy ennĂ©l a lĂ©pĂ©snĂ©l a szigetelƑ közvetlenĂŒl a problĂ©mĂĄs szƱrƑ utĂĄn volt a lĂĄncban. Ha csak egy „rossz” szƱrƑ volt, akkor a szivĂĄrgĂĄs teljesen eltƱnik. Így lokalizĂĄltuk a problĂ©mĂĄs szƱrƑt (vagy egyet a több közĂŒl). A szƱrƑ „javĂ­tĂĄsa” utĂĄn folytathatjuk a levĂĄlasztĂł jobb oldali mozgatĂĄsĂĄt a lĂĄnc mentĂ©n, amĂ­g teljesen le nem kĂŒzdjĂŒk a memĂłriaszivĂĄrgĂĄst.

IzolĂĄtor szƱrƑ megvalĂłsĂ­tĂĄsa

Az izolĂĄtor megvalĂłsĂ­tĂĄsa Ășgy nĂ©z ki, mint egy normĂĄl szƱrƑ. FejlĂ©c fĂĄjl:

/* ЀаĐčĐ» iso_filter.h  ĐžĐżĐžŃĐ°ĐœĐžĐ” ĐžĐ·ĐŸĐ»ĐžŃ€ŃƒŃŽŃ‰Đ”ĐłĐŸ Ń„ĐžĐ»ŃŒŃ‚Ń€Đ°. */

#ifndef iso_filter_h
#define iso_filter_h

/* Đ—Đ°ĐŽĐ°Đ”ĐŒ ĐžĐŽĐ”ĐœŃ‚ĐžŃ„ĐžĐșĐ°Ń‚ĐŸŃ€ Ń„ĐžĐ»ŃŒŃ‚Ń€Đ°. */
#include <mediastreamer2/msfilter.h>

#define MY_ISO_FILTER_ID 1024

extern MSFilterDesc iso_filter_desc;

#endif

Maga a szƱrƑ:

/* ЀаĐčĐ» iso_filter.c  ĐžĐżĐžŃĐ°ĐœĐžĐ” ĐžĐ·ĐŸĐ»ĐžŃ€ŃƒŃŽŃ‰Đ”ĐłĐŸ Ń„ĐžĐ»ŃŒŃ‚Ń€Đ°. */

#include "iso_filter.h"

    static void
iso_init (MSFilter * f)
{
}
    static void
iso_uninit (MSFilter * f)
{
}

    static void
iso_process (MSFilter * f)
{
    mblk_t *im;

    while ((im = ms_queue_get (f->inputs[0])) != NULL)
    {
        ms_queue_put (f->outputs[0], copymsg (im));
        freemsg (im);
    }
}

static MSFilterMethod iso_methods[] = {
    {0, NULL}
};

MSFilterDesc iso_filter_desc = {
    MY_ISO_FILTER_ID,
    "iso_filter",
    "A filter that reads from input and copy to its output.",
    MS_FILTER_OTHER,
    NULL,
    1,
    1,
    iso_init,
    NULL,
    iso_process,
    NULL,
    iso_uninit,
    iso_methods
};

MS_FILTER_DESC_EXPORT (iso_desc)

A memóriakezelési funkciók cseréjének módja

A finomabb kutatĂĄs Ă©rdekĂ©ben a mĂ©dia streamer lehetƑsĂ©get ad arra, hogy a memĂłriaelĂ©rĂ©si funkciĂłkat lecserĂ©lje a sajĂĄtjĂĄra, amely a fƑ munka mellett rögzĂ­ti a „Ki, hol Ă©s miĂ©rt” feliratot. HĂĄrom funkciĂł cserĂ©lƑdik. Ez a következƑkĂ©ppen törtĂ©nik:

OrtpMemoryFunctions reserv;
OrtpMemoryFunctions my;

reserv.malloc_fun = ortp_malloc;
reserv.realloc_fun = ortp_realloc;
reserv.free_fun = ortp_free;

my.malloc_fun = &my_malloc;
my.realloc_fun = &my_realloc;
my.free_fun = &my_free;

ortp_set_memory_functions(&my);

Ez a funkciĂł olyan esetekben segĂ­t, amikor az analizĂĄtor annyira lelassĂ­tja a szƱrƑk mƱködĂ©sĂ©t, hogy annak a rendszernek a mƱködĂ©se, amelybe ĂĄramkörĂŒnk Ă©pĂŒlt, megszakad. Ilyen helyzetben el kell hagynia az analizĂĄtort, Ă©s a memĂłriĂĄval valĂł munkavĂ©gzĂ©shez fĂŒggvĂ©nyek helyettesĂ­tĂ©sĂ©t kell hasznĂĄlnia.

Megvizsgåltunk egy mƱveleti algoritmust egy egyszerƱ gråfhoz, amely nem tartalmaz ågakat. De ez a megközelítés mås esetekre is alkalmazható, persze bonyolultabban, de az ötlet ugyanaz marad.

A következƑ cikkben megvizsgĂĄljuk a ticker terhelĂ©sĂ©nek becslĂ©sĂ©t Ă©s a mĂ©dia streamer tĂșlzott szĂĄmĂ­tĂĄsi terhelĂ©se elleni kĂŒzdelem mĂłdjait.

ForrĂĄs: will.com

VĂĄsĂĄroljon megbĂ­zhatĂł tĂĄrhelyet DDoS vĂ©delemmel, VPS VDS szerverekkel rendelkezƑ webhelyekhez đŸ”„ VĂĄsĂĄroljon megbĂ­zhatĂł weboldal tĂĄrhelyet DDoS vĂ©delemmel, VPS VDS szerverekkel | ProHoster