Linux sysadmin #1 : Monitoring


Bu postta linux sistem kaynaklarini ve bu kaynaklari kullanan processleri monitor etme konularina deginecegiz. 

Sistem Bilgisi
Monitor edemedigimiz birseyi iyilestiremeyiz. Bu yuzden /proc klasoru ile basliyoruz. Bu klasor, sistem ile ilgili bilgilerin tutuldugu virtual files barindirir. Ornek olarak RAM ile alakali bilgileri su sekilde gorebiliriz:

$ ls /proc

-r--r--r-- 1 root  root    0 Jan 20 06:42 cgroups
-r--r--r-- 1 root  root    0 Jan 20 06:42 cmdline
-r--r--r-- 1 root  root    0 Jan 20 06:42 cpuinfo
-r--r--r-- 1 root  root    0 Jan 20 06:42 filesystems
-r--r--r-- 1 root  root    0 Jan 20 06:42 interrupts
-r--r--r-- 1 root  root    0 Jan 20 06:42 loadavg
-r--r--r-- 1 root  root    0 Jan 20 06:42 meminfo
...

$ cat meminfo 

MemTotal:       66929712 kB
MemFree:        40141688 kB
Buffers:           34032 kB
Cached:           188576 kB
...

Benzer sekilde cpuinfo dosyasi da cpu ile ilgili bilgiler barindirmaktadir. Bu dosyalar system specs'leri anlamada isimize yarar. Ancak sistemin hardware kaynaklarini su an nasil kullandigini gormek icin, top komutunu kullanmak gerekir. top, otomatik olarak guncellenen bir yapiya sahiptir. Sistemde calisan processlerin listesini ve her biri icin cpu / ram tuketimini gorebiliriz.  Ozellikle sistem cok yavaslamis ise, neler olup bittigini top yardimi ile gorebiliriz. 

Genellikle yavaslamanin sebebi sistem kaynaklarinin kurumasidir. Bu acidan ne kadar bosta RAM kaldigini gormek icin free komutunu kullanabiliriz.

$ free -h
                      total        used        free      shared  buff/cache   available
Mem:           63Gi        25Gi        38Gi        17Mi       223Mi        38Gi
Swap:         117Gi        35Mi       117Gi

-h ile human-readable yani Mb ve Gb cinsinden bu degerleri gostermesini sagladik. Yoksa byte olarak gosterilecektir. 

Storage device'larinin durumlarini gormek icin ise df komutunu kullaniyoruz. 

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev             16G     0   16G   0% /dev
tmpfs           3.2G  2.0M  3.2G   1% /run
/dev/sda5       196G   62G  125G  33% /
tmpfs            16G  1.5M   16G   1% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs            16G     0   16G   0% /sys/fs/cgroup
/dev/sda1       511M  4.0K  511M   1% /boot/efi
tmpfs           3.2G   32K  3.2G   1% /run/user/1000

Seklinde sistemdeki partitionlari listeledik. Ama burada virtual partitionlar da listelendi. Bu durumda fiziksel suruculeri direk gorebilmek zor olabilir, bu durumda sadece ext4 dosya sistemine sahip partitionlari listeleyebiliriz:

$ df -ht ext4
Filesystem     1K-blocks     Used Available Use% Mounted on
/dev/sda5       196G            62G  125G        33% /

Seklinde sadece harddiskimi gorebiliyorum. Kullani cok yukselmis ise burada da iyilestirme icin bir alan var demektir. 

Diger bir performans problemi de network yavaslamasi olabilir. Ya da bir uygulama cok fazla bant genisligi kullaniyor olabilir. Bunu monitor etmek icin ise iftop uygulamasindan yararlanacagiz. Standart olmadigi icin oncelikle kurmamiz gerekir.

$ sudo apt install iftop

Daha sonra iftop ile network trafigini monitor edebiliri. Hatta burada hangi network interface'ini monitor etmek istiyorsak onu belirtebilir ve sadece o interface uzerinden gecen network trafigini inceleyebiliriz. Network interface'lerini gorebilmek icin: 

$ ip addr

Network interface nedir: Bir bilgisayarin private veya public bir network'e baglanti noktasidir. Baslica network interface fiziksel bir donanim olan NIC (network interface card) olmakla beraber, loopback interface gibi yazilimsal da olabilir. Yukaridaki komutu calistirdiginizda loopback interface'i de goreceksiniz. Bu da, sistemin kendisiyle haberlesmesini saglayan bir network interfacedir. Saniyorum ki sistem bir ethernet kablosu ile bagli ise eth0 adinda eger wireless ile bagli ise ens33 adinda fiziksel interfacelere sahip olur, enaznindan ubuntu icin. 
Bir guzellik ise burada docker0 isimli bir network interface goruyoruz. Bunu kullanarak docker containerleri uzerinden yapilan network trafigini monitor edebiliriz. 

Sonuc olarak tum network trafigini monitor etmek icin ens33 interfaceini kullaniyorum:

$ sudo iftop -i ens33

Ve super bir grafiksel arayuz ile network kullanan processler listeleniyor. Asagida da ortalama download ve upload degerlerini gorebiliyorum. 

Process yonetimi
Sistemde calisan processleri goruntuleyebilmek icin ps komutu ile baslayalim.

$  ps
  PID TTY      TIME CMD
      8    tty1     00:00:00 bash
     89   tty1     00:00:00 ps

