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 artikulo, misaad ko nga tagdon ang isyu sa ticker load estimation ug mga paagi sa pag-atubang sa sobra nga computing load sa media streamer. Apan nakahukom ko nga mas makataronganon ang pagtabon sa mga isyu sa pag-debug sa mga craft filter nga may kalabutan sa paglihok sa datos ug unya ikonsiderar ang mga isyu sa pag-optimize sa performance.

Pag-debug sa mga filter sa craft

Human nato masusi ang mekanismo sa paglihok sa datos sa usa ka streamer sa media sa miaging artikulo, makatarunganon nga hisgutan ang mga kapeligrohan nga natago niini. Usa sa mga bahin sa prinsipyo sa "data flow" mao nga ang alokasyon sa memorya gikan sa heap mahitabo sa mga filter nga nahimutang sa mga tinubdan sa data flow, ug ang mga filter nga nahimutang sa katapusan sa agianan sa agianan nag-deallocate na sa memorya nga adunay pagbalik. ngadto sa tapok. Dugang pa, ang pagmugna sa bag-ong datos ug ang ilang pagkaguba mahimong mahitabo sa usa ka dapit sa intermediate nga mga punto. Sa kinatibuk-an, ang pagpagawas sa memorya gihimo sa usa ka filter gawas sa usa nga nagmugna sa data block.

Gikan sa punto sa panglantaw sa transparent nga pag-monitor sa memorya, kini mahimong makatarunganon alang sa filter, sa diha nga nakadawat sa usa ka input block, sa diha-diha dayon sa paglaglag niini human sa pagproseso, pagpalingkawas sa panumduman, ug pagbutang sa usa ka bag-o nga gibuhat block uban sa output data sa output. Sa kini nga kaso, ang pagtulo sa memorya sa filter mahimong dali nga masubay - kung ang analista nakamatikod sa usa ka pagtulo sa filter, nan ang filter nga nagsunod niini dili husto nga makaguba sa umaabot nga mga bloke ug adunay sayup niini. Apan gikan sa punto sa panglantaw sa pagmintinar sa hatag-as nga performance, kini nga pamaagi sa pagtrabaho uban sa mga bloke sa data dili produktibo - kini modala ngadto sa usa ka dako nga gidaghanon sa mga operasyon sa paggahin / libre nga panumduman alang sa data block nga walay bisan unsa nga mapuslanon nga tambutso.

Tungod niini nga hinungdan, ang mga filter sa media streamer, aron dili mapahinay ang pagproseso sa datos, naggamit sa mga function nga nagmugna og mga light copy sa dihang nagkopya sa mga mensahe (naghisgot kami mahitungod niini sa miaging artikulo). Kini nga mga gimbuhaton naghimo lamang og bag-ong kopya sa header sa mensahe pinaagi sa "paglakip" sa data block gikan sa gikopya nga "daan" nga mensahe niini. Ingon nga resulta, duha ka mga header ang gilakip sa usa ka data block ug ang reference counter sa data block gidugangan. Apan morag duha ka mensahe. Mahimong adunay daghang mga mensahe nga adunay ingon nga "publiko" nga bloke sa datos, pananglitan, ang filter sa MS_TEE nagpatunghag napulo ka ingon nga gaan nga mga kopya sa usa ka higayon, nga nag-apod-apod niini sa mga output niini. Kung ang tanan nga mga pagsala sa kadena molihok sa husto, sa katapusan sa pipeline kini nga reference count kinahanglan nga moabot sa zero ug ang memory deallocation function tawgon: ms_free(). Kung ang tawag dili mahitabo, nan kini nga piraso sa panumduman dili na ibalik sa pundok, i.e. siya "nagtulo". Ang gasto sa paggamit sa gaan nga mga kopya mao ang pagkawala sa abilidad sa dali nga pagtino (sama sa kaso sa paggamit sa regular nga mga kopya) diin ang graph filter ang memorya nagtulo.

