Archwilio peiriant VoIP Mediastreamer2. Rhan 12

Mae deunydd yr erthygl yn cael ei gymryd o fy sianel zen.

Archwilio peiriant VoIP Mediastreamer2. Rhan 12

Yn yr olaf Erthygl, Addewais ystyried y mater o amcangyfrif llwyth ticker a ffyrdd o ddelio Γ’ llwyth cyfrifiadura gormodol yn y streamer cyfryngau. Ond penderfynais y byddai'n fwy rhesymegol ymdrin Γ’ materion dadfygio hidlwyr crefft sy'n ymwneud Γ’ symud data a dim ond wedyn ystyried materion optimeiddio perfformiad.

Difa chwilod hidlyddion crefft

Ar Γ΄l i ni archwilio mecanwaith symud data mewn llifiwr cyfryngau yn yr erthygl flaenorol, byddai'n rhesymegol siarad am y peryglon sydd wedi'u cuddio ynddo. Un o nodweddion yr egwyddor "llif data" yw bod dyraniad cof o'r domen yn digwydd yn yr hidlwyr sydd wedi'u lleoli yn ffynonellau'r llif data, ac mae'r hidlwyr sydd wedi'u lleoli ar ddiwedd y llwybr llif eisoes yn dyrannu'r cof gyda dychweliad i'r domen. Yn ogystal, gall creu data newydd a'u dinistrio ddigwydd rhywle yn y pwyntiau canolradd. Yn gyffredinol, mae rhyddhau cof yn cael ei berfformio gan hidlydd heblaw'r un a greodd y bloc data.

O safbwynt monitro cof yn dryloyw, byddai'n rhesymol i'r hidlydd, wrth dderbyn bloc mewnbwn, ei ddinistrio ar unwaith ar Γ΄l prosesu, rhyddhau cof, a rhoi bloc newydd ei greu gyda data allbwn ar yr allbwn. Yn yr achos hwn, gellid olrhain y gollyngiad cof yn yr hidlydd yn hawdd - pe bai'r dadansoddwr yn canfod gollyngiad yn yr hidlydd, yna nid yw'r hidlydd sy'n ei ddilyn yn dinistrio blociau sy'n dod i mewn yn iawn ac mae gwall ynddo. Ond o safbwynt cynnal perfformiad uchel, nid yw'r dull hwn o weithio gyda blociau data yn gynhyrchiol - mae'n arwain at nifer fawr o weithrediadau i ddyrannu / cof am ddim ar gyfer blociau data heb unrhyw wacΓ‘u defnyddiol.

Am y rheswm hwn, mae hidlyddion ffrydio cyfryngau, er mwyn peidio ag arafu prosesu data, wrth gopΓ―o negeseuon yn defnyddio swyddogaethau sy'n creu copΓ―au ysgafn (fe wnaethom siarad amdanynt mewn erthygl flaenorol). Dim ond trwy "atodi" y bloc data o'r neges "hen" a gopΓ―wyd y mae'r swyddogaethau hyn yn creu copi newydd o bennawd y neges. O ganlyniad, mae dau bennawd ynghlwm wrth un bloc data ac mae'r rhifydd cyfeirio yn y bloc data yn cynyddu. Ond bydd yn edrych fel dwy neges. Efallai y bydd mwy o negeseuon gyda bloc data "cyhoeddus" o'r fath, er enghraifft, mae'r hidlydd MS_TEE yn cynhyrchu deg copi ysgafn o'r fath ar unwaith, gan eu dosbarthu ymhlith ei allbynnau. Os yw'r holl hidlwyr yn y gadwyn yn gweithio'n gywir, erbyn diwedd y biblinell dylai'r cyfrif cyfeirio hwn gyrraedd sero a gelwir y swyddogaeth dyrannu cof yn: ms_rhydd(). Os na fydd yr alwad yn digwydd, yna ni fydd y darn hwn o gof yn cael ei ddychwelyd i'r domen mwyach, h.y. mae'n "gollwng". Y gost o ddefnyddio copΓ―au ysgafn yw colli'r gallu i benderfynu'n hawdd (fel y byddai yn achos defnyddio copΓ―au rheolaidd) ym mha hidlydd graff y mae'r cof yn gollwng.

