Pagsuhid sa Mediastreamer2 VoIP engine. Bahin 12

Ang materyal sa artikulo gikuha gikan sa akong zen channel.

Pagsuhid sa Mediastreamer2 VoIP engine. Bahin 12

Sa ulahi artikuloNisaad ko nga hisgutan ang isyu sa pagtimbang-timbang sa ticker load ug mga paagi aron masumpo ang sobra nga computing load sa usa ka media streamer. Apan nakahukom ko nga mas lohikal nga hisgutan ang mga isyu sa pag-debug sa mga craft filter nga may kalabotan sa pagbalhin sa datos ug dayon hunahunaon ang mga isyu sa pag-optimize sa performance.

Pag-debug sa mga craft filter

Human sa pagsusi sa mekanismo sa paglihok sa datos sa usa ka media streamer sa miaging artikulo, lohikal nga hisgutan ang mga peligro nga nagtago sa sulod niini. Usa sa mga kinaiya sa prinsipyo sa "daloy sa datos" mao nga ang pag-apod-apod sa memorya gikan sa heap mahitabo sa mga filter nga nahimutang sa tinubdan sa daloy sa datos, samtang ang pagpagawas sa memorya ug pagbalik sa heap gihimo sa mga filter nga nahimutang sa katapusan sa daloy. Dugang pa, ang bag-ong datos mahimong mamugna ug malaglag sa mga intermediate nga punto. Kasagaran, ang pagpagawas sa memorya gihimo sa usa ka filter gawas sa usa nga naghimo sa data block.

Gikan sa perspektibo sa transparent memory monitoring, makatarunganon para sa usa ka filter, sa pagdawat og input block, nga gub-on dayon kini human sa pagproseso, pagpagawas sa memorya niini, ug pag-output og bag-ong gibuhat nga block nga adunay sulod nga output data. Niini nga kaso, ang memory leak sa filter dali nga masubay—kon ang analyzer makamatikod og leak sa usa ka filter, kini nagpasabot nga ang sunod nga filter wala sa hustong pagguba sa mga input block ug adunay depekto. Bisan pa, gikan sa perspektibo sa performance, kini nga pamaagi sa pagtrabaho sa mga data block dili produktibo—kini moresulta sa daghang mga operasyon sa memory allocation/deallocation para sa mga data block nga walay bisan unsang mapuslanong benepisyo.

Tungod niini nga hinungdan, aron malikayan ang paghinay sa pagproseso sa datos, ang mga media streamer filter naggamit og mga gimbuhaton nga nagmugna og gaan nga mga kopya kung nagkopya sa mga mensahe (atong gihisgutan kini sa miaging artikulo). Kini nga mga gimbuhaton nagmugna lang og bag-ong instance sa header sa mensahe, "gikabit" niini ang data block gikan sa "daan" nga mensahe nga gikopya. Ingon usa ka resulta, duha ka header ang gilakip sa usa ka data block, ug ang reference counter sa data block madugangan. Bisan pa, kini makita isip duha ka mensahe. Mahimong adunay daghang mga mensahe nga adunay ingon nga "gipaambit" nga data block; pananglitan, ang MS_TEE filter nagmugna og usa ka dosena nga ingon nga gaan nga mga kopya sa usa ka higayon, nga nag-apod-apod niini taliwala sa mga output niini. Kung ang tanan nga mga filter sa kadena nagtrabaho sa husto, sa katapusan sa pipeline, kini nga reference counter kinahanglan nga makaabot sa zero, ug ang function sa memory deallocation tawgon: ms_free()Kon ang tawag dili mahitabo, nan kini nga tipak sa memorya dili na gayud ibalik sa heap, buot ipasabot, kini "moagas." Ang gasto sa paggamit og gaan nga mga kopya mao ang pagkawala sa abilidad sa dali nga pag-ila (sama sa mahitabo sa regular nga mga kopya) kon unsang filter sa graph ang nagagas nga memorya.

