Linux'ta Bellek Takibi [Eğitim Makalesi] //MaskHacker

MaskHacker

Uzman üye
14 Eki 2013
1,531
3
C:/
Linux'ta bellek durumunu birçok araçla takip edebiliriz. Konsol üzerinden çalışmayı sevenler için free, vmstat, top, htop, vb... pekçok yazılım mevcutken; GUI ile çalışmak isteyenler 'System Monitor' gibi alternatifleri kullanabilir. Bu paketlerin üzerinden tek tek geçmeyeceğiz; bunun yerine bellek yönetimine dair genel bir fikir vermek istiyorum.

memory_tools.png


Yukarıda gördüğünüz resimde, free, htop ve System Monitoring yazılımları aynı anda çalışıyor. htop ve System Monitoring yazılımlarına baktığınızda, kullanılan bellek miktarının 749MB olduğunu görebilirsiniz. Ancak free komutunun çıktısını yorumlamak, diğerlerine nazaran biraz daha dikkat istiyor. Linux bellek yönetimini anlamak için bu komutu bir kere daha çalıştıralım:

Kod:
cagatay@cbox:~$ free -m
             total       used       free     shared    buffers     cached
Mem:          2014       1745        269          0         37        958
-/+ buffers/cache:        749       1265
Swap:         1466          0       1466

"free -m" yazdığımız için verilen bütün değerler, Megabyte cinsinden gösteriliyor. "free -h", "free -k" ya da sadece "free" yazsaydık; yine aynı bellek miktarlarını görürdük. Ancak bellek miktarlarının birimleri değişirdi. Bu değerleri açıklayacak olursa, en üstte, Mem Satırında gördüğünüz 2014 değeri, fiziksel olarak sahip olduğumuz bellek miktarını gösteriyor. Bir yanında gördüğümüz 1745 değeriyse, toplam kullanılan bellek miktarını gösteriyor. Peki System Monitor ve htop programlarında kullanılan bellek miktarı 749MB iken, free komutu neden 1745MB'ın kullanıldığını söylüyor? Aslında bu durum Linux'un bellek yönetimiyle alakalı. Kullanılmayan boş bellek, anlamsız bir yatırımdır. Bu yüzden, Linux maksimum miktarda belleği kullanmaya çalışır. Eğer bellek kullanımı için programlardan bir talep gelmiyorsa, fazla gelen boş belleği, dosya sistemi için cache/buffer olarak değerlendirir. Eğer herhangi bir program bellek talep ederse ve kullanılabilir alan yoksa, filesystem'e verilen bellek hızlı bir biçimde geri iade edilir.

Tekrar bir hesap yapalım. 1745MB'ın kullanıldığını söylemiştik. Filesystem'e yönelik olan buffers ve cached değerlerinin toplamı 995MB (=37+958) gözüküyor. 1745'ten 995'i çıkarttığımızda, 750MB kalır. Bu hesaba göre gerçekten kullandığımız bellek miktarı sadece 750MB ile sınırlı.

Şimdi işin sağlamasını yapalım. -/+ buffers/cache şeklinde başlayan satıra bakarsanız, kullanılan bellek miktarının 749MB olduğunu görebilirsiniz. Önceki hesabımızın 1MB yüksek çıkmasının tek nedeni, yuvarlamadan kaynaklanıyor. Eğer "free -m" yerine sadece "free" şeklinde çalıştırıp, byte değerleri üzerinden değerler toplanırsa, eksik/fazla bir değer çıkmayacaktır. Kullanımda gördüğümüz 749MB değeri, htop ve System Monitor yazılımları tarafından da doğrulanıyor. Çünkü bu programlar, filesystem ile ilgili buffer/cache değerlerini hesaba katmıyor. (37MB, 958MB ve 269MB toplandığında 1264MB eder. Burada da yuvarlama farkından dolayı, boş belleği 1MB az bulduk.)

Kullanılan bellek miktarının 749MB olduğunu gördük. Boş bellek miktarı da buna göre, 1265MB olmalı. İkinci satırda bu değer zaten yazıyor. Birinci satırda yazan 269MB değeri ise, cache/buffer hariç tutularak hesaplanmış bellek miktarı. Daha önce belirttiğim gibi, bellek ihtiyacı olduğu anda, filesystem'e verilen alan hemen geri alınır. Bu nedenle ilk satırda 269MB boş bellek gözükürken; ikinci satırda 1265MB boş belleğin olduğunu görüyoruz.

Bu kadar karışık açıklamadan sonra, ifadelerimizi sadeleştirelim: free yazdığınızda, -/+ buffers/cache yazan satıra bakın. Burada gerçekten kullanmakta olduğunuz ve gerçekten boş sayılabilecek bellek miktarını göreceksiniz. Arkasındaki mantığı anlamak için üstte anlattıklarımızı bilmeniz elbette faydalı olacaktır.

Dosya Sistemi Üzerinde 'cache' Etkisi