Gan fod y cyfrifoldeb am ddod o hyd i ollyngiadau cof yn yr hidlwyr "brodorol" yn nwylo datblygwyr y ffrwdiwr cyfryngau, yna yn fwyaf tebygol ni fydd yn rhaid i chi eu dadfygio. Ond gyda'ch ffilter crefftio, chi'ch hun yw ceiliog rhedyn eich hapusrwydd eich hun, a bydd yr amser a dreuliwch yn chwilio am ollyngiadau yn eich cod yn dibynnu ar eich cywirdeb. Er mwyn cwtogi ar eich amser dadfygio, mae angen inni edrych ar dechnegau lleoleiddio gollyngiadau wrth ddylunio hidlwyr. Yn ogystal, gall ddigwydd y bydd y gollyngiad yn amlygu ei hun dim ond wrth gymhwyso'r hidlydd mewn system go iawn, lle gall nifer yr "amheuwyr" fod yn enfawr, ac mae'r amser ar gyfer dadfygio yn gyfyngedig.

Sut mae gollyngiad cof yn amlygu ei hun?

Mae'n rhesymegol tybio hynny yn allbwn y rhaglen top yn dangos canran gynyddol o gof a feddiannir gan eich cais.

Bydd yr amlygiad allanol yn cynnwys y ffaith y bydd y system ar ryw adeg yn ymateb yn araf i symudiad y llygoden, gan ail-lunio'r sgrin yn araf. Mae hefyd yn bosibl y bydd log y system yn tyfu, gan fwyta lle ar y gyriant caled. Yn yr achos hwn, bydd eich cais yn dechrau ymddwyn yn rhyfedd, heb ymateb i orchmynion, ni all agor y ffeil, ac ati.

I nodi'r ffaith bod gollyngiad, byddwn yn defnyddio dadansoddwr cof (y cyfeirir ato o hyn ymlaen fel y dadansoddwr). Gallai fod valgrind (da erthygl amdano) neu wedi'i gynnwys yn y casglwr gcc CofSanitizer neu rywbeth arall. Os yw'r dadansoddwr yn dangos bod y gollyngiad yn digwydd yn un o'r hidlwyr graff, yna mae'n golygu ei bod hi'n bryd defnyddio un o'r dulliau a ddisgrifir isod.

Dull Tri Phinwydd

Fel y soniwyd uchod, rhag ofn y bydd cof yn gollwng, bydd y dadansoddwr yn pwyntio at yr hidlydd a ofynnodd am ddyraniad cof o'r domen. Ond ni fydd yn tynnu sylw at yr hidlydd sy'n "anghofio" ei ddychwelyd, sydd, mewn gwirionedd, ar fai. Felly, ni all y dadansoddwr ond cadarnhau ein hofnau, ond nid pwyntio at eu gwraidd.

I ddarganfod lleoliad yr hidlydd "drwg" yn y graff, gallwch fynd trwy leihau'r graff i'r nifer lleiaf o nodau lle mae'r dadansoddwr yn dal i ganfod gollyngiad a lleoli'r hidlydd problemus yn y tri pinwydd sy'n weddill.

Ond efallai y bydd yn digwydd, trwy leihau nifer yr hidlwyr yn y golofn, y byddwch yn tarfu ar gwrs arferol y rhyngweithio rhwng hidlwyr ac elfennau eraill o'ch system ac ni fydd y gollyngiad yn ymddangos mwyach. Yn yr achos hwn, bydd yn rhaid i chi weithio gyda graff maint llawn a defnyddio'r dull a ddisgrifir isod.

Dull ynysydd llithro

Er mwyn gwneud y cyflwyniad yn syml, byddwn yn defnyddio graff sy'n cynnwys un gadwyn o hidlwyr. Dangosir hi yn y llun.

Archwilio peiriant VoIP Mediastreamer2. Rhan 12

Graff cyffredin, lle, ynghyd Γ’ hidlwyr ffrydio cyfryngau parod, defnyddir pedwar hidlydd crefft F1…F4, pedwar math gwahanol a wnaethoch amser maith yn Γ΄l ac nid oes gennych unrhyw amheuaeth ynghylch eu cywirdeb. Fodd bynnag, mae'n debyg bod gan nifer ohonynt ollyngiad cof. Wrth redeg ein rhaglen oruchwylio dadansoddwyr, rydym yn dysgu o'i adroddiad bod hidlydd penodol wedi gofyn am rywfaint o gof ac nad oedd wedi'i ddychwelyd i'r domen N amseroedd. Mae'n hawdd dyfalu y bydd cyfeiriad at swyddogaethau ffilter mewnol y math MS_VOID_SOURCE. Ei dasg yw cymryd cof o'r domen. Dylai hidlwyr eraill ei ddychwelyd yno. Y rhai. byddwn yn dod o hyd i'r gollyngiad.