Tungod kay ang responsibilidad sa pagpangita sa mga pagtulo sa memorya sa "lumad" nga mga pagsala anaa sa mga nag-develop sa media streamer, nan lagmit dili nimo kinahanglan nga i-debug kini. Apan sa imong crafting filter, ikaw mismo ang apan sa imong kaugalingon nga kalipay, ug ang oras nga imong gigugol sa pagpangita sa mga pagtulo sa imong code magdepende sa imong katukma. Aron maminusan ang imong oras sa pag-debug, kinahanglan namon nga tan-awon ang mga pamaagi sa pag-localize sa pagtulo sa pagdesinyo sa mga filter. Dugang pa, mahimo’g mahitabo nga ang pagtulo magpakita sa kaugalingon lamang kung ang pag-apply sa filter sa usa ka tinuud nga sistema, diin ang gidaghanon sa mga "mga suspetsado" mahimong dako, ug ang oras sa pag-debug limitado.

Giunsa pagpakita sa usa ka memory leak ang iyang kaugalingon?

Makataronganon ang paghunahuna nga sa output sa programa ibabaw magpakita sa nagkadaghang porsyento sa memorya nga giokupar sa imong aplikasyon.

Ang eksternal nga pagpakita maglangkob sa kamatuoran nga sa usa ka punto ang sistema hinay nga molihok sa paglihok sa mouse, hinayhinay nga gi-redrawing ang screen. Posible usab nga ang log sa sistema motubo, nga mokaon sa espasyo sa hard drive. Sa kini nga kaso, ang imong aplikasyon magsugod sa paggawi nga katingad-an, dili pagtubag sa mga mando, dili maablihan ang file, ug uban pa.

Aron mahibal-an ang kamatuoran sa usa ka pagtulo, mogamit kami usa ka tig-analisar sa panumduman (gitawag nga tig-analisar). Mahimo nga valgrind (maayo nga artikulo mahitungod niini) o gitukod sa compiler gcc MemorySanitizer o uban pa. Kung gipakita sa analisador nga ang pagtulo nahitabo sa usa sa mga filter sa graph, nan kini nagpasabut nga panahon na nga magamit ang usa sa mga pamaagi nga gihulagway sa ubos.

Tulo ka Pine nga Pamaagi

Sama sa nahisgutan sa ibabaw, kung adunay usa ka pagtulo sa memorya, ang analisador magpunting sa filter nga nangayo nga alokasyon sa memorya gikan sa tambak. Apan dili kini magpunting sa salaan nga "nakalimot" nga ibalik kini, nga, sa tinuud, ang mabasol. Sa ingon, ang analisador makakumpirma lamang sa atong mga kahadlok, apan dili magtudlo sa ilang gamut.

Aron mahibal-an ang lokasyon sa "dili maayo" nga filter sa graph, mahimo ka nga moadto pinaagi sa pagkunhod sa graph sa labing gamay nga gidaghanon sa mga node diin ang analisador nakamatikod gihapon sa usa ka pagtulo ug nakit-an ang problema nga filter sa nahabilin nga tulo nga mga pine.

Apan mahimo’g mahitabo nga pinaagi sa pagkunhod sa gidaghanon sa mga pagsala sa kolum imong mabalda ang normal nga dagan sa interaksyon tali sa mga pagsala ug uban pang mga elemento sa imong sistema ug dili na makita ang pagtulo. Sa kini nga kaso, kinahanglan nimo nga magtrabaho sa usa ka bug-os nga gidak-on nga graph ug gamiton ang pamaagi nga gihulagway sa ubos.

Sliding insulator nga pamaagi

Alang sa kayano sa presentasyon, mogamit kami og graph nga naglangkob sa usa ka kutay sa mga filter. Gipakita siya sa hulagway.

Pagsuhid sa Mediastreamer2 VoIP engine. Bahin 12

Usa ka ordinaryo nga graph, diin, uban sa andam na nga media streamer nga mga filter, upat ka craft filter F1…F4 ang gigamit, upat ka lain-laing mga matang nga imong gihimo sa dugay na nga panahon ug walay pagduhaduha mahitungod sa ilang pagkahusto. Bisan pa, hunahunaa nga daghan kanila adunay usa ka memory leak. Kung gipadagan ang among programa sa pagdumala sa analisador, nahibal-an namon gikan sa taho niini nga ang usa ka filter nangayo usa ka piho nga kantidad sa memorya ug wala kini ibalik sa heap N nga mga panahon. Sayon ang pagtag-an nga adunay usa ka pakisayran sa internal nga pagsala nga mga gimbuhaton sa MS_VOID_SOURCE nga tipo. Ang iyang tahas mao ang pagkuha sa memorya gikan sa tapok. Ang ubang mga filter kinahanglan nga ibalik kini didto. Mga. pangitaon nato ang leak.

