Linux i slobodna memorija

Linux i slobodna memorija

offline
  • bocke  Male
  • Moderator foruma
  • Glavni moderator Linux foruma
  • Veliki Pingvin
  • Guru
  • Pridružio: 16 Dec 2005
  • Poruke: 12485
  • Gde živiš: Južni pol

Moj pokušaj da odgovorim na jedno od česo postavljanih pitanja o slobodnoj memoriji pod Linuksom.

Verovatno vam je poznata komanda free:
$ free
             total       used       free     shared    buffers     cached
Mem:        769300     707724      61576          0      15508     134240
-/+ buffers/cache:     557976     211324
Swap:      1574364     338712    1235652


Free pokazuje upotrebu memorije. Bez opcije '-o' free pokazuje i dodatnu liniju (drugi red) koji prikazuje memoriju koja bi bila slobodna ako bi se oslobodila sva cache/buffer memorija. Buffer/cache memorija se uglavnom odnosi na disk/mrežni I/O (pisanje i čitanje). Sa opcijom '-o' izlaz bi izgledao ovako:
$ free -o
             total       used       free     shared    buffers     cached
Mem:        769300     707724      61576          0      15508     134240
Swap:      1574364     338712    1235652


Buffers/cache memorija, u praksi, služi za ubrzavanje i poboljšanje performansi I/O operacija. Ovim se postiže i brže (i stabilnije) izvršavanje procesa koji intezivno pišu i čitaju sa I/O uređaja. Znači ova memorija nije otišla u prazno. Da li to znači da imamo samo 61576 kilobajta slobodno? I da i ne. U slučaju potrebe, kernel alokator memorije (kernel servis za alokaciju memorije) će automatski pokušati da oslobodi potrebnu memoriju. Prva na udaru, u slučaju da fizički slobodna memorija nije dostupna, je upravo buffer/cache memorija. Kernel će automatski osloboditi deo buffer/cache memorije u količini koja je neophodna za alociranje memorije za novi proces.

Šta ako nije ni to dovoljno? Sada su na udaru deljena (shared), a zatim swap memorija. Deljena memorija se koristi za interprocesnu komunikaciju. Swap memorija služi za privremeno smeštanje ređe korišćenih memorijskih "strana" na disk. Swap memorija omogućava korišćenje veće količine memorije od one koja je fizički dostupna. U slučaju potrebe, deo ove memorije se može osloboditi. Deljena memorija za povećanje fizički dostupne memorije, swap memorija za smeštanje novih memorijskih strana u swap.

U svakom slučaju, potpuno oslobađanje svih ovih kategorija memorije dovodi do pogoršanja sistemskih performansi. Zato se memorija alocira automatski i po potrebi. Nije potrebno da to ručno radite. U stvari, ručnim "oslobađanjem" memorije možete pogoršati stabilnost sistema.

