Entdeckt de Mediastreamer2 VoIP-Motor. Deel 12

D'Material vum Artikel ass aus mengem zen Kanal.

Entdeckt de Mediastreamer2 VoIP-Motor. Deel 12

An der leschter Artikel, Ech hu versprach, d'Thema vun der Bewäertung vun der Belaaschtung op den Ticker a Weeër ze bekämpfen fir exzessiv Rechenbelaaschtung am Media Streamer ze bekämpfen. Awer ech hunn décidéiert datt et méi logesch wier d'Froen vum Debugging Handwierksfilter am Zesummenhang mat Datenbewegung ze decken an nëmmen dann d'Thema vun der Leeschtungsoptimiséierung betruechten.

Debugging Handwierksfilter

Nodeems mir de Mechanismus fir d'Bewegung vun Daten an engem Medienstreamer am viregten Artikel gekuckt hunn, wier et logesch iwwer d'Gefore ze schwätzen, déi dra verstoppt sinn. Ee vun de Funktiounen vum "Dateflow" Prinzip ass datt d'Erënnerung aus dem Koup a Filtere zougewisen ass, déi an der Quell vum Datefloss lokaliséiert sinn, an d'Erënnerung gëtt befreit an zréck an de Koup duerch Filtere, déi um Enn vum Flux sinn. Wee. Zousätzlech kann d'Schafung vun neien Donnéeën a seng Zerstéierung iergendwou tëscht optrieden. Allgemeng gëtt d'Erënnerungsverëffentlechung vun engem anere Filter ausgefouert wéi deen deen den Dateblock erstallt huet.

Aus der Siicht vun der transparenter Gedächtnisiwwerwaachung wier et raisonnabel fir de Filter, wann hien en Inputblock kritt huet, en direkt no der Veraarbechtung ze zerstéieren, d'Erënnerung ze befreien an en nei erstallt Block mat Ausgangsdaten auszeginn. An dësem Fall wäert e Gedächtnisleck am Filter liicht verfollegt ginn - wann den Analyser e Leck am Filter entdeckt huet, da zerstéiert de nächste Filter net erakommen Blocks richteg an et gëtt e Feeler dran. Awer aus der Siicht fir héich Leeschtung ze erhalen, ass dës Approche fir mat Datenblocken ze schaffen net produktiv - et féiert zu enger grousser Zuel vun Operatiounen fir d'Erënnerung / fräi Erënnerung fir Datenblocken ouni nëtzlech Ausgang ze verdeelen.

Aus dësem Grond, Media Streamer Filteren, fir d'Datenveraarbechtung net ze luesen, benotze Funktiounen déi einfach Kopien erstellen wann Dir Messagen kopéiert (mir hunn iwwer se am virege Artikel geschwat). Dës Funktiounen erstellen nëmmen eng nei Instanz vum Message Header andeems se e Block vun Daten aus der "aler" Message kopéiert "befestegt". Als Resultat ginn zwee Header un engem Dateblock befestegt an de Referenzzieler am Dateblock gëtt eropgebaut. Awer et wäert ausgesinn wéi zwee Messagen. Et kënne méi Messagen mat sou engem "sozialiséierten" Dateblock sinn, zum Beispill, de MS_TEE-Filter generéiert eng Dose vu sou Liichtkopien gläichzäiteg, verdeelt se ënner sengen Ausgänge. Wann all Filtere an der Kette richteg funktionnéieren, um Enn vun der Pipeline soll dëse Referenzziel null erreechen an d'Erënnerungsverëffentlechungsfunktioun gëtt genannt: ms_free(). Wann den Uruff net geschitt, da gëtt dëst Erënnerungsstéck net méi an de Koup zréckgezunn, d.h. et wäert "lecken". De Präis fir liicht Kopien ze benotzen ass de Verloscht vun der Fäegkeet fir einfach ze bestëmmen (wéi de Fall mat normale Kopien wier) wéi eng Grafikfilter Erënnerung leeft.

