నిల్వ వేగం etcdకి అనుకూలంగా ఉందా? ఫియోని అడుగుదాం

నిల్వ వేగం etcdకి అనుకూలంగా ఉందా? ఫియోని అడుగుదాం

ఫియో మరియు మొదలైన వాటి గురించి ఒక చిన్న కథ

క్లస్టర్ పనితీరు మొదలైనవి ఎక్కువగా దాని నిల్వ పనితీరుపై ఆధారపడి ఉంటుంది. etcd కొన్ని కొలమానాలను ఎగుమతి చేస్తుంది ప్రోమేతియస్మీకు అవసరమైన నిల్వ పనితీరు సమాచారాన్ని అందించడానికి. ఉదాహరణకు, మెట్రిక్ wal_fsync_duration_seconds. etcd డాక్యుమెంటేషన్ చెబుతుంది: నిల్వ తగినంత వేగంగా పరిగణించబడాలంటే, ఈ మెట్రిక్‌లో 99వ శాతం తప్పనిసరిగా 10 ఎంఎస్‌ల కంటే తక్కువగా ఉండాలి. మీరు Linux మెషీన్‌లలో etcd క్లస్టర్‌ని అమలు చేయాలని ప్లాన్ చేస్తుంటే మరియు మీ నిల్వ (SSD వంటివి) తగినంత వేగంగా ఉందో లేదో అంచనా వేయాలనుకుంటే, మీరు ఉపయోగించవచ్చు మారడం I/O కార్యకలాపాలను పరీక్షించడానికి ఒక ప్రసిద్ధ సాధనం. కింది ఆదేశాన్ని అమలు చేయండి, ఇక్కడ టెస్ట్-డేటా అనేది నిల్వ మౌంట్ పాయింట్ క్రింద డైరెక్టరీగా ఉంటుంది:

fio --rw=write --ioengine=sync --fdatasync=1 --directory=test-data --size=22m --bs=2300 --name=mytest

మీరు ఫలితాలను చూసి, వ్యవధిలో 99వ శాతాన్ని సరిచూసుకోవాలి fdatasync 10 ms కంటే తక్కువ. అవును అయితే, మీకు తగినంత వేగవంతమైన నిల్వ ఉంది. ఫలితాల ఉదాహరణ ఇక్కడ ఉంది:

  sync (usec): min=534, max=15766, avg=1273.08, stdev=1084.70
  sync percentiles (usec):
   | 1.00th=[ 553], 5.00th=[ 578], 10.00th=[ 594], 20.00th=[ 627],
   | 30.00th=[ 709], 40.00th=[ 750], 50.00th=[ 783], 60.00th=[ 1549],
   | 70.00th=[ 1729], 80.00th=[ 1991], 90.00th=[ 2180], 95.00th=[ 2278],
   | 99.00th=[ 2376], 99.50th=[ 9634], 99.90th=[15795], 99.95th=[15795],
   | 99.99th=[15795]

గమనికలు

  • మేము మా నిర్దిష్ట దృశ్యం కోసం -size మరియు -bs పారామితుల విలువలను అనుకూలీకరించాము. fio నుండి ఉపయోగకరమైన ఫలితాలను పొందడానికి, మీ విలువలను నమోదు చేయండి. నేను వాటిని ఎక్కడ పొందగలను? చదవండి, మేము fioని కాన్ఫిగర్ చేయడం ఎలా నేర్చుకున్నాము.
  • పరీక్ష సమయంలో, అన్ని I/O లోడ్ fio నుండి వస్తుంది. నిజ జీవిత దృష్టాంతంలో, wal_fsync_duration_secondsతో అనుబంధించబడిన వాటి కంటే ఇతర వ్రాత అభ్యర్థనలు నిల్వలోకి వచ్చే అవకాశం ఉంది. అదనపు లోడ్ wal_fsync_duration_seconds విలువను పెంచుతుంది. కాబట్టి 99వ పర్సంటైల్ దాదాపు 10ms ఉంటే, మీ నిల్వ తగినంత వేగంగా ఉండదు.
  • సంస్కరణను తీసుకోండి మారడం 3.5 కంటే తక్కువ కాదు (మునుపటివి fdatasync వ్యవధి శాతాలను చూపించవు).
  • fio నుండి ఫలితాల స్నిప్పెట్ మాత్రమే పైన ఉంది.

