Njelajah mesin Mediastreamer2 VoIP. Bagean 12

Materi artikel dijupuk saka sandi saluran zen.

Njelajah mesin Mediastreamer2 VoIP. Bagean 12

Ing pungkasan artikel, Aku janji bakal nimbang masalah ngevaluasi beban ing ticker lan cara kanggo nglawan beban komputasi sing berlebihan ing streamer media. Nanging aku mutusake yen bakal luwih logis kanggo nutupi masalah debugging saringan kerajinan sing ana hubungane karo gerakan data lan mung banjur nimbang masalah optimasi kinerja.

Debugging saringan kerajinan

Sawise kita ndeleng mekanisme kanggo mindhah data ing streamer media ing artikel sadurunge, bakal logis kanggo ngomong babagan bebaya sing didhelikake. Salah sawijining fitur saka prinsip "aliran data" yaiku memori diparengake saka tumpukan ing saringan sing ana ing sumber aliran data, lan memori dibebasake lan bali menyang tumpukan kanthi saringan sing ana ing mburi aliran. dalan. Kajaba iku, nggawe data anyar lan karusakane bisa kedadeyan ing endi wae. UmumΓ©, release memori dileksanakake dening Filter beda saka siji sing nggawe pamblokiran data.

Saka titik tampilan saka ngawasi memori transparent, iku bakal cukup kanggo Filter, nalika nampa pemblokiran input, langsung numpes sawise Processing, freeing memori, lan output pemblokiran mentas digawe karo data output. Ing kasus iki, bocor memori ing panyaring bakal gampang dilacak - yen analisa ndeteksi bocor ing saringan, banjur saringan sabanjure ora ngrusak blok sing mlebu kanthi bener lan ana kesalahan. Nanging saka sudut pandang njaga kinerja sing dhuwur, pendekatan iki kanggo nggarap pamblokiran data ora produktif - ndadΓ©kakΓ© akeh operasi kanggo nyedhiakke / memori gratis kanggo pamblokiran data tanpa output sing migunani.

Mulane, saringan streamer media, supaya ora alon-alon pangolahan data, gunakake fungsi sing nggawe salinan gampang nalika nyalin pesen (kita ngomong babagan kasebut ing artikel sadurunge). Fungsi kasebut mung nggawe conto anyar saka header pesen kanthi "nempelake" menyang blok data saka pesen "lawas" sing disalin. AkibatΓ©, rong header dipasang ing siji blok data lan counter referensi ing blok data ditambahake. Nanging bakal katon kaya rong pesen. Bisa uga ana luwih akeh pesen kanthi blok data "disosialisasikan", contone, saringan MS_TEE ngasilake rolas salinan cahya kasebut bebarengan, disebarake ing antarane output. Yen kabeh saringan ing rantΓ© bisa mlaku kanthi bener, ing pungkasan saluran pipa, counter referensi iki kudu tekan nol lan fungsi rilis memori bakal diarani: ms_free(). Yen telpon ora kelakon, banjur iki Piece saka memori ora bakal bali menyang numpuk, i.e. bakal "bocor". Rega kanggo nggunakake salinan cahya iku mundhut saka kemampuan kanggo gampang nemtokake (minangka bakal kasus karo salinan biasa) kang graph Filter bocor memori.

Amarga pangembang streamer media tanggung jawab kanggo nemokake bocor memori ing saringan asli, sampeyan ora kudu debug. Nanging kanthi panyaring kerajinan sampeyan, sampeyan dadi walang rasa seneng dhewe, lan wektu sampeyan nggoleki bocor ing kode sampeyan bakal gumantung karo akurasi sampeyan. Kanggo nyuda wektu debugging, kita kudu ndeleng teknik deteksi bocor nalika ngembangake saringan. Kajaba iku, bisa uga kedadeyan bocor kasebut mung nalika saringan ditrapake ing sistem nyata, ing ngendi jumlah "tersangka" bisa uga akeh lan wektu kanggo debugging diwatesi.

Kepiye carane bocor memori katon?

Iku logis kanggo nganggep yen ing output program ndhuwur bakal nuduhake persentasi nambah memori sing dikuwasani dening aplikasi sampeyan.

Manifestasi eksternal yaiku ing sawetara titik sistem bakal mulai nanggapi gerakan mouse kanthi alon lan alon-alon gambar maneh layar. Sampeyan uga bisa log sistem bakal tuwuh, mangan papan ing hard drive. Ing kasus iki, aplikasi sampeyan bakal mulai tumindak aneh, ora nanggapi perintah, ora bisa mbukak file, lsp.

Kanggo ndeteksi kedadeyan bocor, kita bakal nggunakake analisa memori (sabanjure diarani analisa). Bisa uga valgrind (apik artikel babagan) utawa dibangun ing compiler gcc MemorySanitizer utawa liyane. Yen analisa nuduhake yen ana bocor ing salah sawijining saringan grafik, mula iki tegese wektu kanggo ngetrapake salah sawijining metode sing diterangake ing ngisor iki.

Metode Three Pines

Kaya kasebut ing ndhuwur, yen ana bocor memori, analisa bakal nuding filter sing njaluk alokasi memori saka tumpukan kasebut. Nanging ora bakal nuduhake panyaring sing "kelalen" kanggo bali, sing, nyatane, minangka pelakune. Mangkono, analisa mung bisa ngonfirmasi rasa wedi kita, nanging ora nuduhake oyod.