Zënter datt d'Media Streamer Entwéckler verantwortlech sinn fir Erënnerungslecks an native Filteren ze fannen, musst Dir se héchstwahrscheinlech net debuggen. Awer mat Ärem Handwierksfilter sidd Dir de Spriecher vun Ärem eegene Gléck, an d'Zäit déi Dir verbréngt fir no Leckage an Ärem Code ze sichen hänkt vun Ärer Genauegkeet of. Fir Är Debugging Zäit ze reduzéieren, musse mir Leckdetektiounstechnike kucken wann Dir Filteren entwéckelen. Zousätzlech kann et geschéien datt de Leck sech nëmme manifestéiert wann de Filter an engem richtege System applizéiert gëtt, wou d'Zuel vun "Verdächtegen" enorm ka sinn an d'Zäit fir Debugging limitéiert.

Wéi manifestéiert sech e Gedächtnisleck?

Et ass logesch ze iwwerhuelen datt am Programmausgang erop wäert de wuessende Prozentsaz vun Erënnerung besat vun Ärer Applikatioun weisen.

Déi extern Manifestatioun wäert sinn datt iergendwann de System ufänkt lues op d'Mausbewegung z'äntwerten a lues den Ecran nei ze zéien. Et ass och méiglech datt de Systemprotokoll wäert wuessen, Plaz op Ärer Festplack iessen. An dësem Fall fänkt Är Applikatioun komesch ze behuelen, net op Befehle reagéieren, keng Datei opmaachen asw.

Fir d'Optriede vun engem Leck z'entdecken, benotze mir en Erënnerungsanalysator (nodréiglech den Analyser bezeechent). Et kéint sinn valgrind (gutt en Artikel doriwwer) oder an de Compiler agebaut gcc Memory Sanitizer oder soss eppes. Wann den Analyser weist datt e Leck an engem vun de Grafikfiltere geschitt, heescht dat datt et Zäit ass eng vun de Methoden hei ënnendrënner anzesetzen.

Dräi Pinien Method

Wéi uewen erwähnt, wann et e Gedächtnisleck ass, weist den Analysator op de Filter deen d'Erënnerungsallokatioun vum Koup gefrot huet. Awer et wäert net op de Filter weisen, deen "vergiess" huet et zréckzekommen, wat tatsächlech den Täter ass. Also kann den Analyser nëmmen eis Ängscht bestätegen, awer net hir Wuerzel uginn.

Fir de Standort vum "schlechten" Filter an der Grafik erauszefannen, kënnt Dir goen andeems Dir d'Grafik op d'Mindestzuel vu Knäpper reduzéiert, bei deenen den Analysator nach ëmmer e Leck erkennt an de problematesche Filter an de verbleiwen dräi Pinien lokaliséieren.

Awer et kann geschéien datt andeems Dir d'Zuel vun de Filteren an der Grafik reduzéiert, Dir wäert den normale Laf vun der Interaktioun tëscht Filteren an aner Elementer vun Ärem System stéieren an de Leck net méi erscheint. An dësem Fall musst Dir mat enger voller Gréisst Grafik schaffen an d'Approche benotzen déi hei ënnendrënner beschriwwe gëtt.

Rutschend Isoléiermethod

Fir Einfachheet vun der Presentatioun wäerte mir eng Grafik benotzen déi aus enger Kette vu Filtere besteet. Si gëtt op der Foto gewisen.

Entdeckt de Mediastreamer2 VoIP-Motor. Deel 12

Eng regulär Grafik, an där, zesumme mat fäerdege Media Streamer Filtere, véier Handwierksfilter F1...F4 benotzt ginn, vu véier verschiddenen Typen, déi Dir viru laanger Zäit gemaach hutt a keen Zweiwel iwwer hir Richtegkeet hutt. Loosst eis awer unhuelen datt e puer vun hinnen Erënnerungslecks hunn. Mir lafen eise Programm fir den Analyser ze iwwerwaachen, mir léiere vu sengem Bericht datt e bestëmmte Filter e gewësse Betrag u Gedächtnis gefrot huet an et net an de Koup N Zuel vun Mol zréckginn. Dir kënnt einfach roden datt et e Link op déi intern Filterfunktiounen vum Typ MS_VOID_SOURCE gëtt. Seng Aufgab ass d'Erënnerung aus dem Koup ze huelen. Aner Filtere mussen et do zréckginn. Déi. mir wäerten de Fakt vum Leck entdecken.

