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 ErthyglAddewais drafod mater asesu llwyth ticer a ffyrdd o frwydro yn erbyn llwyth cyfrifiadurol gormodol mewn ffrydiwr cyfryngau. Ond penderfynais y byddai'n fwy rhesymegol ymdrin â materion dadfygio hidlwyr crefft sy'n gysylltiedig â symud data ac yna ystyried materion optimeiddio perfformiad.

Dadfygio hidlwyr crefft

Ar ôl archwilio'r mecanwaith symud data mewn ffrydiwr cyfryngau yn yr erthygl flaenorol, mae'n rhesymegol trafod y peryglon sy'n llechu ynddo. Un o nodweddion egwyddor "llif data" yw bod dyrannu cof o'r pentwr yn digwydd mewn hidlwyr sydd wedi'u lleoli wrth ffynhonnell y llif data, tra bod rhyddhau cof a dychwelyd i'r pentwr yn cael eu perfformio gan hidlwyr sydd wedi'u lleoli ar ddiwedd y llif. Ar ben hynny, gellir creu a dinistrio data newydd mewn mannau canolradd. Yn gyffredinol, mae rhyddhau cof yn cael ei berfformio gan hidlydd heblaw'r un a greodd y bloc data.

O safbwynt monitro cof tryloyw, byddai'n rhesymol i hidlydd, ar ôl derbyn bloc mewnbwn, ei ddinistrio ar unwaith ar ôl ei brosesu, gan ryddhau ei gof, ac allbynnu bloc newydd ei greu sy'n cynnwys y data allbwn. Yn yr achos hwn, byddai gollyngiad cof yn yr hidlydd yn hawdd ei olrhain—os yw'r dadansoddwr yn canfod gollyngiad mewn hidlydd, mae'n golygu nad yw'r hidlydd dilynol yn dinistrio blociau mewnbwn yn iawn ac mae ar fai. Fodd bynnag, o safbwynt perfformiad, mae'r dull hwn o weithio gyda blociau data yn wrthgynhyrchiol—mae'n arwain at nifer fawr o weithrediadau dyrannu/dad-ddyrannu cof ar gyfer blociau data heb unrhyw fudd defnyddiol.