free komutunda gördüğünüz buffers, kısa süreli tutulan, FIFO şeklinde çalışan bir tampon bellek görevi görüyor. cache ise özellikle okuma esnasında bol bol yararlandığımız, tekrar tekrar kullanılabilen bir alan olarak hizmet veriyor. Şimdi ne kadar bir etkisi olduğunu anlayabilmek için bir test yapalım. Bunun için 10 yaşında eski bir USB bellek kullanacağım. Cache'in etkisini daha anlaşılır kılmak için özellikle eski bir cihaz seçiyorum.

memory_bar_resized.jpg


Öncelikle boş bellek miktarına ve cache kullanım oranlarına bakıyoruz. Ardından USB bellek içinde bulunan dosyaları okuyacak bir md5 işlemi gerçekleştiriyoruz.

Kod:
cagatay@cbox:~$ free -m
             total       used       free     shared    buffers     cached
Mem:          2014        889       1125          0          0        166
-/+ buffers/cache:        723       1291
Swap:         1466          0       1466

cagatay@cbox:/media/cagatay/USB/PHOTOS$ time md5sum *
a9717ca2b01b60894ed34ad34e469fc7  SAM_2245.JPG
...
518d0632dbd1f6bfbc5fe25d44b25b40  SAM_2258.jpg

real	0m6.140s
user	0m0.040s
sys	0m0.012s

Toplam boyutu 4.8MB olan 14 dosyanın okunması için 6 saniye gerekti. Şimdi tekrar boş bellek miktarına bakalım ve okuma işlemini tekrar edelim:

Kod:
cagatay@cbox:~$ free -m
             total       used       free     shared    buffers     cached
Mem:          2014        895       1119          0          0        171
-/+ buffers/cache:        723       1291
Swap:         1466          0       1466

cagatay@cbox:/media/cagatay/USB/PHOTOS$ time md5sum *
a9717ca2b01b60894ed34ad34e469fc7  SAM_2245.JPG
...
518d0632dbd1f6bfbc5fe25d44b25b40  SAM_2258.jpg

real	0m0.025s
user	0m0.020s
sys	0m0.000s

Gördüğünüz gibi yapılan işlem 6 saniyeden, 0.02 saniyeye düştü. Cache miktarıysa 5MB artarak 166MB'tan, 171MB'a çıktı. Bu artış, okuduğumuz dosyaların boyutuyla ilgiliydi. Farkedeceğiniz gibi okuduğumuz orantıda, cache alanını kullanıyoruz ve bu sayede, 300 kat performans kazanımı elde edebiliyoruz.

Dilerseniz, cache'leri drop edip, testi tekrar edebilirsiniz. Süre tekrar 6 saniye civarına gelir.

Kod:
root@cbox:~# echo 1 > /proc/sys/vm/drop_caches

cagatay@cbox:/media/cagatay/USB/PHOTOS$ time md5sum *
a9717ca2b01b60894ed34ad34e469fc7  SAM_2245.JPG
...
518d0632dbd1f6bfbc5fe25d44b25b40  SAM_2258.jpg

real	0m5.903s
user	0m0.032s
sys	0m0.000s

Son bir bilgi verip, USB Bellek testlerimizi sonlandıralım. USB diski sistemden ayırdığınızda (umount), USB disk için kullanılan cache alan geri verilir. Sizin özel bir müdahelede bulunmanıza gerek yoktur.

vmstat ile Bellek Miktarının Ölçümü

Bellek izlemenin pekçok uygulamayla yapılabileceğine değinmiştik. Bunlardan bir tanesi de, vmstat. Aslında vmstat başlı başına ayrı bir yazı konusu ancak bu yazıda vmstat ile bellek takibine dair kısa bir bilgi vermekle yetineceğim.

free komutunu ve çıkan değerlerin yorumlanmasını artık biliyorsunuz. vmstat uygulamasıyla da, benzer bilgilere ulaşabilirsiniz. Tıpkı free komutunda olduğu gibi, buffer, cache ve free alanları vmstat komutunda da bulunmaktadır. Toplam boş bellek miktarını, buradan kolayca çıkartabilirsiniz.

Kod:
cagatay@cbox:~$ free -m
             total       used       free     shared    buffers     cached
Mem:          2014        894       1120          0          1        169
-/+ buffers/cache:        723       1291
Swap:         1466          0       1466

cagatay@cbox:~$ vmstat -S M 2
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 1  0      0   1120      1    169    0    0    91    59  458  835 23  5 70  2
 0  0      0   1120      1    169    0    0     2     6  709 1481 18  5 77  0
 0  0      0   1120      1    169    0    0     0     0  513  954 17  3 81  0
 ...

Yukarıda göreceğiniz iki komut aslında aynı değerleri göstermektedir. Her ikisinde de buffer/cache kısımları toplam 170MB bellek almıştır ve herhangi bir işe atanmamış 1120MB boş bellek vardır.​
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.