Cywasgu data yn Apache Ignite. Profiad Sber

Cywasgu data yn Apache Ignite. Profiad SberWrth weithio gyda llawer iawn o ddata, gall y broblem o ddiffyg gofod disg godi weithiau. Un ffordd o ddatrys y broblem hon yw cywasgu, a diolch iddo, ar yr un offer, gallwch chi fforddio cynyddu maint storio. Yn yr erthygl hon, byddwn yn edrych ar sut mae cywasgu data yn gweithio yn Apache Ignite. Bydd yr erthygl hon yn disgrifio'r dulliau cywasgu disg a weithredir yn y cynnyrch yn unig. Bydd dulliau eraill o gywasgu data (dros y rhwydwaith, er cof), p'un a ydynt yn cael eu gweithredu ai peidio, yn aros y tu allan i'r cwmpas.

Felly, gyda modd dyfalbarhad wedi'i alluogi, o ganlyniad i newidiadau mewn data yn y caches, mae Ignite yn dechrau ysgrifennu i ddisg:

  1. Cynnwys caches
  2. Ysgrifennwch Log Ymlaen (yn syml WAL o hyn ymlaen)

Bu mecanwaith ar gyfer cywasgu WAL ers cryn amser bellach, a elwir yn gywasgiad WAL. Cyflwynodd yr Apache Ignite 2.8 a ryddhawyd yn ddiweddar ddau fecanwaith arall sy'n eich galluogi i gywasgu data ar ddisg: cywasgu tudalen ddisg ar gyfer cywasgu cynnwys caches a chywasgiad ciplun tudalen WAL ar gyfer cywasgu rhai cofnodion WAL. Mwy o fanylion am bob un o'r tri mecanwaith hyn isod.

Cywasgu tudalen disg

Sut mae hwn

Yn gyntaf, gadewch i ni edrych yn fyr iawn ar sut mae Ignite yn storio data. Defnyddir cof tudalen ar gyfer storio. Mae maint y dudalen wedi'i osod ar ddechrau'r nod ac ni ellir ei newid yn ddiweddarach; hefyd, rhaid i faint y dudalen fod yn bŵer o ddau ac yn lluosrif maint bloc y system ffeiliau. Mae tudalennau'n cael eu llwytho i RAM o ddisg yn ôl yr angen; gall maint y data ar ddisg fod yn fwy na swm yr RAM a neilltuwyd. Os nad oes digon o le yn RAM i lwytho tudalen oddi ar ddisg, bydd hen dudalennau nas defnyddir bellach yn cael eu troi allan o RAM.

Mae'r data'n cael ei storio ar ddisg yn y ffurf ganlynol: mae ffeil ar wahân yn cael ei chreu ar gyfer pob rhaniad o bob grŵp cache; yn y ffeil hon, mae tudalennau'n ymddangos un ar ôl y llall mewn trefn mynegai esgynnol. Mae'r dynodwr tudalen lawn yn cynnwys y dynodwr grŵp cache, rhif rhaniad, a mynegai tudalen yn y ffeil. Felly, gan ddefnyddio'r dynodwr tudalen lawn, gallwn bennu'r ffeil a'r gwrthbwyso yn y ffeil ar gyfer pob tudalen yn unigryw. Gallwch ddarllen mwy am gof paging yn yr erthygl Apache Ignite Wiki: Ignite Store Parhaus - o dan y cwfl.

Mae'r mecanwaith cywasgu tudalennau disg, fel y gallech chi ddyfalu o'r enw, yn gweithio ar lefel y dudalen. Pan fydd y mecanwaith hwn wedi'i alluogi, mae data mewn RAM yn cael ei brosesu fel y mae, heb unrhyw gywasgu, ond pan fydd tudalennau'n cael eu cadw o RAM i ddisg, maent yn cael eu cywasgu.