Fir ze bestëmmen a wéi enger Sektioun vun der Pipeline et Inaktioun war, déi zu engem Gedächtnisleck féiert, gëtt proposéiert en zousätzleche Filter aféieren, deen einfach Messagen vun Input op Output verännert, awer gläichzäiteg eng Kopie vun der Input Message erstellt déi net hell ass , mä éischter eng normal "schwéier", läscht dann de Message bei der Entrée komplett. Mir nennen esou e Filter en Isolator. Mir gleewen datt well de Filter einfach ass, et gëtt kee Leckage dran. An eng méi positiv Eegeschafte - wa mir et iergendwou an eiser Grafik addéieren, wäert dat op kee Fall d'Operatioun vum Circuit beaflossen. Mir wäerten de Filter-Isolator an der Form vun engem Krees mat engem duebele Circuit duerstellen.

Mir schalten den Isolator direkt nom Voidsourcefilter un:
Entdeckt de Mediastreamer2 VoIP-Motor. Deel 12

Mir lafen de Programm mat dem Analysator erëm, a mir gesinn datt dës Kéier den Analysator den Isolator zouginn. No allem ass et deen, deen elo Blocks vun Daten erstellt, déi dann duerch en onbekannt onbekannt Filter (oder Filtere) verluer ginn. De nächste Schrëtt ass den Isolator laanscht d'Kette no riets ze réckelen, ee Filter, a fänkt d'Analyse erëm un. Also, Schrëtt fir Schrëtt, den Isolator no riets ze beweegen, wäerte mir eng Situatioun kréien, wou am nächsten Analyserbericht d'Zuel vun "leckt" Erënnerungsblocken erofgeet. Dëst bedeit datt op dësem Schrëtt den Isolator direkt nom Problemfilter an der Kette war. Wann et nëmmen ee "schlechten" Filter war, da wäert de Leck ganz verschwannen. Also hu mir de problematesche Filter (oder ee vun e puer) lokaliséiert. Nodeems mir de Filter "fix" hunn, kënne mir weiderhin den Isolator no riets laanscht d'Kette bewegen bis mir d'Erënnerung komplett besiegen.

Ëmsetzung vun engem Isolatorfilter

D'Isolatorimplementatioun gesäit aus wéi e normale Filter. Header Datei:

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

De Filter selwer:

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

Method fir Erënnerung Gestioun Funktiounen z'ersetzen

Fir méi subtile Fuerschung bitt de Media Streamer d'Fäegkeet fir Erënnerungszougang Funktiounen mat Ären eegenen ze ersetzen, déi nieft der Haaptaarbecht "Wien, wou a firwat" ophuelen. Dräi Funktiounen ginn ersat. Dëst gëtt gemaach wéi follegt:

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

Dës Fonktioun hëlleft a Fäll wou den Analyser d'Operatioun vun de Filtere verlangsamt esou vill datt d'Operatioun vum System, an deem eise Circuit gebaut ass, gestéiert gëtt. An esou enger Situatioun musst Dir den Analysator opginn an d'Ersatz vun de Funktiounen benotze fir mat Erënnerung ze schaffen.

Mir hunn en Algorithmus vun Aktiounen fir eng einfach Grafik berücksichtegt déi keng Filialen enthält. Awer dës Approche kann op aner Fäll applizéiert ginn, natierlech mat méi Komplexitéit, awer d'Iddi bleift déiselwecht.

Am nächsten Artikel wäerte mir d'Thema vun der Ticker-Laaschtschätzung kucken a wéi Dir mat exzessiver Rechenbelaaschtung am Media Streamer ëmgeet.

Source: will.com

Setzt e Commentaire