Ano ang vm.min_free_kbytes at kung paano ito mabago?

What Is Vm Min_free_kbytes



Ano ang maituturing ng vm.min_free_kbytes sysctl para sa linux kernel at anong halaga ang dapat itong itakda? Pag-aaralan namin ang parameter na ito at kung paano ito nakakaapekto sa isang tumatakbo na linux system sa artikulong ito. Susubukan namin ang epekto nito sa cache ng pahina ng OS at sa mga malloc at kung ano ang ipinapakita ng libreng utos ng system kapag naitakda ang parameter na ito. Gagawa kami ng ilang mga pinag-aralan na hula sa mga perpektong halaga para sa tunable na ito at ipapakita namin kung paano magtakda ng vm.min_free_kbytes nang permanente upang makaligtas sa mga reboot. Kaya't umalis na tayo.

Paano gumagana ang vm.min_free_kbytes

Ang mga paglalaan ng memorya ay maaaring kailanganin ng system upang masiguro ang wastong paggana ng system mismo. Kung pinapayagan ng kernel ang lahat ng memorya na mailalaan maaari itong makibaka kapag nangangailangan ng memorya para sa regular na pagpapatakbo upang mapanatiling maayos ang pagpapatakbo ng OS. Iyon ang dahilan kung bakit nagbibigay ang kernel ng maaayos na vm.min_free_kbytes. Pipilitin ng maisasaayos ang memorya ng manager ng kernel na panatilihin ang hindi bababa sa X na halaga ng libreng memorya. Narito ang opisyal na kahulugan mula sa dokumentasyon ng linux kernel : Ginagamit ito upang pilitin ang Linux VM na mapanatili ang isang minimum na bilang ng mga kilobytes na libre. Ginagamit ng VM ang numerong ito upang makalkula ang isang watermark [WMARK_MIN] na halaga para sa bawat lowmem zone sa system. Ang bawat lowmem zone ay nakakakuha ng isang bilang ng nakareserba na mga libreng pahina batay sa proporsyonal sa laki nito. Ang ilang kaunting halaga ng memorya ay kinakailangan upang masiyahan ang mga paglalaan ng PF_MEMALLOC; kung itinakda mo ito sa mas mababa sa 1024KB, ang iyong system ay magiging subtly sira, at madaling kapitan ng patay sa ilalim ng mataas na karga. Ang pagtatakda ng napakataas na ito ay OOM agad sa iyong makina.







Ang pagpapatunay ng vm.min_free_kbytes Gumagana

Upang masubukan na ang setting ng min_free_kbytes ay gumagana bilang dinisenyo, lumikha ako ng isang linux virtual na halimbawa na may lamang 3.75 GB ng RAM. Gamitin ang libreng utos sa ibaba upang pag-aralan ang system:



#libre -m



Tumitingin sa libreng memory utility sa itaas gamit ang -m flag upang magkaroon ng mga halagang naka-print sa MB. Ang kabuuang memorya ay 3.5 hanggang 3.75 GB ng memorya. 121 MB ng memorya ang ginamit, 3.3 GB ng memorya ay libre, 251 MB ang ginagamit ng buffer cache. At magagamit ang 3.3 GB na memorya.





Ngayon ay babaguhin namin ang halaga ng vm.min_free_kbytes at tingnan kung ano ang epekto sa memorya ng system. Ipa-echo namin ang bagong halaga sa proc virtual filesystem upang baguhin ang halaga ng parameter ng kernel ayon sa bawat ibaba:

# echo 1500000> / proc / sys / vm / min_free_kbytes
# sysctl vm.min_free_kbytes



Maaari mong makita na ang parameter ay binago sa 1.5 GB na tinatayang at nagkabisa. Ngayon gamitin natin ang libre utos muli upang makita ang anumang mga pagbabagong kinikilala ng system.

#libre -m

Ang libreng memorya at ang buffer cache ay hindi nabago ng utos, ngunit ang dami ng memorya na ipinakita bilang magagamit ay nabawasan mula 3327 hanggang 1222 MB. Alin ang isang tinatayang pagbawas ng pagbabago sa parameter sa 1.5 GB na libreng memorya.

Ngayon gumawa tayo ng isang 2GB data file at pagkatapos ay tingnan kung ano ang ginagawa ng pagbabasa ng file na iyon sa buffer cache sa mga halaga. Narito kung paano lumikha ng isang 2GB data file sa 2 linya ng bash script sa ibaba. Ang script ay bubuo ng isang 35MB random na file gamit ang dd command at pagkatapos ay kopyahin ito ng 70 beses sa isang bago data_file output:

# dd if = / dev / random of = / root / d1.txt count = 1000000
# para sa ako sa `seq 1 70`; gawin ang echo $ i; cat /root/d1.txt >> / root / data_file; tapos na

Basahin natin ang file at huwag pansinin ang mga nilalaman sa pamamagitan ng pagbabasa at pag-redirect ng file sa / dev / null ayon sa bawat ibaba:

#pusadata_file> /dev/wala

Ok, ano ang nangyari sa aming memorya ng system sa hanay ng mga maneuver na ito, suriin natin ito ngayon:

#libre -m

Sinusuri ang mga resulta sa itaas. Mayroon pa kaming 1.8 GB ng libreng memorya kaya pinrotektahan ng kernel ang isang malaking tipak ng memorya na nakalaan dahil sa aming setting na min_free_kbytes. Gumamit ang buffer cache ng 1691 MB, na mas mababa sa kabuuang sukat ng aming file ng data na 2.3 GB. Tila ang buong data_file hindi maiimbak sa cache dahil sa kakulangan ng magagamit na memorya upang magamit para sa buffer cache. Maaari naming patunayan na ang buong file ay hindi nakaimbak sa cache ngunit itinakda ang paulit-ulit na pagtatangka na basahin ang file. Kung ito ay na-cache, aabutin ng isang maliit na bahagi ng isang segundo upang mabasa ang file. Subukan Natin.