Er mwyn penderfynu ym mha ran o'r biblinell y digwyddodd anweithgarwch a arweiniodd at ollyngiad cof, cynigir cyflwyno hidlydd ychwanegol sy'n symud negeseuon o'r mewnbwn i'r allbwn yn syml, ond ar yr un pryd yn creu un nad yw'n ysgafn, arferol. copi "trwm" o'r neges mewnbwn, yna dileu'n llwyr y neges a gyrhaeddodd yr allbwn. Byddwn yn galw hidlydd o'r fath yn ynysydd. Gan fod yr hidlydd yn syml, credwn fod gollyngiadau ynddo wedi'i eithrio. Ac un eiddo mwy cadarnhaol - os byddwn yn ei ychwanegu at unrhyw le yn ein graff, yna ni fydd hyn yn effeithio ar weithrediad y gylched mewn unrhyw ffordd. Byddwn yn darlunio'r hidlydd ynysydd fel cylch gyda chyfuchlin dwbl.

Galluogi'r ynysu yn union ar Γ΄l yr hidlydd gwagle:
Archwilio peiriant VoIP Mediastreamer2. Rhan 12

Rydyn ni'n rhedeg y rhaglen gyda'r dadansoddwr eto, a gwelwn y tro hwn, y dadansoddwr fydd yn rhoi'r bai ar yr arwahanydd. Wedi'r cyfan, ef sydd bellach yn creu blociau o ddata, sydd wedyn yn cael eu colli gan hidlydd (neu hidlwyr) esgeulus anhysbys. Y cam nesaf yw symud yr ynysydd ar hyd y gadwyn i'r dde, gan un hidlydd, a dechrau'r dadansoddiad eto. Felly, gam wrth gam, gan symud yr ynysydd i'r dde, rydym yn cael sefyllfa pan fydd nifer y blociau cof "gollwng" yn adroddiad nesaf y dadansoddwr yn lleihau. Mae hyn yn golygu bod yr ynysydd ar y cam hwn wedi cyrraedd y gadwyn yn syth ar Γ΄l yr hidlydd problemus. Os mai dim ond un hidlydd β€œdrwg” oedd, yna bydd y gollyngiad yn diflannu'n llwyr. Felly, rydym wedi lleoleiddio'r hidlydd problemus (neu un o nifer). Ar Γ΄l "gosod" yr hidlydd, gallwn barhau i symud yr arwahanydd i'r dde ar hyd y gadwyn nes bod y gollyngiadau cof yn cael eu dileu'n llwyr.

Gweithredu hidlydd ynysu

Mae gweithrediad ynysu yn edrych yn union fel hidlydd arferol. Ffeil pennyn:

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

Yr hidlydd ei hun:

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

Dull o ddisodli swyddogaethau rheoli cof

Ar gyfer ymchwil mwy cynnil, mae'r ffrwdiwr cyfryngau yn darparu'r gallu i ddisodli'r swyddogaethau mynediad cof gyda'ch un chi, a fydd, yn ogystal Γ’'r prif waith, yn trwsio "Pwy, ble a pham." Mae tair swyddogaeth yn cael eu disodli. Gwneir hyn yn y modd canlynol:

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

Daw'r nodwedd hon i'r adwy mewn achosion pan fydd y dadansoddwr yn arafu'r hidlwyr cymaint fel bod gweithrediad y system y mae ein cylched wedi'i hadeiladu ynddi yn cael ei amharu. Mewn sefyllfa o'r fath, mae'n rhaid i chi roi'r gorau i'r dadansoddwr a defnyddio amnewid swyddogaethau cof.

Rydym wedi ystyried algorithm o gamau gweithredu ar gyfer graff syml nad yw'n cynnwys canghennau. Ond gellir cymhwyso'r dull hwn i achosion eraill, wrth gwrs gyda chymhlethdodau, ond mae'r syniad yn aros yr un fath.

Yn yr erthygl nesaf, byddwn yn edrych ar y mater o amcangyfrif llwyth ticker a sut i ddelio Γ’ llwyth cyfrifiadura gormodol yn y streamer cyfryngau.

Ffynhonnell: hab.com

Ychwanegu sylw