Kanggo ngerteni lokasi panyaring "ala" ing grafik, sampeyan bisa nyuda grafik menyang jumlah minimal kelenjar ing ngendi analisa isih ndeteksi bocor lan lokalisasi saringan masalah ing telung pinus sing isih ana.

Nanging bisa uga kedadeyan yen kanthi nyuda jumlah saringan ing grafik, sampeyan bakal ngganggu interaksi normal antarane saringan lan unsur liyane ing sistem sampeyan lan bocor ora bakal katon maneh. Ing kasus iki, sampeyan kudu nggarap grafik ukuran lengkap lan nggunakake pendekatan sing digarisake ing ngisor iki.

Metode insulator geser

Kanggo gamblang saka presentation, kita bakal nggunakake grafik sing kasusun saka siji chain saka saringan. Dheweke ditampilake ing gambar.

Njelajah mesin Mediastreamer2 VoIP. Bagean 12

Grafik reguler sing, bebarengan karo saringan streamer media sing wis siap, papat saringan kerajinan F1...F4 digunakake, saka papat jinis sing beda-beda, sing wis digawe suwene suwe lan ora mangu-mangu babagan benere. Nanging, ayo nganggep sawetara sing duwe bocor memori. Mlaku program kita kanggo ngawasi analyzer, kita sinau saka laporan sing panyaring tartamtu njaluk jumlah tartamtu saka memori lan ora bali menyang tumpukan N kaping pirang-pirang. Sampeyan bisa kanthi gampang ngira yen bakal ana link menyang fungsi filter internal jinis MS_VOID_SOURCE. Tugase yaiku njupuk memori saka tumpukan. Filter liyane kudu bali ing kana. Sing. kita bakal ndeteksi kasunyatan bocor.

Kanggo nemtokake bagean pipa sing ora ana tumindak sing nyebabake bocor memori, disaranake ngenalake saringan tambahan sing mung mindhah pesen saka input menyang output, nanging ing wektu sing padha nggawe salinan pesen input sing ora entheng. , nanging luwih "abot" normal, banjur mbusak pesen sing ditampa ing lawang. Kita bakal nyebut filter kasebut minangka insulator. Kita pitados bilih wiwit saringan punika prasaja, ora ana bocor ing. Lan siji liyane positif - yen ditambahake ing ngendi wae ing grafik, iki ora bakal mengaruhi operasi sirkuit ing sembarang cara. Kita bakal nggambarake filter-isolator ing wangun bunder kanthi sirkuit ganda.

Kita nguripake isolator sanalika sawise panyaring voidsource:
Njelajah mesin Mediastreamer2 VoIP. Bagean 12

We mbukak program karo analyzer maneh, lan kita waca wektu iki analyzer bakal nyalahke insulator. Sawise kabeh, dheweke sing saiki nggawe blok data, sing banjur ilang dening panyaring ceroboh sing ora dingerteni (utawa saringan). Langkah sabanjure yaiku mindhah insulator ing sadawane rantΓ© menyang sisih tengen, kanthi siji saringan, lan miwiti analisis maneh. Dadi, langkah demi langkah ngobahake isolator ing sisih tengen, kita bakal entuk kahanan ing laporan analisa sabanjure jumlah blok memori "bocor" bakal suda. Iki tegese ing langkah iki insulator ana ing chain sanalika sawise Filter masalah. Yen mung ana siji filter "ala", bocor bakal ilang kabeh. Mangkono, kita wis lokal Filter masalah (utawa salah siji saka sawetara). Sawise "mbenerake" saringan, kita bisa terus mindhah isolator ing sisih tengen rantai nganti kita ngalahake bocor memori.

Implementasi saringan isolator

Implementasi isolator katon kaya filter biasa. File header:

/* Π€Π°ΠΉΠ» 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

Filter kasebut dhewe:

/* Π€Π°ΠΉΠ» 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)

Cara kanggo ngganti fungsi manajemen memori

Kanggo riset sing luwih subtle, streamer media nyedhiyakake kemampuan kanggo ngganti fungsi akses memori karo sampeyan dhewe, sing, saliyane karya utama, bakal ngrekam "Sapa, ing ngendi lan kenapa". Telung fungsi diganti. Iki ditindakake kaya ing ngisor iki:

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

Fitur iki mbantu ing kasus-kasus ing ngendi analisa nyepetake operasi saringan supaya operasi sistem sing dibangun sirkuit diganggu. Ing kahanan kaya mengkono, sampeyan kudu ninggalake analyzer lan nggunakake substitusi fungsi kanggo nggarap memori.

Kita wis dianggep minangka algoritma tumindak kanggo grafik prasaja sing ora ngemot cabang. Nanging pendekatan iki bisa ditrapake kanggo kasus liyane, mesthine kanthi kerumitan sing luwih rumit, nanging ide kasebut tetep padha.

Ing artikel sabanjure, kita bakal ndeleng masalah ngira beban ing ticker lan cara kanggo ngatasi beban komputasi sing berlebihan ing streamer media.

Source: www.habr.com

Add a comment