Ond nid yw cywasgu pob tudalen yn unigol yn ateb i'r broblem; mae angen i chi rywsut leihau maint y ffeiliau data canlyniadol. Os nad yw maint y dudalen bellach yn sefydlog, ni allwn bellach ysgrifennu tudalennau i'r ffeil un ar ôl y llall, gan y gall hyn greu nifer o broblemau:

  • Gan ddefnyddio'r mynegai tudalen, ni fyddwn yn gallu cyfrifo'r gwrthbwyso y mae wedi'i leoli yn y ffeil.
  • Nid yw'n glir beth i'w wneud gyda thudalennau nad ydynt ar ddiwedd y ffeil a newid eu maint. Os bydd maint y dudalen yn lleihau, mae'r gofod a ryddhaodd yn diflannu. Os bydd maint y dudalen yn cynyddu, mae angen ichi chwilio am le newydd yn y ffeil ar ei chyfer.
  • Os bydd tudalen yn symud gan nifer o beitau nad yw'n lluosrif maint bloc y system ffeiliau, yna bydd angen cyffwrdd ag un bloc system ffeiliau arall wrth ei darllen neu ei hysgrifennu, a all arwain at ddiraddio perfformiad.

Er mwyn osgoi datrys y problemau hyn ar ei lefel ei hun, mae cywasgu tudalennau disg yn Apache Ignite yn defnyddio mecanwaith system ffeiliau o'r enw ffeiliau gwasgaredig. Ffeil denau yw un lle gellir marcio rhai rhanbarthau â sero fel "tyllau". Yn yr achos hwn, ni ddyrennir unrhyw flociau system ffeiliau i storio'r tyllau hyn, gan arwain at arbedion ar ofod disg.

Mae'n rhesymegol, er mwyn rhyddhau bloc system ffeiliau, bod yn rhaid i faint y twll fod yn fwy neu'n hafal i'r bloc system ffeiliau, sy'n gosod cyfyngiad ychwanegol ar faint y dudalen ac Apache Ignite: er mwyn i gywasgu gael unrhyw effaith, rhaid i faint y dudalen fod yn hollol fwy na maint bloc y system ffeiliau . Os yw maint y dudalen yn hafal i faint y bloc, yna ni fyddwn byth yn gallu rhyddhau un bloc, oherwydd er mwyn rhyddhau un bloc, rhaid i'r dudalen gywasgedig feddiannu 0 beit. Os yw maint y dudalen yn hafal i faint 2 neu 4 bloc, byddwn eisoes yn gallu rhyddhau o leiaf un bloc os yw ein tudalen wedi'i chywasgu i o leiaf 50% neu 75%, yn y drefn honno.

Felly, y disgrifiad terfynol o sut mae'r mecanwaith yn gweithio: Wrth ysgrifennu tudalen i ddisg, gwneir ymgais i gywasgu'r dudalen. Os yw maint y dudalen gywasgedig yn caniatáu rhyddhau un neu fwy o flociau system ffeiliau, yna mae'r dudalen wedi'i hysgrifennu ar ffurf gywasgedig, a gwneir "twll" yn lle'r blociau a ryddhawyd (gweithredir galwad system fallocate() gyda baner y twll dyrnu). Os nad yw maint y dudalen gywasgedig yn caniatáu i'r blociau gael eu rhyddhau, caiff y dudalen ei chadw fel y mae, heb ei chywasgu. Mae'r holl wrthbwysiadau tudalen yn cael eu cyfrifo yn yr un ffordd â heb gywasgu, trwy luosi'r mynegai tudalen â maint y dudalen. Nid oes angen adleoli tudalennau ar eich pen eich hun. Mae gwrthbwyso tudalennau, yn union fel heb gywasgu, yn disgyn ar ffiniau blociau system ffeiliau.

Cywasgu data yn Apache Ignite. Profiad Sber

Yn y gweithrediad presennol, dim ond gyda ffeiliau prin o dan Linux OS y gall Ignite weithio; yn unol â hynny, dim ond wrth ddefnyddio Ignite ar y system weithredu hon y gellir galluogi cywasgu tudalennau disg.

Algorithmau cywasgu y gellir eu defnyddio ar gyfer cywasgu tudalennau disg: ZSTD, LZ4, Snappy. Yn ogystal, mae modd gweithredu (SKIP_GARBAGE), lle dim ond gofod nas defnyddiwyd yn y dudalen sy'n cael ei daflu allan heb gymhwyso cywasgu ar y data sy'n weddill, sy'n lleihau'r llwyth ar y CPU o'i gymharu â'r algorithmau a restrwyd yn flaenorol.

Effaith Perfformiad

Yn anffodus, ni chynhaliais fesuriadau perfformiad gwirioneddol ar stondinau go iawn, gan nad ydym yn bwriadu defnyddio'r mecanwaith hwn wrth gynhyrchu, ond yn ddamcaniaethol gallwn ddyfalu ble y byddwn yn colli a ble y byddwn yn ennill.