Aron mahibal-an kung asa nga seksyon sa pipeline nga dili aktibo ang nahitabo nga misangpot sa usa ka memory leak, gisugyot nga ipaila ang usa ka dugang nga filter nga yano nga nagbalhin sa mga mensahe gikan sa input ngadto sa output, apan sa samang higayon nagmugna og dili kahayag, normal. "bug-at" nga kopya sa input nga mensahe, unya hingpit nga tangtangon ang mensahe nga miabot sa output. entrance. Tawgon nato ang ingon nga filter nga insulator. Kami nagtuo nga tungod kay ang filter yano ra, ang pagtulo niini wala iapil. Ug usa pa nga positibo nga kabtangan - kung atong idugang kini sa bisan unsang lugar sa among graph, nan dili kini makaapekto sa operasyon sa circuit sa bisan unsang paagi. Atong ihulagway ang insulator filter isip usa ka lingin nga adunay double contour.

I-enable ang isolator pagkahuman sa voidsourse filter:
Pagsuhid sa Mediastreamer2 VoIP engine. Bahin 12

Gipadagan namon ang programa uban ang analisador pag-usab, ug among nakita nga niining higayona, ang analisador magbutang sa pagbasol sa isolator. Human sa tanan, kini siya nga karon naghimo sa mga bloke sa data, nga unya nawala sa usa ka wala mailhi nga negligent filter (o mga pagsala). Ang sunod nga lakang mao ang pagbalhin sa insulator subay sa kadena sa tuo, pinaagi sa usa ka filter, ug sugdi pag-usab ang pagtuki. Mao nga, sa hinay-hinay, pagbalhin sa isolator sa tuo, nakakuha kami usa ka sitwasyon kung ang gidaghanon sa mga "leaked" nga mga bloke sa memorya sa sunod nga taho sa analisador mikunhod. Kini nagpasabut nga sa kini nga lakang ang insulator natapos sa kadena pagkahuman sa problema nga filter. Kung adunay usa lamang ka "dili maayo" nga filter, ang pagtulo mawala sa tanan. Sa ingon, among gi-localize ang problema nga filter (o usa sa daghan). Sa "pag-ayo" sa filter, mahimo namong ipadayon ang pagbalhin sa isolator sa tuo ubay sa kadena hangtud nga ang mga pagtulo sa memorya hingpit nga mawagtang.

Pagpatuman sa usa ka isolator filter

Ang pagpatuman sa isolator morag usa ka normal nga filter. File sa ulohan:

/* Π€Π°ΠΉΠ» 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 labi ka maliputon nga panukiduki, ang media streamer naghatag kaarang sa pag-ilis sa mga function sa pag-access sa memorya sa imong kaugalingon, nga, dugang sa panguna nga trabaho, magrekord sa "Kinsa, asa ug ngano." Tulo ka mga gimbuhaton ang gipulihan. Gihimo kini sa mosunod nga paagi:

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 moabut sa pagluwas sa mga kaso kung ang analisador nagpahinay sa mga pagsala sa hilabihan nga ang operasyon sa sistema diin gitukod ang atong sirkito mabalda. Sa ingon nga kahimtang, kinahanglan nimong biyaan ang analisador ug gamiton ang pagpuli sa mga gimbuhaton sa panumduman.

Gikonsiderar namon ang usa ka algorithm sa mga aksyon alang sa usa ka yano nga graph nga wala’y mga sanga. Apan kini nga pamaagi mahimong magamit sa ubang mga kaso, siyempre uban ang komplikasyon, apan ang ideya nagpabilin nga pareho.

Sa sunod nga artikulo, atong tan-awon ang isyu sa ticker load estimation ug unsaon pag-atubang sa sobra nga computing load sa media streamer.

Source: www.habr.com

Idugang sa usa ka comment