ఫియో మరియు మొదలైన వాటి గురించి పెద్ద కథ

etcdలో WAL అంటే ఏమిటి

సాధారణంగా డేటాబేస్‌లు ఉపయోగించబడతాయి వ్రాసే ముందు లాగ్; etcd కూడా దీనిని ఉపయోగిస్తుంది. మేము రైట్-ఎహెడ్ లాగ్ (WAL) గురించి ఇక్కడ వివరంగా చర్చించము. etcd క్లస్టర్‌లోని ప్రతి సభ్యుడు దానిని నిరంతర నిల్వలో నిర్వహిస్తున్నారని మనం తెలుసుకోవడం సరిపోతుంది. etcd కీ-విలువ జతలపై (నవీకరణ వంటివి) ప్రతి ఆపరేషన్‌ను స్టోర్‌కు వర్తింపజేయడానికి ముందు WALకి వ్రాస్తుంది. నిల్వ సభ్యులలో ఒకరు క్రాష్ అయి స్నాప్‌షాట్‌ల మధ్య పునఃప్రారంభించినట్లయితే, అది WAL యొక్క కంటెంట్‌లను ఉపయోగించి చివరి స్నాప్‌షాట్ నుండి లావాదేవీలను స్థానికంగా పునరుద్ధరించగలదు.