I wneud hyn, mae angen i ni gofio sut mae tudalennau'n cael eu darllen a'u hysgrifennu pan gânt eu cyrchu:

  • Wrth berfformio gweithrediad darllen, caiff ei chwilio gyntaf yn RAM; os yw'r chwiliad yn aflwyddiannus, caiff y dudalen ei llwytho i RAM o ddisg gan yr un edefyn sy'n perfformio'r darlleniad.
  • Pan gyflawnir gweithrediad ysgrifennu, mae'r dudalen yn RAM wedi'i marcio'n fudr, ond nid yw'r dudalen yn cael ei chadw'n gorfforol i ddisg ar unwaith gan yr edefyn sy'n perfformio'r ysgrifennu. Mae'r holl dudalennau budr yn cael eu cadw ar ddisg yn ddiweddarach yn y broses pwynt gwirio mewn edafedd ar wahân.

Felly yr effaith ar weithrediadau darllen yw:

  • Cadarnhaol (IO disg), oherwydd gostyngiad yn nifer y blociau system ffeiliau darllen.
  • Negyddol (CPU), oherwydd y llwyth ychwanegol sydd ei angen ar y system weithredu i weithio gyda ffeiliau prin. Mae hefyd yn bosibl y bydd gweithrediadau IO ychwanegol yn ymddangos yn ymhlyg yma i arbed strwythur ffeiliau gwasgaredig mwy cymhleth (yn anffodus, nid wyf yn gyfarwydd â'r holl fanylion ar sut mae ffeiliau prin yn gweithio).
  • Negyddol (CPU), oherwydd yr angen i ddatgywasgu tudalennau.
  • Nid oes unrhyw effaith ar weithrediadau ysgrifennu.
  • Effaith ar y broses pwynt gwirio (mae popeth yma yn debyg i weithrediadau darllen):
  • Cadarnhaol (IO disg), oherwydd gostyngiad yn nifer y blociau system ffeiliau ysgrifenedig.
  • Negyddol (CPU, disg IO o bosibl), oherwydd gweithio gyda ffeiliau prin.
  • Negyddol (CPU), oherwydd yr angen am gywasgu tudalennau.

Pa ochr o'r raddfa fydd yn troi'r raddfa? Mae hyn i gyd yn dibynnu'n fawr ar yr amgylchedd, ond rwy'n dueddol o gredu y bydd cywasgu tudalennau disg yn fwyaf tebygol o arwain at ddiraddio perfformiad ar y rhan fwyaf o systemau. At hynny, mae profion ar DBMSs eraill sy'n defnyddio dull tebyg gyda ffeiliau prin yn dangos gostyngiad mewn perfformiad pan fydd cywasgu'n cael ei alluogi.

Sut i alluogi a ffurfweddu

Fel y soniwyd uchod, y fersiwn leiaf o Apache Ignite sy'n cefnogi cywasgu tudalen ddisg yw 2.8 a dim ond y system weithredu Linux a gefnogir. Galluogi a ffurfweddu fel a ganlyn:

  • Rhaid cael modiwl tanio-cywasgu yn y llwybr dosbarth. Yn ddiofyn, mae wedi'i leoli yn y dosbarthiad Apache Ignite yn y cyfeiriadur libs / dewisol ac nid yw wedi'i gynnwys yn y llwybr dosbarth. Yn syml, gallwch symud y cyfeiriadur i fyny un lefel i libs ac yna pan fyddwch yn ei redeg drwy ignite.sh bydd yn cael ei alluogi yn awtomatig.
  • Rhaid galluogi dyfalbarhad (Galluogi trwy DataRegionConfiguration.setPersistenceEnabled(true)).
  • Rhaid i faint y dudalen fod yn fwy na maint bloc y system ffeiliau (gallwch ei osod gan ddefnyddio DataStorageConfiguration.setPageSize() ).
  • Ar gyfer pob storfa y mae angen cywasgu ei ddata, rhaid i chi ffurfweddu'r dull cywasgu ac (yn ddewisol) y lefel cywasgu (dulliau CacheConfiguration.setDiskPageCompression() , CacheConfiguration.setDiskPageCompressionLevel()).

cywasgiad WAL

Sut mae hwn

Beth yw CIY a pham mae ei angen? Yn fyr iawn: mae hwn yn log sy'n cynnwys yr holl ddigwyddiadau sy'n newid y storfa dudalen yn y pen draw. Mae ei angen yn bennaf i allu gwella rhag ofn cwympo. Rhaid i unrhyw weithrediad, cyn rhoi rheolaeth i'r defnyddiwr, gofnodi digwyddiad yn WAL yn gyntaf, fel y gellir ei chwarae yn ôl yn y log ac adfer yr holl weithrediadau y derbyniodd y defnyddiwr ymateb llwyddiannus ar eu cyfer, hyd yn oed os bydd y gweithrediadau hyn yn methu. nid oedd amser i gael ei adlewyrchu yn y storfa dudalen ar ddisg (eisoes uchod Mae wedi cael ei ddisgrifio bod yr ysgrifennu gwirioneddol i'r storfa dudalen yn cael ei wneud mewn proses o'r enw "checkpointing" gyda rhywfaint o oedi gan edafedd ar wahân).

Rhennir cofnodion CIY yn rhesymegol a chorfforol. Rhai Boole yw'r allweddi a'u gwerthoedd eu hunain. Corfforol - yn adlewyrchu newidiadau i dudalennau yn y storfa dudalennau. Er y gall cofnodion rhesymegol fod yn ddefnyddiol ar gyfer rhai achosion eraill, dim ond ar gyfer adferiad rhag ofn damwain y mae angen cofnodion corfforol a dim ond ers y pwynt gwirio llwyddiannus diwethaf y mae angen cofnodion. Yma ni fyddwn yn mynd i fanylder ac yn esbonio pam ei fod yn gweithio fel hyn, ond gall y rhai sydd â diddordeb gyfeirio at yr erthygl a grybwyllwyd eisoes ar Wiki Apache Ignite: Ignite Store Parhaus - o dan y cwfl.

Yn aml mae sawl cofnod ffisegol fesul cofnod rhesymegol. Hynny yw, er enghraifft, mae un gweithrediad rhoi yn y storfa yn effeithio ar sawl tudalen yng nghof tudalen (tudalen gyda'r data ei hun, tudalennau gyda mynegeion, tudalennau gyda rhestrau rhydd). Mewn rhai profion synthetig, canfûm fod cofnodion ffisegol yn meddiannu hyd at 90% o'r ffeil CIY. Fodd bynnag, mae eu hangen am gyfnod byr iawn (yn ddiofyn, yr egwyl rhwng pwyntiau gwirio yw 3 munud). Byddai'n rhesymegol cael gwared ar y data hwn ar ôl colli ei berthnasedd. Dyma'n union y mae mecanwaith cywasgu WAL yn ei wneud: mae'n cael gwared ar gofnodion ffisegol ac yn cywasgu'r cofnodion rhesymegol sy'n weddill gan ddefnyddio sip, tra bod maint y ffeil yn cael ei leihau'n sylweddol iawn (weithiau gan ddegau o weithiau).

Yn gorfforol, mae WAL yn cynnwys sawl segment (10 yn ddiofyn) o faint sefydlog (64MB yn ddiofyn), sy'n cael eu trosysgrifo mewn modd cylchol. Cyn gynted ag y bydd y segment cyfredol wedi'i lenwi, mae'r segment nesaf yn cael ei neilltuo fel cerrynt, ac mae'r segment wedi'i lenwi yn cael ei gopïo i'r archif gan edefyn ar wahân. Mae cywasgu WAL eisoes yn gweithio gyda segmentau archif. Hefyd, fel edefyn ar wahân, mae'n monitro gweithrediad y pwynt gwirio ac yn dechrau cywasgu mewn segmentau archif nad oes angen cofnodion ffisegol ar eu cyfer mwyach.

Cywasgu data yn Apache Ignite. Profiad Sber

Effaith Perfformiad

Gan fod cywasgu WAL yn rhedeg fel edefyn ar wahân, ni ddylai fod unrhyw effaith uniongyrchol ar y gweithrediadau sy'n cael eu perfformio. Ond mae'n dal i roi llwyth cefndir ychwanegol ar y CPU (cywasgu) a'r ddisg (darllen pob segment WAL o'r archif ac ysgrifennu'r segmentau cywasgedig), felly os yw'r system yn rhedeg ar ei gapasiti mwyaf, bydd hefyd yn arwain at ddiraddio perfformiad.

Sut i alluogi a ffurfweddu

Gallwch alluogi cywasgu WAL gan ddefnyddio'r eiddo WalCompactionEnabled в DataStorageConfiguration (DataStorageConfiguration.setWalCompactionEnabled(true)). Hefyd, gan ddefnyddio'r dull DataStorageConfiguration.setWalCompactionLevel() , gallwch osod y lefel cywasgu os nad ydych yn fodlon â'r gwerth rhagosodedig (BEST_SPEED).

Cywasgiad ciplun tudalen WAL

Sut mae hwn

Rydym eisoes wedi darganfod bod cofnodion CIY wedi'u rhannu'n rhai rhesymegol a chorfforol. Ar gyfer pob newid i bob tudalen, cynhyrchir cofnod CIY ffisegol er cof tudalen. Mae cofnodion ffisegol, yn eu tro, hefyd wedi'u rhannu'n 2 isdeip: cofnod ciplun tudalen a chofnod delta. Bob tro rydyn ni'n newid rhywbeth ar dudalen a'i drosglwyddo o gyflwr glân i gyflwr budr, mae copi cyflawn o'r dudalen hon yn cael ei storio yn WAL (cofnod ciplun tudalen). Hyd yn oed petaem yn newid un beit yn unig yn WAL, bydd y cofnod ychydig yn fwy na maint y dudalen. Os byddwn yn newid rhywbeth ar dudalen sydd eisoes yn fudr, yna mae cofnod delta yn cael ei ffurfio yn WAL, sy'n adlewyrchu newidiadau yn unig o gymharu â chyflwr blaenorol y dudalen, ond nid y dudalen gyfan. Gan fod ailosod cyflwr tudalennau o fudr i lân yn cael ei berfformio yn ystod y broses pwynt gwirio, yn syth ar ôl dechrau'r pwynt gwirio, bydd bron pob cofnod ffisegol yn cynnwys cipluniau o dudalennau yn unig (gan fod pob tudalen yn syth ar ôl dechrau'r pwynt gwirio yn lân) , yna wrth i ni nesáu at y pwynt gwirio nesaf, mae'r ffracsiwn cofnod delta yn dechrau tyfu ac ailosod eto ar ddechrau'r pwynt gwirio nesaf. Dangosodd mesuriadau mewn rhai profion synthetig fod cyfran y cipluniau tudalennau yng nghyfanswm cyfaint y cofnodion ffisegol yn cyrraedd 90%.

Y syniad o gywasgu ciplun tudalen WAL yw cywasgu cipluniau tudalen gan ddefnyddio offeryn cywasgu tudalen parod (gweler cywasgu tudalen disg). Ar yr un pryd, yn WAL, mae cofnodion yn cael eu cadw'n ddilyniannol yn y modd atodiad yn unig ac nid oes angen rhwymo cofnodion i ffiniau blociau system ffeiliau, felly yma, yn wahanol i'r mecanwaith cywasgu tudalennau disg, nid oes angen ffeiliau prin arnom yn i gyd; yn unol â hynny, bydd y mecanwaith hwn yn gweithio nid yn unig ar yr OS Linux. Yn ogystal, nid yw'n bwysig i ni bellach faint roeddem yn gallu cywasgu'r dudalen. Hyd yn oed pe baem yn rhyddhau 1 beit, mae hwn eisoes yn ganlyniad cadarnhaol a gallwn arbed data cywasgedig yn WAL, yn wahanol i gywasgu tudalen ddisg, lle rydym yn arbed y dudalen gywasgedig dim ond os ydym yn rhyddhau mwy nag 1 bloc system ffeil.

Mae tudalennau'n ddata cywasgadwy iawn, mae eu cyfran yng nghyfanswm cyfaint WAL yn uchel iawn, felly heb newid fformat ffeil WAL gallwn gael gostyngiad sylweddol yn ei faint. Byddai cywasgu, gan gynnwys cofnodion rhesymegol, yn gofyn am newid fformat a cholli cydnawsedd, er enghraifft, ar gyfer defnyddwyr allanol a allai fod â diddordeb mewn cofnodion rhesymegol, ond ni fyddai'n arwain at ostyngiad sylweddol ym maint y ffeil.

Yn yr un modd â chywasgu tudalen disg, gall cywasgiad ciplun tudalen WAL ddefnyddio algorithmau cywasgu ZSTD, LZ4, Snappy, yn ogystal â'r modd SKIP_GARBAGE.

Effaith Perfformiad

Nid yw'n anodd sylwi bod galluogi cywasgu ciplun tudalen WAL yn uniongyrchol yn effeithio ar edafedd sy'n ysgrifennu data i gof tudalen yn unig, hynny yw, yr edafedd hynny sy'n newid data mewn caches. Dim ond unwaith y mae darllen cofnodion corfforol o WAL yn digwydd, ar hyn o bryd mae'r nod yn cael ei godi ar ôl cwympo (a dim ond os yw'n cwympo yn ystod pwynt gwirio).

Mae hyn yn effeithio ar edafedd sy'n newid data yn y ffordd ganlynol: rydym yn cael effaith negyddol (CPU) oherwydd yr angen i gywasgu'r dudalen bob tro cyn ysgrifennu i ddisg, ac effaith gadarnhaol (IO disg) oherwydd gostyngiad yn y swm o data ysgrifenedig. Yn unol â hynny, mae popeth yn syml yma: os yw perfformiad y system wedi'i gyfyngu gan y CPU, rydyn ni'n cael ychydig o ddiraddiad, os yw'n gyfyngedig gan ddisg I / O, rydyn ni'n cael cynnydd.

Yn anuniongyrchol, mae lleihau maint CIY hefyd yn effeithio (yn gadarnhaol) ar ffrydiau sy'n gadael segmentau CIY i'r archif a ffrydiau cywasgu CIY.

Dangosodd profion perfformiad go iawn yn ein hamgylchedd gan ddefnyddio data synthetig ychydig o gynnydd (cynyddodd trwybwn 10% -15%, gostyngodd hwyrni 10% -15%).

Sut i alluogi a ffurfweddu

Isafswm fersiwn Apache Ignite: 2.8. Galluogi a ffurfweddu fel a ganlyn:

  • Rhaid cael modiwl tanio-cywasgu yn y llwybr dosbarth. Yn ddiofyn, mae wedi'i leoli yn y dosbarthiad Apache Ignite yn y cyfeiriadur libs / dewisol ac nid yw wedi'i gynnwys yn y llwybr dosbarth. Yn syml, gallwch symud y cyfeiriadur i fyny un lefel i libs ac yna pan fyddwch yn ei redeg drwy ignite.sh bydd yn cael ei alluogi yn awtomatig.
  • Rhaid galluogi dyfalbarhad (Galluogi trwy DataRegionConfiguration.setPersistenceEnabled(true)).
  • Rhaid gosod y modd cywasgu gan ddefnyddio'r dull DataStorageConfiguration.setWalPageCompression(), mae cywasgu wedi'i analluogi yn ddiofyn (modd ANABL).
  • Yn ddewisol, gallwch chi osod y lefel cywasgu gan ddefnyddio'r dull DataStorageConfiguration.setWalPageCompression(), gweler y javadoc ar gyfer y dull ar gyfer gwerthoedd dilys ar gyfer pob modd.

Casgliad

Gellir defnyddio'r mecanweithiau cywasgu data a ystyriwyd yn Apache Ignite yn annibynnol ar ei gilydd, ond mae unrhyw gyfuniad ohonynt hefyd yn dderbyniol. Bydd deall sut maen nhw'n gweithio yn caniatáu ichi benderfynu pa mor addas ydyn nhw ar gyfer eich tasgau yn eich amgylchedd a'r hyn y bydd yn rhaid i chi ei aberthu wrth eu defnyddio. Mae cywasgu tudalen disg wedi'i gynllunio i gywasgu'r prif storfa a gall roi cymhareb cywasgu canolig. Bydd cywasgu ciplun tudalen WAL yn rhoi graddfa gyfartalog o gywasgu ar gyfer ffeiliau WAL, a bydd yn fwyaf tebygol o wella perfformiad hyd yn oed. Ni fydd cywasgu WAL yn cael effaith gadarnhaol ar berfformiad, ond bydd yn lleihau maint ffeiliau WAL gymaint â phosibl trwy ddileu cofnodion ffisegol.

Ffynhonnell: hab.com

Ychwanegu sylw