Tungod kay ang responsibilidad sa pagpangita og memory leak sa mga native filter anaa sa mga media streamer developers, lagmit dili na nimo kinahanglan nga i-debug kini. Apan sa imong custom filter, ikaw ang agalon sa imong kaugalingong swerte, ug ang oras nga imong gigugol sa pagpangita og mga leak sa imong code magdepende sa imong katukma. Aron makunhuran ang imong oras sa pag-debug, kinahanglan natong hunahunaon ang mga teknik sa leak localization atol sa paghimo og filter. Dugang pa, ang usa ka leak mahimong makita lamang kung ang filter ipadapat sa usa ka tinuod nga sistema, diin ang gidaghanon sa "mga suspek" mahimong daghan ug ang oras sa pag-debug limitado.

Giunsa pagpakita ang memory leak?

Lohikal nga hunahunaon nga ang output sa programa ibabaw Ang porsyento sa memorya nga giokupar sa imong aplikasyon ipakita isip nagkataas nga porsyento.

Ang panggawas nga pagpakita mao nga sa pila ka punto ang sistema mahimong hinay sa pagtubag sa mga lihok sa mouse ug ang screen hinay nga magdrowing pag-usab. Ang system log mahimo usab nga modako, nga mokonsumo sa espasyo sa hard drive. Samtang, ang imong aplikasyon magsugod sa paglihok nga katingad-an, dili motubag sa mga sugo, dili makaabli sa mga file, ug uban pa.

Aron mahibal-an ang pagkahitabo sa usa ka leak, mogamit kita og memory analyzer (dinhi tawgon nga analyzer). Mahimo kini Valgrind (maayo nga artikulo bahin niini) o gitukod sa compiler gcc MemorySanitizer o uban pa. Kung ang analyzer nagpakita nga ang leak nahitabo sa usa sa mga graph filter, panahon na aron gamiton ang usa sa mga pamaagi nga gihulagway sa ubos.

Ang Pamaagi sa Tulo ka Pino

Sama sa nahisgotan na, kon adunay memory leak nga mahitabo, ang analyzer motudlo sa filter nga nangayo og heap memory allocation. Apan, dili kini motudlo sa filter nga "nakalimot" sa pagbalik niini, nga mao gyud ang hinungdan. Busa, ang analyzer makakumpirma lang sa atong mga kabalaka, apan dili makatino sa ilang tinuod nga hinungdan.

Aron mahibal-an ang lokasyon sa "daotan" nga filter sa graph, mahimo nimong pakunhuran ang graph ngadto sa pinakagamay nga gidaghanon sa mga node diin ang analyzer makamatikod gihapon sa leak ug i-localize ang problematic filter sa nahibiling tulo ka pin.

Apan, posible nga pinaagi sa pagpakunhod sa gidaghanon sa mga filter sa graph, imong mabalda ang normal nga interaksyon tali sa mga filter ug uban pang mga elemento sa imong sistema, ug ang leak dili na makita. Sa kini nga kaso, kinahanglan nimong gamiton ang full-sized nga graph ug gamiton ang pamaagi nga gihulagway sa ubos.

Pamaagi sa pag-slide sa insulator

Para sa kasayon, mogamit kita og graph nga gilangkoban sa usa ka filter chain. Kini gipakita sa hulagway.

Pagsuhid sa Mediastreamer2 VoIP engine. Bahin 12

Usa ka tipikal nga graph, diin, uban sa mga andam nang filter sa media streamer, upat ka custom filter (F1...F4) sa upat ka lain-laing klase ang gigamit. Kini nga mga filter gihimo dugay na ug masaligon sa ilang katukma. Bisan pa, atong hunahunaon nga daghan niini ang adunay memory leak. Sa pagpadagan sa atong analyzer monitoring program, atong nahibal-an gikan sa report niini nga ang usa ka filter nangayo og usa ka piho nga kantidad sa memorya ug wala kini ibalik sa heap N ka beses. Sayon ra tag-an nga adunay usa ka pakisayran sa internal nga mga gimbuhaton sa filter, sama sa MS_VOID_SOURCE. Ang katuyoan niini mao ang pagkuha sa memorya gikan sa heap. Ang ubang mga filter gituyo nga ibalik kini didto. Sa laing pagkasulti, atong makit-an ang usa ka leak.