mevcut shell'de calisan processleri listeledik. Ama tun sistem uzerinde calisan processleri genelde goruntulemek isteriz. Bu durumda aux parametresi ile calistirmamiz gerekir. 

$ ps aux
...

Bunu calistirdigimizda buyuk ihtimalle cok fazla process listelenecektir. Bu kadar process arasindan istedigimizi bulmak icin pipe kullanmak mantikli olacaktir:

$ ps aux | grep python 

Burada gelecek listede en sagdaki stunda, bu processi calistiran komutu gorebiliriz. 

Diyelim ki bir process monitor etmek istediniz ama bu listede cikmadi. Ihtimal ki crash etmis olabilir. Boyle bir durumda sistem loglarina bakmak faydali olabilir. Gunumuzde cogu linux distrosu loglama icin eski syslog  yerine journal-d loglama sistemini kullaniyor. 

$ journalctl --since "10 minutes ago"

seklinde son 10dakika icerisinde kaydedilen log mesajlarini inceleyebilir ve bir ipucu bulabiliriz belki. 

Eger sistemde journalctl yok ise, /var/log klasorune gidip ilgili log dosyasini bulmamiz gerekiyor. Burada loglar kategorik olarak tutulmaktadir. Ornek olarak authentication ile ilgili loglar auth.log dosyasina kaydedilirken, paket yonetimi ile ilgili loglarlar dpkg.log dosyasina kaydedilir. syslog ise tum sistem mesajlarini barindirir. 

Istenmeyen processlere son
Kendimize istenmeyen bir process olusturup daha sonra bunu sonlandiralim. 

$ yes > /dev/null &

yes tool'u surekli `yes` seklinde bir output uretiyor. (sadece yes calistirarak gorebilirsiniz). Bu outputu burada /dev/null device'na yonlendiriyoruz ki burasi da linux sistemlerde bosluk olarak adlandirilir. Bu device'a gonderilen hersey direk yokolur. Istenmeyen process ourputlari buraya yonledirilir. Okunmak istendiginde ise bos dosya gibi davranir. 

Son olarak da sondaki lambda karakteri ile arkaplanda calismasini sagliyoruz. Yani bunu yazip entera basinca bir ID gosterilecek (process id) ama process arkaplanda calismaya baslayacak.

Neyse, ozetle bosluga bagirip duran bir process yarattik. Process bizim mevcut shell'imizde calistigi icin ps ile kontrol edebiliriz:

$ ps

  PID   TTY     TIME        CMD
    98   tty2        00:00:00   bash
  155   tty2        00:00:01   yes
  156   tty2        00:00:00   ps

155 process-id'ye sahip processimizi goruyoruz. Bu PID ile processi sonlandiriyoruz:

$ kill 155
[1]+  Terminated              yes > /dev/null

processin sonlandigina dair bir bilgi mesaji aldik. kill ve pid ikilisi yerine bir programin tum instance'larini oldurmek icin kilall kullanilabilir. 

$ killall yes

bu sayede tum yes program instancelarini sonladiriyoruz. Pratik oldugu kadar tehlikeli de olabilecek bir yontem. 

Process onceligi
Linux ayni anda birden fazla process calistirabilir. Ancak sistem kaynaklari sinirli oldugu icin, bu processler arasinda bazi onceliklendirmeler yapmasi gerekebilir. Bunu saglamak icin nice araci ile calistirdigimiz bir process'e, oncelik degeri atayabiliriz. Bu deger yuksek ise, diger uygulamalarla iyi gecinecek ve bencil davranmayacaktir. Belki daha uzun surede isini bitirecek ama sistem kaynaklari icin diger processlerle kavgaya tutusmayacaktir. En fazla 19 degerini alabilir ve default olarak 0dir. 

Oncelikle yes komutunu tekrar calistiralim. 

$ yes > /dev/null &
$ top

daha sonra top komutu ile sistemi monitor edelim.  Burace NI isimli stunu goreceksiniz. Bu her bir processin nice degerini gostermektedir. Bizim yes processi icin ise bu deger sifir olarak gorulmekte. Simdi yesi sonlandirip nice degeri ile tekrar calistiralim. 

$ nice -19 yes  > /dev/null & 
$ top 

-19 yaniltici olmasin, bu aslinda pozitif 19 degeri. Eski 19 vermek icin ise --19 kullanilmali. Bir process calistirildiktan sonra da nice degerini degistirilebilir. Renice edilebilir.

$ renice -p 15 <PID>

seklinde PID degeri verdigimiz bir processe 15 nice degeri set ettik. 

Ozet
- Linux sistem bilgilerini /proc klasorunde tutar. RAM bilgileri icin /proc/meminfo ve cpu bilgileri icin /proc/cpuinfo 
- Gercek zamanli performans monitoring icin top araci kullanilabilir
- ve network performansi icin iftop -i ens33 kullanilabilir. 
- Disk kullanim bilgileri icin df -ht ext4 ile fiziksel diskler hakkinda bilgi alinabilir.
- ps aux  | grep python ile sistemde calisan processleri listeleyebiliriz
- journalctl --since "10 minutes ago" ile sistem loglarina bakabiliriz
- ayni zamanda loglara /var/log/syslog | grep sshd seklinde de ulasilabilir
- processi sonlandirmak icin kill PID veya killall kullanilabilir
- nice degeri ile process onceligi ayarlanabilir

Yorumlar

Bu blogdaki popüler yayınlar

Python'da Multithreading ve Multiprocessing

Threat Modeling 1

Encoding / Decoding