క్లయింట్ కీ-విలువ స్టోర్‌కి కీని జోడించినప్పుడు లేదా ఇప్పటికే ఉన్న కీ విలువను అప్‌డేట్ చేసినప్పుడు, etcd ఈ ఆపరేషన్ యొక్క రికార్డ్‌ను WALకి వ్రాస్తుంది, ఇది నిరంతర నిల్వలో ఉండే సాధారణ ఫైల్. etcd ప్రాసెసింగ్ కొనసాగడానికి ముందు WAL రైట్ వాస్తవానికి సంభవించిందని పూర్తిగా నిర్ధారించుకోవాలి. Linuxలో, దీనికి ఒక సిస్టమ్ కాల్ సరిపోదు వ్రాయడానికి, భౌతిక నిల్వకు వ్రాయడం ఆలస్యం కావచ్చు కాబట్టి. ఉదాహరణకు, Linux తాత్కాలికంగా WAL ఎంట్రీని కెర్నల్ మెమరీలోని కాష్‌లో నిల్వ చేయవచ్చు (పేజీ కాష్ వంటివి). మరియు నిరంతర నిల్వకు డేటా ఖచ్చితంగా వ్రాయబడాలంటే, రికార్డింగ్ తర్వాత fdatasync సిస్టమ్ కాల్ అవసరం, మరియు etcd దానిని ఉపయోగిస్తుంది (పని ఫలితంగా చూడవచ్చు పట్టీ, ఇక్కడ 8 అనేది WAL ఫైల్ డిస్క్రిప్టర్:

21:23:09.894875 lseek(8, 0, SEEK_CUR)   = 12808 <0.000012>
21:23:09.894911 write(8, ". 20210220361223255266632$10 20103026"34"rn3fo"..., 2296) = 2296 <0.000130>
21:23:09.895041 fdatasync(8)            = 0 <0.008314>

దురదృష్టవశాత్తు, నిరంతర నిల్వకు వ్రాయడం తక్షణమే కాదు. fdatasync కాల్ నెమ్మదిగా ఉంటే, etcd సిస్టమ్ పనితీరు క్షీణిస్తుంది. etcd డాక్యుమెంటేషన్ చెబుతుంది99వ శాతం fdatasync కాల్‌లు WAL ఫైల్‌కి వ్రాయడానికి 10 ms కంటే తక్కువ సమయం తీసుకుంటే నిల్వ తగినంత వేగంగా పరిగణించబడుతుంది. ఇతర ఉపయోగకరమైన నిల్వ కొలమానాలు ఉన్నాయి, కానీ మేము ఈ పోస్ట్‌లో మాట్లాడుతున్న ఏకైక మెట్రిక్ ఇది.

fio ఉపయోగించి నిల్వ మూల్యాంకనం

మీ స్టోరేజ్ etcdకి అనుకూలంగా ఉందో లేదో మీరు మూల్యాంకనం చేయవలసి వస్తే, చాలా ప్రజాదరణ పొందిన I/O లోడ్ టెస్టింగ్ టూల్ అయిన fioని ఉపయోగించండి. డిస్క్ కార్యకలాపాలు చాలా భిన్నంగా ఉంటాయని గుర్తుంచుకోవాలి: సింక్రోనస్ మరియు అసమకాలిక, సిస్టమ్ కాల్స్ యొక్క అనేక తరగతులు మొదలైనవి. ఫలితంగా, fio ఉపయోగించడం చాలా కష్టం. ఇది అనేక పారామితులను కలిగి ఉంది మరియు వాటి విలువల యొక్క విభిన్న కలయికలు చాలా భిన్నమైన I/O వర్క్‌లోడ్‌లను ఉత్పత్తి చేస్తాయి. etcd కోసం తగిన సంఖ్యలను పొందడానికి, మీరు WAL ఫైల్‌లను వ్రాసేటప్పుడు fio నుండి పరీక్ష వ్రాసే లోడ్ etcd నుండి వచ్చే వాస్తవ లోడ్‌కి వీలైనంత దగ్గరగా ఉండేలా చూసుకోవాలి.

అందువల్ల, ఫియో తప్పనిసరిగా, ఫైల్‌కి కనీసం అనేక సీక్వెన్షియల్ రైట్‌ల లోడ్‌ను రూపొందించాలి, ప్రతి రైట్ సిస్టమ్ కాల్‌ను కలిగి ఉంటుంది వ్రాయడానికిfdatasync సిస్టమ్ కాల్ తర్వాత. సీక్వెన్షియల్ ఫియో రైట్స్ కోసం, --rw=write ఎంపిక అవసరం. కాబట్టి ఆ ఫియో వ్రాసేటప్పుడు కాకుండా రైట్ సిస్టమ్ కాల్‌ని ఉపయోగిస్తుంది pwrite, ఇది పరామితిని పేర్కొనడం విలువైనది –ioengine=sync. చివరగా, ప్రతి వ్రాత తర్వాత fdatasync కాల్ చేయడానికి, మీరు --fdatasync=1 పరామితిని జోడించాలి. ఈ ఉదాహరణలోని ఇతర రెండు ఎంపికలు (--పరిమాణం మరియు -bs) దృశ్య-నిర్దిష్టమైనవి. తదుపరి విభాగంలో మేము వాటిని ఎలా సెటప్ చేయాలో మీకు చూపుతాము.

ఫియో ఎందుకు మరియు మేము దానిని కాన్ఫిగర్ చేయడం ఎలా నేర్చుకున్నాము

ఈ పోస్ట్‌లో మేము నిజమైన కేసును వివరిస్తాము. మాకు ఒక క్లస్టర్ ఉంది Kubernetes v1.13, మేము ప్రోమేతియస్‌ని ఉపయోగించి పర్యవేక్షించాము. etcd v3.2.24 SSDలో హోస్ట్ చేయబడింది. క్లస్టర్ ఏమీ చేయనప్పటికీ, Etcd మెట్రిక్‌లు fdatasync కోసం చాలా ఎక్కువ జాప్యాన్ని చూపించాయి. కొలమానాలు వింతగా ఉన్నాయి మరియు వాటి అర్థం ఏమిటో మాకు నిజంగా తెలియదు. క్లస్టర్ వర్చువల్ మిషన్లను కలిగి ఉంది, సమస్య ఏమిటో అర్థం చేసుకోవడం అవసరం: భౌతిక SSD లలో లేదా వర్చువలైజేషన్ లేయర్‌లో. అదనంగా, మేము హార్డ్‌వేర్ మరియు సాఫ్ట్‌వేర్ కాన్ఫిగరేషన్‌లకు తరచుగా మార్పులు చేసాము మరియు వాటి ఫలితాలను మూల్యాంకనం చేయడానికి మాకు ఒక మార్గం అవసరం. మేము ప్రతి కాన్ఫిగరేషన్‌లో etcdని అమలు చేయవచ్చు మరియు ప్రోమేతియస్ మెట్రిక్‌లను చూడవచ్చు, కానీ ఇది చాలా అవాంతరం. మేము నిర్దిష్ట కాన్ఫిగరేషన్‌ను మూల్యాంకనం చేయడానికి చాలా సులభమైన మార్గం కోసం చూస్తున్నాము. మేము etcd యొక్క ప్రోమెథియస్ మెట్రిక్‌లను సరిగ్గా అర్థం చేసుకున్నామో లేదో తనిఖీ చేయాలనుకుంటున్నాము.

కానీ దీని కోసం రెండు సమస్యలను పరిష్కరించాల్సిన అవసరం ఉంది. ముందుగా, WALకి వ్రాసేటప్పుడు etcd సృష్టించే I/O లోడ్ ఏమిటి? ఏ సిస్టమ్ కాల్‌లు ఉపయోగించబడతాయి? పోస్ట్‌ల పరిమాణం ఎంత? రెండవది, మేము ఈ ప్రశ్నలకు సమాధానమిస్తే, ఫియోతో ఇలాంటి పనిభారాన్ని ఎలా పునరుత్పత్తి చేయవచ్చు? ఫియో అనేక ఎంపికలతో కూడిన చాలా సౌకర్యవంతమైన సాధనం అని మర్చిపోవద్దు. మేము రెండు సమస్యలను ఒకే విధానంతో పరిష్కరించాము - ఆదేశాలను ఉపయోగించి lsof и పట్టీ. lsof ఒక ప్రక్రియ ద్వారా ఉపయోగించే అన్ని ఫైల్ డిస్క్రిప్టర్‌లను మరియు వాటి అనుబంధిత ఫైల్‌లను ప్రదర్శిస్తుంది. మరియు స్ట్రేస్‌తో మీరు ఇప్పటికే నడుస్తున్న ప్రక్రియను అధ్యయనం చేయవచ్చు లేదా ప్రాసెస్‌ను ప్రారంభించి దానిని అధ్యయనం చేయవచ్చు. strace అధ్యయనం చేయబడిన ప్రక్రియ నుండి అన్ని సిస్టమ్ కాల్‌లను ప్రింట్ చేస్తుంది (మరియు దాని చైల్డ్ ప్రాసెస్‌లు). రెండోది చాలా ముఖ్యమైనది, ఎందుకంటే etcd ఇదే విధానాన్ని తీసుకుంటుంది.

క్లస్టర్‌పై లోడ్ లేనప్పుడు కుబెర్నెట్స్ కోసం etcd సర్వర్‌ని అధ్యయనం చేయడానికి మేము చేసిన మొదటి పని స్ట్రేస్‌ను ఉపయోగించడం. దాదాపు అన్ని WAL రికార్డులు దాదాపు ఒకే పరిమాణంలో ఉన్నాయని మేము చూశాము: 2200–2400 బైట్లు. అందువల్ల, పోస్ట్ ప్రారంభంలో ఉన్న కమాండ్‌లో, మేము -bs=2300 పరామితిని పేర్కొన్నాము (bs అంటే ప్రతి ఫియో ఎంట్రీకి బైట్లలో పరిమాణం). etcd ఎంట్రీ పరిమాణం etcd వెర్షన్, షిప్పింగ్, పారామీటర్ విలువలు మొదలైన వాటిపై ఆధారపడి ఉంటుంది మరియు fdatasync వ్యవధిని ప్రభావితం చేస్తుందని గమనించండి. మీకు ఇలాంటి దృశ్యం ఉంటే, ఖచ్చితమైన సంఖ్యలను కనుగొనడానికి స్ట్రేస్ ఉపయోగించి మీ etcd ప్రక్రియలను పరిశీలించండి.

ఆపై, etcd ఫైల్ సిస్టమ్ ఏమి చేస్తుందనే దాని గురించి మంచి ఆలోచన పొందడానికి, మేము దానిని స్ట్రేస్ మరియు -ffttT ఎంపికలతో అమలు చేసాము. కాబట్టి మేము చైల్డ్ ప్రాసెస్‌లను అధ్యయనం చేయడానికి మరియు వాటిలో ప్రతి దాని అవుట్‌పుట్‌ను ప్రత్యేక ఫైల్‌లో రికార్డ్ చేయడానికి ప్రయత్నించాము మరియు ప్రతి సిస్టమ్ కాల్ ప్రారంభం మరియు వ్యవధి గురించి వివరణాత్మక నివేదికలను కూడా పొందాము. స్ట్రేస్ అవుట్‌పుట్ యొక్క మా విశ్లేషణను నిర్ధారించడానికి మరియు ఏ ఫైల్ డిస్క్రిప్టర్ ఏ ప్రయోజనాల కోసం ఉపయోగించబడిందో చూడటానికి మేము lsofని ఉపయోగించాము. కాబట్టి, స్ట్రేస్ ఉపయోగించి, మేము పైన చూపిన ఫలితాలను పొందాము. etcd నుండి wal_fsync_duration_seconds మెట్రిక్ WAL ఫైల్ డిస్క్రిప్టర్‌లతో fdatasync కాల్‌లకు అనుగుణంగా ఉంటుందని సమకాలీకరణ సమయ గణాంకాలు నిర్ధారించాయి.

మేము fio డాక్యుమెంటేషన్‌ని పరిశీలించాము మరియు మా స్క్రిప్ట్ కోసం పారామితులను ఎంచుకున్నాము, తద్వారా fio etcd లాంటి లోడ్‌ను ఉత్పత్తి చేస్తుంది. మేము etcd మాదిరిగానే strace నుండి fioని అమలు చేయడం ద్వారా సిస్టమ్ కాల్‌లు మరియు వాటి వ్యవధిని కూడా తనిఖీ చేసాము.

మేము --size పరామితి యొక్క విలువను జాగ్రత్తగా ఎంచుకున్నాము, ఇది fio యొక్క మొత్తం I/O లోడ్‌ను సూచిస్తుంది. మా విషయంలో, ఇది స్టోరేజ్‌కి వ్రాయబడిన మొత్తం బైట్‌ల సంఖ్య. ఇది రైట్ (మరియు fdatasync) సిస్టమ్ కాల్‌ల సంఖ్యకు నేరుగా అనులోమానుపాతంలో ఉన్నట్లు తేలింది. bs యొక్క నిర్దిష్ట విలువ కోసం, fdatasync = పరిమాణం/bsకి కాల్‌ల సంఖ్య. మేము పర్సంటైల్‌పై ఆసక్తిని కలిగి ఉన్నందున, విశ్వసనీయంగా ఉండేందుకు తగినంత నమూనాలను కలిగి ఉండాలి మరియు 10^4 మాకు సరిపోతుందని మేము లెక్కించాము (అంటే 22 మెబిబైట్‌లు). --పరిమాణం తక్కువగా ఉంటే, అవుట్‌లియర్‌లు సంభవించవచ్చు (ఉదాహరణకు, అనేక fdatasync కాల్‌లు సాధారణం కంటే ఎక్కువ సమయం తీసుకుంటాయి మరియు 99వ శాతాన్ని ప్రభావితం చేస్తాయి).

మీరే ప్రయత్నించండి

మేము fioని ఎలా ఉపయోగించాలో మరియు etcd బాగా పని చేయడానికి స్టోరేజ్ తగినంత వేగంగా ఉందో లేదో కనుగొనడం ఎలాగో చూపించాము. ఇప్పుడు మీరు దీన్ని ఆచరణలో మీరే ప్రయత్నించవచ్చు, ఉదాహరణకు, SSD నిల్వ ఉన్న వర్చువల్ మిషన్లను ఉపయోగించి IBM క్లౌడ్.

మూలం: www.habr.com

ఒక వ్యాఖ్యను జోడించండి