Aron mahibal-an kung asa sa pipeline nahitabo ang memory leak, among gisugyot ang pagpaila og dugang nga filter nga mobalhin lang sa mga mensahe gikan sa input ngadto sa output, apan sa pagbuhat niini makahimo og "bug-at" nga kopya sa input message, imbes nga gaan, ug dayon hingpit nga ilabay ang input message. Tawgon nato kini nga filter nga isolator. Nagtuo kita nga tungod kay simple ang filter, kini makawagtang sa mga leak. Laing bentaha mao nga ang pagdugang niini bisan asa sa atong graph walay epekto sa operasyon sa circuit. Atong ihulagway ang isolator filter isip usa ka lingin nga adunay doble nga outline.

Atong i-enable ang isolator dayon human sa voidsource filter:
Pagsuhid sa Mediastreamer2 VoIP engine. Bahin 12

Atong padaganon pag-usab ang programa sa analyzer, ug niining higayona, ang analyzer ang mobasol sa isolator. Kay kini man ang nagmugna sa mga data block nga mawala sa usa ka wala mailhi ug wala tuyoa nga filter (o mga filter). Ang sunod nga lakang mao ang pagbalhin sa isolator ngadto sa tuo subay sa kadena, pinaagi sa usa ka filter, ug padaganon pag-usab ang pag-analisa. Busa, pinaagi sa hinay-hinay nga pagbalhin sa isolator ngadto sa tuo, atong makita ang usa ka sitwasyon diin ang gidaghanon sa "leaked" memory blocks mokunhod sa sunod nga report sa analyzer. Kini nagpasabot nga niining lakanga, ang isolator mibalhin na ngadto sa kadena human dayon sa problematic filter. Kon usa ra ka "daotan" nga filter ang naa, ang leak mawala sa hingpit. Busa, atong na-localize ang problematic filter (o usa sa daghan). Human "maayo" ang filter, mahimo natong ipadayon ang pagbalhin sa isolator ngadto sa tuo subay sa kadena hangtod nga ang memory leak hingpit nga mawala.

Pagpatuman sa usa ka filter-isolator

Ang implementasyon sa isolator morag usa ka regular nga filter. Header file:

/* Файл 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

Ang filter mismo:

/* Файл 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)

Pamaagi sa pag-ilis sa mga gimbuhaton sa pagdumala sa memorya

Alang sa mas detalyado nga panukiduki, ang media streamer adunay abilidad sa pag-override sa mga function sa memory access gamit ang imoha, nga, dugang sa mga panguna nga function niini, magrekord sa "Kinsa, Asa, ug Ngano." Tulo ka function ang mahimong i-override. Kini gihimo sama sa mosunod:

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);

Kini nga bahin makatabang sa mga kaso diin ang analyzer mopahinay pag-ayo sa mga filter nga makabalda sa sistema diin gilakip ang atong circuit. Sa ingon nga sitwasyon, kinahanglan natong biyaan ang analyzer ug mogamit og mga memory management override.

Among gisusi ang algorithm para sa usa ka simple, walay sanga nga graph. Kini nga pamaagi magamit sa ubang mga kaso, bisan kung adunay dugang nga pagkakomplikado, ang ideya nagpabilin nga pareho.

Sa sunod nga artikulo, atong tan-awon ang isyu sa pagtimbang-timbang sa load sa usa ka ticker ug mga paagi aron masumpo ang sobra nga computing load sa usa ka media streamer.

Source: www.habr.com

Pagpalit kasaligan nga pag-host alang sa mga site nga adunay proteksyon sa DDoS, mga server sa VPS VDS 🔥 Pagpalit og kasaligang website hosting nga adunay proteksyon sa DDoS, VPS VDS servers | ProHoster