# time cat data_file> / dev / null
# time cat data_file> / dev / null

Ang nabasa na file ay tumagal ng halos 20 segundo na nagpapahiwatig ng halos tiyak na hindi lahat ng naka-cache.

Bilang isang panghuling pagpapatunay bawasan natin ang vm.min_free_kbytes upang payagan ang cache ng pahina na magkaroon ng mas maraming silid upang mapatakbo at maaari nating asahan na makita ang paggana ng cache at ang file na mabasa nang mas mabilis.

# echo 67584> / proc / sys / vm / min_free_kbytes
# time cat data_file> / dev / null
# time cat data_file> / dev / null

Gamit ang labis na memorya na magagamit para sa pag-cache ng oras ng pagbasa ng file ay bumaba mula sa 20 segundo bago sa .364 segundo kasama ang lahat sa cache.

Nausisa ako na gumawa ng isa pang eksperimento. Ano ang nangyayari sa mga tawag sa malloc upang maglaan ng memorya mula sa isang C program sa harap ng talagang mataas na setting na vm.min_free_kbytes na ito. Mabibigo ba nito ang malloc? Mamamatay ba ang system? I-reset muna ang setting ng vm.min_free_kbytes sa talagang mataas na halaga upang ipagpatuloy ang aming mga eksperimento:

#itinapon 1500000 > /porsyento/sys/vm/min_free_kbytes

Tingnan natin muli ang ating libreng memorya:

Sa teoretikal mayroon kaming 1.9 GB na libre at 515 MB na magagamit. Gumamit tayo ng isang programa sa pagsubok sa stress na tinatawag na stress-ng upang magamit ang ilang memorya at makita kung saan tayo nabigo. Gagamitin namin ang vm tester at susubukan na maglaan ng 1 GB ng memorya. Dahil nakareserba lamang kami ng 1.5 GB sa isang 3.75 GB system, sa palagay ko dapat itong gumana.

# stress-ng --vm 1 --vm-bytes 1G --timeout 60s
stress-ng: info:[17537]pagpapadala ng mga baboy:1vm
stress-ng: info:[17537]paglalaan ng cache: default na laki ng cache: 46080K
stress-ng: info:[17537]nakumpleto ang matagumpay na pagtakbosa60.09s(1min,0.09matuyo)
# stress-ng --vm 2 --vm-bytes 1G --timeout 60s
# stress-ng --vm 3 --vm-bytes 1G --timeout 60s

Subukan natin itong muli sa maraming mga manggagawa, maaari nating subukan ang 1, 2, 3, 4 na mga manggagawa at sa ilang oras dapat itong mabigo. Sa aking pagsubok pumasa ito kasama ang 1 at 2 na manggagawa ngunit nabigo sa 3 manggagawa.

I-reset natin ang vm.min_free_kbytes sa isang mababang numero at tingnan kung makakatulong ito sa amin na magpatakbo ng 3 memory stressor na may 1GB bawat isa sa isang 3.75GB system.

# echo 67584> / proc / sys / vm / min_free_kbytes
# stress-ng --vm 3 --vm-bytes 1G --timeout 60s

Sa oras na ito ay matagumpay itong tumakbo nang walang error, sinubukan ko ito ng dalawang beses nang walang mga problema. Kaya't maaari kong tapusin na may pagkakaiba sa pag-uugali ng pagkakaroon ng mas maraming memorya na magagamit para sa malloc, kapag ang halaga ng vm.min_free_kbytes ay nakatakda sa isang mas mababang halaga.

Default na setting para sa vm.min_free_kbytes

Ang default na halaga para sa setting sa aking system ay 67584 na tungkol sa 1.8% ng RAM sa system o 64 MB. Para sa mga kadahilanang pangkaligtasan sa isang mabibigat na thrash system Gusto kong taasan ito ng kaunti marahil sa 128MB upang payagan para sa mas nakalaan na libreng memorya, gayunpaman para sa average na paggamit ang default na halaga ay tila sapat na makatuwiran. Nagbabala ang opisyal na dokumentasyon tungkol sa paggawa ng masyadong mataas na halaga. Ang pagtatakda nito sa 5 o 10% ng system RAM ay marahil ay hindi inilaan na paggamit ng setting, at masyadong mataas.

Itinatakda ang vm.min_free_kbytes upang makaligtas sa mga reboot

Upang matiyak na ang setting ay makakaligtas sa mga reboot at hindi naibalik sa mga default na halaga kapag muling pag-reboot siguraduhin na ang setting ng sysctl ay paulit-ulit sa pamamagitan ng paglalagay ng nais na bagong halaga sa /etc/sysctl.conf file.

Konklusyon

Nakita namin na ang vm.min_free_kbytes linux kernel tunable ay maaaring mabago at maaaring magreserba ng memorya sa system upang matiyak na ang sistema ay mas matatag lalo na sa panahon ng mabibigat na paggamit at mabibigat na paglalaan ng memorya. Ang mga default na setting ay maaaring medyo masyadong mababa, lalo na sa mga mataas na memory system at dapat isaalang-alang na tumaas nang maingat. Nakita namin na ang memorya na nakalaan ng tunable na ito ay pumipigil sa cache ng OS mula sa paggamit ng lahat ng memorya at pinipigilan din ang ilang mga pagpapatakbo ng malloc mula sa paggamit din ng lahat ng memorya.