Vm.min_free_kbytes ఎలా పనిచేస్తుంది
సిస్టమ్ యొక్క సరైన పనితీరును నిర్ధారించడానికి సిస్టమ్ ద్వారా మెమరీ కేటాయింపులు అవసరం కావచ్చు. కెర్నల్ అన్ని మెమరీని కేటాయించడానికి అనుమతించినట్లయితే, OS సజావుగా పనిచేయడానికి రెగ్యులర్ ఆపరేషన్లకు మెమరీ అవసరమైనప్పుడు అది కష్టపడవచ్చు. అందుకే కెర్నల్ ట్యూన్ చేయగల vm.min_free_kbytes ని అందిస్తుంది. ట్యూనబుల్ కెర్నల్ యొక్క మెమరీ మేనేజర్ని కనీసం X మొత్తంలో ఉచిత మెమరీని ఉంచడానికి బలవంతం చేస్తుంది. నుండి అధికారిక నిర్వచనం ఇక్కడ ఉంది లైనక్స్ కెర్నల్ డాక్యుమెంటేషన్ : కనీస సంఖ్యలో కిలోబైట్లను ఉచితంగా ఉంచడానికి లైనక్స్ VM ని బలవంతం చేయడానికి ఇది ఉపయోగించబడుతుంది. సిస్టమ్లోని ప్రతి లోమెమ్ జోన్కి వాటర్మార్క్ [WMARK_MIN] విలువను లెక్కించడానికి VM ఈ నంబర్ను ఉపయోగిస్తుంది. ప్రతి లోమెమ్ జోన్ దాని పరిమాణానికి అనుగుణంగా అనేక రిజర్వ్ చేసిన ఉచిత పేజీలను పొందుతుంది. PF_MEMALLOC కేటాయింపులను సంతృప్తి పరచడానికి కొంత కనీస మెమరీ అవసరం; మీరు దీన్ని 1024KB కంటే తక్కువగా సెట్ చేస్తే, మీ సిస్టమ్ సూక్ష్మంగా విరిగిపోతుంది మరియు అధిక లోడ్లు కింద ప్రతిష్టంభనకు గురవుతుంది. దీన్ని చాలా ఎక్కువగా సెట్ చేయడం వలన మీ మెషీన్ తక్షణమే OOM అవుతుంది.
Vm.min_free_kbytes వర్క్లను ధృవీకరిస్తోంది
Min_free_kbytes యొక్క సెట్టింగ్ డిజైన్ చేసినట్లుగా పనిచేస్తుందో లేదో పరీక్షించడానికి, నేను కేవలం 3.75 GB RAM తో లైనక్స్ వర్చువల్ ఉదాహరణని సృష్టించాను. సిస్టమ్ను విశ్లేషించడానికి దిగువ ఉచిత ఆదేశాన్ని ఉపయోగించండి:
#ఉచిత -m
MB లో ముద్రించిన విలువలను కలిగి ఉండటానికి -m ఫ్లాగ్ని ఉపయోగించి పైన ఉన్న ఉచిత మెమరీ యుటిలిటీని చూడండి. మొత్తం మెమరీ 3.5 నుండి 3.75 GB మెమరీ. 121 MB మెమరీ ఉపయోగించబడుతుంది, 3.3 GB మెమరీ ఉచితం, 251 MB బఫర్ కాష్ ద్వారా ఉపయోగించబడుతుంది. మరియు 3.3 GB మెమరీ అందుబాటులో ఉంది.
ఇప్పుడు మనం vm.min_free_kbytes విలువను మార్చబోతున్నాము మరియు సిస్టమ్ మెమరీపై ప్రభావం ఏమిటో చూడండి. దిగువ ప్రకారం కెర్నల్ పరామితి విలువను మార్చడానికి మేము proc వర్చువల్ ఫైల్సిస్టమ్కి కొత్త విలువను ప్రతిధ్వనిస్తాము:
# ప్రతిధ్వని 1500000>/proc/sys/vm/min_free_kbytes# sysctl vm.min_free_kbytes
పారామీటర్ సుమారుగా 1.5 GB కి మార్చబడిందని మరియు అది అమలులోకి వచ్చిందని మీరు చూడవచ్చు. ఇప్పుడు దీనిని ఉపయోగిద్దాం ఉచిత సిస్టమ్ గుర్తించిన ఏవైనా మార్పులను చూడటానికి మళ్లీ ఆదేశించండి.
#ఉచిత -mఉచిత మెమరీ మరియు బఫర్ కాష్ ఆదేశం ద్వారా మారవు, కానీ మెమరీ మొత్తం ప్రదర్శించబడుతుంది అందుబాటులో 3327 నుండి 1222 MB కి తగ్గించబడింది. ఇది పారామీటర్లోని మార్పును సుమారు 1.5 GB నిమిషాల ఉచిత మెమరీకి తగ్గించడం.
ఇప్పుడు 2GB డేటా ఫైల్ను క్రియేట్ చేద్దాం మరియు ఆ ఫైల్ని బఫర్ కాష్లో చదవడం వల్ల విలువలకు ఏమి చేస్తుందో చూద్దాం. దిగువ 2 లైన్ల బాష్ స్క్రిప్ట్లో 2GB డేటా ఫైల్ను ఎలా సృష్టించాలో ఇక్కడ ఉంది. స్క్రిప్ట్ dd ఆదేశాన్ని ఉపయోగించి 35MB యాదృచ్ఛిక ఫైల్ను రూపొందిస్తుంది మరియు దానిని 70 సార్లు కొత్తదిగా కాపీ చేస్తుంది సమాచార దస్తా అవుట్పుట్:
# dd if =/dev/random of =/root/d1.txt కౌంట్ = 1000000# కోసం `seq 1 70` లో; ప్రతిధ్వని చేయండి $ i; cat /root/d1.txt >> /root /data_file; పూర్తి
ఫైల్ని చదివి, కంటెంట్ని విస్మరించి, కింది విధంగా ఫైల్ని /dev /null కి రీడైరెక్ట్ చేయడం ద్వారా:
#పిల్లిసమాచార దస్తా> /దేవ్/శూన్యసరే, ఈ విన్యాసాలతో మా సిస్టమ్ మెమరీకి ఏమి జరిగింది, ఇప్పుడు దాన్ని తనిఖీ చేద్దాం:
#ఉచిత -mపై ఫలితాలను విశ్లేషించడం. మేము ఇంకా 1.8 GB ఉచిత మెమరీని కలిగి ఉన్నాము కాబట్టి మా min_free_kbytes సెట్టింగ్ కారణంగా కెర్నల్ పెద్ద మెమరీని రిజర్వ్ చేసింది. బఫర్ కాష్ 1691 MB ని ఉపయోగించింది, ఇది మా డేటా ఫైల్ మొత్తం పరిమాణం 2.3 GB కంటే తక్కువగా ఉంది. స్పష్టంగా మొత్తం సమాచార దస్తా బఫర్ కాష్ కోసం ఉపయోగించడానికి అందుబాటులో మెమరీ లేకపోవడం వల్ల కాష్లో నిల్వ చేయబడలేదు. మొత్తం ఫైల్ కాష్లో నిల్వ చేయబడలేదని మేము ధృవీకరించవచ్చు కానీ ఫైల్ను చదవడానికి పదేపదే చేసే ప్రయత్నాలను టైమింగ్ చేయవచ్చు. ఇది కాష్ చేయబడి ఉంటే, ఫైల్ను చదవడానికి సెకనులో కొంత సమయం పడుతుంది. మనం దాన్ని ప్రయత్నం చేద్దాం.
# టైమ్ క్యాట్ డేటా_ఫైల్> /dev /null# టైమ్ క్యాట్ డేటా_ఫైల్> /dev /null
ఫైల్ చదవడానికి దాదాపు 20 సెకన్లు పట్టింది, ఇది దాదాపుగా కాష్ చేయబడలేదని సూచిస్తుంది.
ఒక తుది ధ్రువీకరణగా vm.min_free_kbytes ని తగ్గిద్దాం, పేజీ కాష్ ఆపరేట్ చేయడానికి ఎక్కువ గదిని కలిగి ఉండటానికి మరియు కాష్ పని చేయడం మరియు ఫైల్ రీడ్ చాలా వేగంగా పొందడాన్ని మనం చూడవచ్చు.
# ఎకో 67584>/proc/sys/vm/min_free_kbytes# టైమ్ క్యాట్ డేటా_ఫైల్> /dev /null
# టైమ్ క్యాట్ డేటా_ఫైల్> /dev /null
కాష్ చేయడానికి అదనపు మెమరీ అందుబాటులో ఉండటంతో ఫైల్ రీడ్ సమయం 20 సెకన్ల ముందు నుండి .364 సెకన్లకు తగ్గిపోయింది.
నేను మరొక ప్రయోగం చేయడానికి ఆసక్తిగా ఉన్నాను. నిజంగా అధిక vm.min_free_kbytes సెట్టింగ్ నేపథ్యంలో C ప్రోగ్రామ్ నుండి మెమరీని కేటాయించడానికి malloc కాల్లతో ఏమి జరుగుతుంది. ఇది malloc విఫలం అవుతుందా? వ్యవస్థ చనిపోతుందా? మా ప్రయోగాలను తిరిగి ప్రారంభించడానికి మొదట vm.min_free_kbytes సెట్టింగ్ను నిజంగా అధిక విలువకు రీసెట్ చేయండి:
#బయటకు విసిరారు 1500000 > /శాతం/sys/vm/min_free_kbytesమన ఉచిత మెమరీని మళ్లీ చూద్దాం:
సిద్ధాంతపరంగా మనకు 1.9 GB ఉచితం మరియు 515 MB అందుబాటులో ఉన్నాయి. కొంత మెమరీని ఉపయోగించడానికి మరియు మనం ఎక్కడ విఫలమవుతున్నామో చూడటానికి స్ట్రెస్-ఎన్జి అనే స్ట్రెస్ టెస్ట్ ప్రోగ్రామ్ని ఉపయోగిద్దాం. మేము vm టెస్టర్ని ఉపయోగిస్తాము మరియు 1 GB మెమరీని కేటాయించడానికి ప్రయత్నిస్తాము. మేము 3.75 GB సిస్టమ్లో 1.5 GB మాత్రమే రిజర్వ్ చేసినందున, ఇది పని చేయాలని నేను అనుకుంటున్నాను.
# ఒత్తిడి- ng --vm 1 --vm-bytes 1G-సమయము 60 లుఒత్తిడి: సమాచారం:[17537]పందులను పంపడం:1vm
ఒత్తిడి: సమాచారం:[17537]కాష్ కేటాయింపు: డిఫాల్ట్ కాష్ పరిమాణం: 46080K
ఒత్తిడి: సమాచారం:[17537]విజయవంతమైన రన్ పూర్తయిందిలో60.09 లు(1min,0.09పొడి)
# ఒత్తిడి- ng --vm 2 --vm-bytes 1G-సమయము 60 లు
# ఒత్తిడి- ng --vm 3 --vm-bytes 1G-సమయము 60 లు
ఎక్కువ మంది కార్మికులతో మళ్లీ ప్రయత్నిద్దాం, మేము 1, 2, 3, 4 కార్మికులను ప్రయత్నించవచ్చు మరియు ఏదో ఒక సమయంలో అది విఫలమవుతుంది. నా పరీక్షలో ఇది 1 మరియు 2 కార్మికులతో ఉత్తీర్ణత పొందింది, కానీ 3 మంది కార్మికులతో విఫలమైంది.
Vm.min_free_kbytes ని తక్కువ సంఖ్యలో రీసెట్ చేద్దాం మరియు అది 3.75GB సిస్టమ్లో 1GB తో 3 మెమరీ స్ట్రెస్సర్లను అమలు చేయడంలో మాకు సహాయపడుతుందో లేదో చూద్దాం.
# ఎకో 67584>/proc/sys/vm/min_free_kbytes# ఒత్తిడి- ng --vm 3 --vm-bytes 1G-సమయము 60 లు
ఈసారి అది లోపం లేకుండా విజయవంతంగా నడిచింది, నేను రెండుసార్లు సమస్యలు లేకుండా ప్రయత్నించాను. కాబట్టి vm.min_free_kbytes విలువ తక్కువ విలువకు సెట్ చేయబడినప్పుడు, malloc కి ఎక్కువ మెమరీ అందుబాటులో ఉండే ప్రవర్తనా వ్యత్యాసం ఉందని నేను నిర్ధారించగలను.
Vm.min_free_kbytes కోసం డిఫాల్ట్ సెట్టింగ్
నా సిస్టమ్లో సెట్టింగ్ కోసం డిఫాల్ట్ విలువ 67584, ఇది సిస్టమ్లోని ర్యామ్లో 1.8% లేదా 64 MB. భారీగా దెబ్బతిన్న సిస్టమ్లో భద్రతా కారణాల దృష్ట్యా నేను మరింత రిజర్వ్ చేయబడిన ఉచిత మెమరీని అనుమతించడానికి దీనిని కొంచెం 128MB కి పెంచుతాను, అయితే సగటు ఉపయోగం కోసం డిఫాల్ట్ విలువ తగినంత తెలివిగా కనిపిస్తుంది. అధికారిక డాక్యుమెంటేషన్ విలువను చాలా ఎక్కువగా చేయడం గురించి హెచ్చరిస్తుంది. సిస్టమ్ ర్యామ్లో 5 లేదా 10% కి సెట్ చేయడం బహుశా సెట్టింగ్ యొక్క ఉద్దేశించిన వినియోగం కాదు మరియు చాలా ఎక్కువ.
రీబూట్లను తట్టుకోవడానికి vm.min_free_kbytes ని సెట్ చేయడం
సెట్టింగ్ రీబూట్లను తట్టుకోగలదని మరియు రీబూట్ చేసేటప్పుడు డిఫాల్ట్ విలువలకు పునరుద్ధరించబడదని నిర్ధారించడానికి /etc/sysctl.conf ఫైల్లో కావలసిన కొత్త విలువను ఉంచడం ద్వారా sysctl సెట్టింగ్ని స్థిరంగా ఉండేలా చూసుకోండి.
ముగింపు
Vm.min_free_kbytes linux కెర్నల్ ట్యూనబుల్ను సవరించవచ్చని మేము చూశాము మరియు భారీ వినియోగం మరియు భారీ మెమరీ కేటాయింపుల సమయంలో సిస్టమ్ మరింత స్థిరంగా ఉండేలా సిస్టమ్లో మెమరీని రిజర్వ్ చేసుకోవచ్చు. డిఫాల్ట్ సెట్టింగ్లు చాలా తక్కువగా ఉండవచ్చు, ప్రత్యేకించి అధిక మెమరీ సిస్టమ్లలో మరియు జాగ్రత్తగా పెరిగినట్లుగా పరిగణించాలి. ఈ ట్యూనబుల్ ద్వారా రిజర్వ్ చేయబడిన మెమరీ OS కాష్ను అన్ని మెమరీని ఉపయోగించకుండా నిరోధిస్తుందని మరియు కొన్ని మెలోక్ ఆపరేషన్లను కూడా అన్ని మెమరీని ఉపయోగించకుండా నిరోధిస్తుందని మేము చూశాము.