Am y rheswm hwn, er mwyn osgoi arafu prosesu data, mae hidlwyr ffrydio cyfryngau yn defnyddio swyddogaethau sy'n creu copïau ysgafn wrth gopïo negeseuon (trafodon ni nhw yn yr erthygl flaenorol). Mae'r swyddogaethau hyn yn syml yn creu enghraifft newydd o bennawd y neges, gan "gysylltu" ag ef y bloc data o'r neges "hen" sy'n cael ei chopïo. O ganlyniad, mae dau bennawd ynghlwm wrth un bloc data, ac mae'r cownter cyfeirio yn y bloc data yn cael ei gynyddu. Fodd bynnag, bydd hyn yn ymddangos fel dau neges. Efallai y bydd mwy o negeseuon gyda bloc data "a rennir" o'r fath; er enghraifft, mae'r hidlydd MS_TEE yn cynhyrchu dwsin o gopïau 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 cownter cyfeirio hwn gyrraedd sero, a bydd y swyddogaeth dadleoli cof yn cael ei galw: ms_free()Os na fydd y galwad yn digwydd, yna ni fydd y darn hwn o gof byth yn cael ei ddychwelyd i'r pentwr, h.y., bydd yn "gollwng." Y pris am ddefnyddio copïau ysgafn yw colli'r gallu i nodi'n hawdd (fel y byddai'n wir gyda chopïau rheolaidd) pa hidlydd yn y graff sy'n gollwng cof.

Gan fod y cyfrifoldeb am ddod o hyd i ollyngiadau cof mewn hidlwyr brodorol yn nwylo datblygwyr y ffrydiwr cyfryngau, mae'n fwyaf tebygol na fydd yn rhaid i chi eu dadfygio. Ond gyda'ch hidlydd personol, chi yw meistr eich lwc eich hun, a bydd yr amser rydych chi'n ei dreulio yn chwilio am ollyngiadau yn eich cod yn dibynnu ar eich cywirdeb. Er mwyn lleihau eich amser dadfygio, dylem ystyried technegau lleoleiddio gollyngiadau wrth ddatblygu hidlydd. Ar ben hynny, dim ond pan fydd yr hidlydd yn cael ei gymhwyso i system go iawn y gall gollyngiad ddatgelu ei hun, lle gall nifer yr "amheusion" fod yn enfawr a bod yr amser dadfygio yn gyfyngedig.

Sut mae gollyngiad cof yn amlygu ei hun?

Mae'n rhesymegol tybio bod allbwn y rhaglen top Bydd canran y cof a feddiannir gan eich rhaglen yn cael ei dangos fel canran gynyddol.

Yr amlygiad allanol fydd y bydd y system ar ryw adeg yn araf i ymateb i symudiadau'r llygoden a bydd y sgrin yn ail-lunio'n araf. Gall log y system dyfu hefyd, gan fwyta lle ar y gyriant caled. Yn y cyfamser, bydd eich rhaglen yn dechrau ymddwyn yn rhyfedd, heb ymateb i orchmynion, yn methu ag agor ffeiliau, ac ati.

I ganfod digwyddiad gollyngiad, byddwn yn defnyddio dadansoddwr cof (y cyfeirir ato o hyn ymlaen fel y dadansoddwr). Gall hyn fod Valgrind (da erthygl amdano) neu wedi'i adeiladu i mewn i'r crynhoydd gcc CofSanitizer neu rywbeth arall. Os yw'r dadansoddwr yn dangos bod y gollyngiad yn digwydd yn un o'r hidlwyr graff, mae'n bryd defnyddio un o'r dulliau a ddisgrifir isod.

Dull y Tri Phîn

Fel y soniwyd uchod, pan fydd gollyngiad cof yn digwydd, bydd y dadansoddwr yn pwyntio at yr hidlydd a ofynnodd am ddyraniad cof pentwr. Fodd bynnag, ni fydd yn pwyntio at yr hidlydd a "anghofiodd" ei ddychwelyd, sef yr achos mewn gwirionedd. Felly, dim ond cadarnhau ein pryderon y gall y dadansoddwr eu gwneud, ond nid nodi eu hachos gwreiddiol.

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

Fodd bynnag, gall ddigwydd, drwy leihau nifer yr hidlwyr yn y graff, eich bod yn tarfu ar y rhyngweithiadau arferol rhwng yr hidlwyr ac elfennau eraill eich system, ac na fydd y gollyngiad yn amlygu ei hun mwyach. Yn yr achos hwn, bydd yn rhaid i chi weithio gyda'r graff maint llawn a defnyddio'r dull a ddisgrifir isod.

Dull inswleiddio llithro

Er mwyn symlrwydd, byddwn yn defnyddio graff sy'n cynnwys un gadwyn hidlo. Dangosir hyn yn y ffigur.

Archwilio peiriant VoIP Mediastreamer2. Rhan 12

Graff nodweddiadol, lle, ynghyd â hidlwyr parod y ffrydiwr cyfryngau, defnyddir pedwar hidlydd personol (F1...F4) o bedwar math gwahanol. Crëwyd yr hidlwyr hyn amser maith yn ôl ac rydym yn hyderus yn eu cywirdeb. Fodd bynnag, gadewch i ni dybio bod sawl un ohonynt yn cynnwys gollyngiad cof. Wrth redeg ein rhaglen monitro dadansoddwr, rydym yn dysgu o'i adroddiad bod hidlydd penodol wedi gofyn am swm penodol o gof ac nad oedd wedi'i ddychwelyd i'r pentwr N gwaith. Mae'n hawdd dyfalu y bydd cyfeiriad at swyddogaethau mewnol yr hidlydd, fel MS_VOID_SOURCE. Ei bwrpas yw adfer cof o'r pentwr. Mae hidlwyr eraill i fod i'w ddychwelyd yno. Mewn geiriau eraill, byddwn yn canfod gollyngiad.

I benderfynu ble yn y biblinell y digwyddodd y gollyngiad cof, rydym yn cynnig cyflwyno hidlydd ychwanegol sy'n syml yn symud negeseuon o'r mewnbwn i'r allbwn, ond wrth wneud hynny mae'n creu copi "trwm" o'r neges fewnbwn, yn hytrach nag un ysgafn, ac yna'n cael gwared ar y neges fewnbwn yn llwyr. Byddwn yn galw'r hidlydd hwn yn ynysydd. Credwn, gan fod yr hidlydd yn syml, ei fod yn dileu gollyngiadau. Mantais arall yw na fydd ei ychwanegu unrhyw le yn ein graff yn cael unrhyw effaith ar weithrediad y gylched. Byddwn yn darlunio'r hidlydd ynysydd fel cylch gydag amlinelliad dwbl.

Rydym yn galluogi'r ynysydd yn syth ar ôl y hidlydd ffynhonnell wag:
Archwilio peiriant VoIP Mediastreamer2. Rhan 12

Rydym yn rhedeg y rhaglen dadansoddwr eto, a'r tro hwn, mae'r dadansoddwr yn beio'r ynysydd. Wedi'r cyfan, ef yw'r un sy'n creu'r blociau data sydd wedyn yn cael eu colli gan hidlydd (neu hidlwyr) anhysbys ac esgeulus. Y cam nesaf yw symud yr ynysydd i'r dde ar hyd y gadwyn, un hidlydd, a rhedeg y dadansoddiad eto. Felly, trwy symud yr ynysydd i'r dde yn raddol, byddwn yn gweld sefyllfa lle mae nifer y blociau cof "a ollyngwyd" yn lleihau yn adroddiad nesaf y dadansoddwr. Mae hyn yn golygu, yn y cam hwn, bod yr ynysydd wedi symud i'r gadwyn yn syth ar ôl yr hidlydd problemus. Pe bai dim ond un hidlydd "drwg", byddai'r gollyngiad yn diflannu'n gyfan gwbl. Felly, rydym wedi lleoli'r hidlydd problemus (neu un o sawl un). Ar ôl "trwsio" yr hidlydd, gallwn barhau i symud yr ynysydd i'r dde ar hyd y gadwyn nes bod y gollyngiadau cof wedi'u dileu'n llwyr.

Gweithredu hidlydd-ynysydd

Mae gweithrediad yr ynysydd yn edrych yn union fel hidlydd rheolaidd. Ffeil pennawd:

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

Y 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 fanylach, mae gan y ffrydiwr cyfryngau y gallu i ddiystyru swyddogaethau mynediad cof gyda'ch rhai chi eich hun, a fydd, yn ogystal â'i brif swyddogaethau, yn cofnodi "Pwy, Ble, a Pam." Gellir diystyru tair swyddogaeth. Gwneir hyn fel a ganlyn:

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

Mae'r nodwedd hon yn ddefnyddiol mewn achosion lle mae'r dadansoddwr yn arafu'r hidlwyr gymaint fel ei fod yn tarfu ar y system y mae ein cylched wedi'i hymgorffori ynddi. Mewn sefyllfa o'r fath, mae'n rhaid i ni gefnu ar y dadansoddwr a defnyddio gor-reoliadau rheoli cof.

Rydym wedi archwilio'r algorithm ar gyfer graff syml, heb ganghenau. Gellir defnyddio'r dull hwn mewn achosion eraill, er gyda rhywfaint o gymhlethdod ychwanegol, 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

Prynu gwesteio dibynadwy ar gyfer gwefannau sydd â diogelwch DDoS, gweinyddwyr VPS VDS 🔥 Prynu cynnal gwefannau dibynadwy gyda diogelwch DDoS, gweinyddion VPS VDS | ProHoster