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.
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:
"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.
Ö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.
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:
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.
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.
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.
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.
Ö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.