Da se vratimo na free, sada pokrenut sa opcijom -m (prikazuje cifre u megabajtima(:
$ free -m
             total       used       free     shared    buffers     cached
Mem:           751        602        148          0          6         83
-/+ buffers/cache:        512        238
Swap:         1537        332       1204


Šta nam ovo govori? Ukupno dostupna memorija za ne kernel procese je 751 mb. S obzirom da je ukupna memorija na mašini 768 mb, to nam govori da je kernel rezervisao određenu količinu za svoje potrebe. Ova cifra (751 mb) je približno jednaka količini memorije koja je preostala nakon učitavanja kernela u memoriju i rezervisanja određene količine za buduće potrebe kernela:

$ dmesg | grep Memory
[    0.000000] Memory: 766468k/785600k available (3414k kernel code, 18680k reserved, 1408k data, 500k init, 0k highmem)


Ostatak je prilično jasan. Trenutno zauzeta memorija je 602 megabajta. Apsolutno slobodno je 148 mb. Ukoliko bi se oslobodila buffer/cache memorija imali bismo 238 mb slobodno. 332 mb se nalazi u swap memoriji, a 1204 megabajta swap memorije je slobodno.

Ova statistika meni govori da postoji mogućnost da je swap particija prevelika za potrebe sistema. Ali u ovom trenutku sistem nije dovoljno "opterećen" za takvu ocenu. Ako bi teško opterećen sistem koristio samo deo swap memorije, to bi po mom mišljenju govorilo da je swap particija prevelika.

Da li možemo da definitivno uklonimo swap memoriju? U ovom slučaju nikako. 768 mb je premalo. Teorijski da, u slučaju da imate ogromnu količinu memorije, a mašina ne pokreće vrlo zahtevne procese kao što su serveri koji opslužuju veliki broj klijenata. Zašto? Najveći problem je što bez swap memorije, u slučaju prekoračenja fizički dostupne memorije, kernel nema odakle da izvuče dodatnu memoriju. Da, tu je cache/buffer i deljena memorija, ali kada se ona oslobodi, ne postoji više ništa što kernel može da uradi i crashuje. U svakom slučaju je mnogo bezbednije izdvojiti određeni prostor za swap particiju za "ne daj bože" čak i u slučaju da imate ogromnu količinu ram memorije. Kako odrediti optimalnu količinu swap particije. Nikako po prosečnoj upotrebi. Procenat upotrebe swap memorije treba promatrati kada je sistem pod najvećim opterećenjem, ali ne uzimati apsolutno ni tu cifru, već računati nešto veću količinu. Ovim bi se ogradili od mogućnosti da napravimo preveliku grešku u proceni. Ili možemo uraditi nešto još sigurnije, primeniti važeća odokativna pravila: 2 x fizička količina ram memorije ili 1/1,5 fizička količina ram memorije ukoliko je dostupna memorija nekoliko gigabajta.

Ovo je samo moje viđenje i ne mora biti 100% tačno. Vrlo rado ću prihvatiti vaše ispravke. Smile Ako imate iskustva sa administracijom memorijski zahtevnih sistema, voleo bih da čujem vaša iskustva, predloge i savete iz prakse. Wink

Btw, nisam se bavio time kako promeniti default podešavanja kernel parametara za različite tipove virtualne memorije. Ovo je više neko teorijsko posmatranje situacije bez previše tehnčkih detalja i finih tweakova.



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • soxxx 
  • Prijatelj foruma
  • Pridružio: 25 Maj 2005
  • Poruke: 1482
  • Gde živiš: Gracanica, Kosovo

Skoro svaki unix-like (*BSD, Linux...) nastoji da sto vise iskoristi dostupnu memoriju. "Slobodna memorija je neiskoriscena memorija". Wink

Sto se tice velicine swap-a, ja obicno idem na x2 ili x1, a ako ima previse RAM-a onda nekih 1-2GB. Swap veci od velicine RAM-a ti treba jednino ako si developer (sistem dump-ovi koji se upisuju na swap) ili ako se koristi hibernacija (onda je swap obavezan).

Postoji opcija u Linux kernelu koja se zove swappiness i koja omogucava sistemu da kada bude bilo potrebno osloboditi deo memorije odlucuje o tome dali ce vise prebacivati "stranice" u swap, ili ce radije oslobadjati stranice iz pagecache-a i sto manje slati stranice u swap. Vrednos moze biti od 0 do 100, a podrazumevano je 60:
echo 100 > /proc/sys/vm/swappiness
http://kerneltrap.org/node/3000

Linux kernel ima mogucnost i da "isprazni" pagecache, jednostavno zadajuci vrednost za /proc/sys/vm/drop_caches. Npr:
echo 3 > /proc/sys/vm/drop_caches
http://linux-mm.org/Drop_Caches

Za ostale: igrajte se sa ovim opcijama, i pratite kolicinu slobodne memorije i velicinu bafera i kesa koristeci free, vmstat ili top komande.

@bocke
Vezano za stalno/preterano koriscenje swapa, prati vrednosti si i so (swap-in, swap-uot; na *BSD je pi i po u page delu) kako bi video dal sistem efektivno koristi swap. Ako su vrednosti velike zabrini se. Very Happy



offline
  • bocke  Male
  • Moderator foruma
  • Glavni moderator Linux foruma
  • Veliki Pingvin
  • Guru
  • Pridružio: 16 Dec 2005
  • Poruke: 12485
  • Gde živiš: Južni pol

Mali dodatak vezan za tematiku: http://www.linuxatemyram.com/.

offline
  • Brok  Male
  • Moderator foruma
  • Mihajlo Bogdanović
  • Linux driver - fighter - warrior
  • Pridružio: 04 Maj 2005
  • Poruke: 3246

Još dve korisne komande za RAM.

sudo dmidecode -t 16
ili se prijavite kao root ako nije u pitanju Ubuntu, Mint, verovatno i Debian....
root@brok4:~# dmidecode -t 16
# dmidecode 2.11
SMBIOS 2.6 present.

Handle 0x001D, DMI type 16, 15 bytes
Physical Memory Array
   Location: System Board Or Motherboard
   Use: System Memory
   Error Correction Type: None
   Maximum Capacity: 16 GB
   Error Information Handle: Not Provided
   Number Of Devices: 2

Dobićete bazične informacije o Vašem RAM-u, mogućnostima za nadogradnju i još po neku informaciju...

Naredna komanda daje nešto više informacija, takođe komandu pokrenuti kao root, sudo dmidecode -t memory
root@brok4:~# dmidecode -t memory
# dmidecode 2.11
SMBIOS 2.6 present.

Handle 0x001D, DMI type 16, 15 bytes
Physical Memory Array
   Location: System Board Or Motherboard
   Use: System Memory
   Error Correction Type: None
   Maximum Capacity: 16 GB
   Error Information Handle: Not Provided
   Number Of Devices: 2

Handle 0x001E, DMI type 17, 28 bytes
Memory Device
   Array Handle: 0x001D
   Error Information Handle: 0x0000
   Total Width: 64 bits
   Data Width: 64 bits
   Size: 4096 MB
   Form Factor: SODIMM
   Set: None
   Locator: DIMM_A
   Bank Locator: BANK 0
   Type: DDR3
   Type Detail: Synchronous
   Speed: 1333 MHz
   Manufacturer: 8502
   Serial Number: 00000000
   Asset Tag: 02000000     
   Part Number: PSD34G13332S
   Rank: Unknown

Handle 0x0020, DMI type 17, 28 bytes
Memory Device
   Array Handle: 0x001D
   Error Information Handle: 0x0000
   Total Width: 64 bits
   Data Width: 64 bits
   Size: 4096 MB
   Form Factor: SODIMM
   Set: None
   Locator: DIMM_B
   Bank Locator: BANK 2
   Type: DDR3
   Type Detail: Synchronous
   Speed: 1333 MHz
   Manufacturer: 80CE
   Serial Number: B10EEE3F
   Asset Tag: 02105200     
   Part Number: M471B5273CH0-CH9 
   Rank: Unknown

Ko je trenutno na forumu
 

Ukupno su 536 korisnika na forumu :: 9 registrovanih, 0 sakrivenih i 527 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: 357magnum, Ageofloneliness, bigfoot, esx66, MikeHammer, miodrag, panzerwaffe, shaja1, zlatkoa987