sysdig: Sistem Seviyesi Analiz ve Sorun Giderme Aracı
Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MY3WiKIM' (Errcode: 28 - No space left on device) in /usr/share/nginx/html/syslogs/wp-includes/class-wpdb.php on line 2349
Genelde IT altyapılarında meydana gelen problemleri gidermek ve bir daha tekrarlanmayacak şekilde proaktif bir yaklaşımla probleme neden ana faktörleri ortadan kaldırmak için yapılması gereken ilk şey problemi doğru analiz etmektir. Zira doğru olarak analiz edilen bir problem için üretilen çözümler doğru orantılı olarak kalıcı ve ilgili problemin ya da varyasyonlarının tekrar yaşanmasını engelleyici nitelikte olacaklardır. Hal böyle olunca yani iş, problem analizine geldiğinde bu konudaki başarıyı belirleyici en önemli faktör ise yaklaşımlarınız ve kullandığınız araçlardır.
Bu noktada doğru yaklaşım herzaman için problemin nedenlerini tam olarak anlamaktır. Yani eğer ortada neden kaynaklandığını bilemediğiniz ancak geçici çözümler üretebildiğiniz – ki gerçek hayatta en çok problemli servisi / sunucuyu restart etmeye tekabül eden – bir problem varsa önceliği problemi geçici olarak çözmek yerine nedenlerini anlamaya çalışmak üzere konunun derinlerine inmek ve altyapıyı enine boyuna analiz etmeye vermek en doğru yaklaşım olacaktır. Problem çözmede en belirleyici ikinci faktör ise, analiz sırasında kullandığınız araçların derine inmek ve inceleme konusundaki ihtiyaçlarınıza cevap verecek şekilde gelişmiş olması gerekliliğidir. İşte bu yazının konusunu oluşturan sysdig de tarif ettiğimiz bu ihtiyaçlara harika bir şekilde yanıt veren çok güzel bir uygulamadır.
sysdig Nedir ?
Temel olarak hemen tüm majör linux dağıtımında çalışan ve doğrudan linux kernel'ine dahil olarak tüm sistem çağrılarını ve OS ile ilgili diğer olayları en alt düzeyde yakalayıp analiz edilmesine olanak sağlayan sysdig, bu işi yapan strace gibi klasik araçlardan farklı olarak bir çok güzel özellik barındırmaktadır.
Öncelikli olarak kernel seviyesinde processing, network, storage ve memory alt sistemlerinde cereyan eden olayların anlaşılır şekilde ve bütünleşik olarak görüntülenmesine olanak sağlar. Bu, incelemekte olduğunuz platform üzerinde çalışmakta olan uygulamaların sistem seviyesinde ne gibi işlemler yaptığını görüntüleyebilmenize olanak sağlamaktadır ki , sysdig üzerinden elde edilen veri, problem çözmede kullanılabilecek ve genelde log dosyalarından ya da uygulama bağımlı debugging araçlarından elde edilemeyecek türden alt seviye kıymetli bilgi içerir.
Ayrıca, önünüzden geçip giden binlerce satır – ve nispeten anlamsız- system çağrısı ve olayı içerisinde kaybolmamanız için çok güzel de bir filtreleme sistemi barındırmaktadır. Bu şekilde spesifik olarak ilgilendiğiniz alt sistemlerle ilgili çağrıların ve olayların belirttiğiniz kriterlere göre görüntülenmesini sağlayabilirsiniz.
Bir diğer sysdig özelliği ise görüntülenmesini istediğiniz syscall ve event'lerin daha sonra analiz edilmek üzere bir dosyaya yazılmasını sağlayabilmenizdir. Sysdig'in en güzel yanlarından birisi olan bu özellik, rastgele bir zaman diliminde oluşan problemlerin analizi için oldukça kullanışlı bir yöntemdir. Zira bu şekilde ilgili problemin tekrar cereyan etmesini beklemek ve o anda sizin de sistemin başında olmanız zorunluluğu gibi verimsiz bir durumu ortadan kaldırıp uzak sistemlerden topladığınız bu trace dosyaları üzerinde geçmişe yönelik olarak analiz yapabilmenizi olanaklı kılmaktadır. Üstelik trace file denilen bu sysdig dosyalarını MacOS X ya da Windows gibi farklı platformlar üzerinde de analiz edebildiğinizden dolayı illa server side çalışmanıza gerek kalmamaktadır.
Sysdig'in bir diğer güzel özelliği ise “chisels” adını verdikleri ve kurulumla birlikte bir çoğunun öntanımlı olarak geldiği analiz scriptleridir. Bu scriptler toplanan verinin anlamlandırılması için kullanılan Lua dilinde yazılmış scriptlerdir ve sisteminiz hakkında detaylı bilgi edinmek için kullanabileceğiniz ve analiz ihtiyaçlarınıza göre kendi scriptlerinizi geliştirebileceğiniz bir mekanizmadır. Birazdan örnekler bölümünde detaylı olarak değineceğim üzere bu scriptler üzerinden örneğin sadece belirli bir sürece ya da uygulamanın ürettiği trafiği detaylı olarak inceleyebilir, en çok network trafiği üreten portları / süreçleri / bağlantıları görüntüleyebilir, en çok disk I/O'suna neden olan dosyaları / süreçleri bulabilir ya da en çok hata üreten uygulamaları tespit edebilirsiniz. Bu anlamda sysdig, strace, lsof, tcpdump gibi uygulamaların yaptığı işi tek bir çatı altında toplayan gelişmiş bir uygulamadır.
Sysdig Kurulumu
Yazının başında da bahsettiğim gibi sysdig bir listesini biraz sonra vereceğim hemen tüm majör linux dağıtımı üzerinde çalışıyor, YUM ve APT kullanan dağıtımlar için birer paket deposu da bulunuyor. Bu nedenle desteklediği Debian, Ubuntu, CentOS, RHEL, Fedora, Amazon Linux, Oracle Linux, Linux Mint gibi dağıtımlara doğrudan paket yöneticisi üzerinden kurulabiliyor ve bu işlemi gerçekleştirmek için aşağıdaki komutu vermeniz yeterli oluyor:
# curl -s https://s3.amazonaws.com/download.draios.com/stable/install-sysdig | sudo bash
Not: RHEL ya da CentOS 7.0 kullanıyorsanız ve kurulum sırasında EPEL reposu ile ilgili bir hata ile karşılaşırsanız öncesinde EPEL reposunu sisteminize kurmanız gerekebilir. Bu işlem için de aşağıdaki komutu kullanabilirsiniz:
# rpm -Uvh http://dl.fedoraproject.org/pub/epel/beta/7/x86_64/epel-release-7-0.2.noarch.rpm
Ayrıca sysdig'i daha önceden toplanmış veriyi analiz etmek üzere MacOS x ve Windows'a kurabiliyorsunuz. Bu kurulumlar için http://www.sysdig.org/install/ adresindeki ilgili bölümlere de bakabilirsiniz.
Sysdig Kullanımı
Girizgah bölümünde uzun uzun değindiğim üzere sysdig ile uygulamalar ve sistem servislerinin arkaplanda gerçekleştirdiği işleri en alt seviyede görüntülemek mümkün.
Temel Kullanım
sysdig'in en primitive kullanımı komut satırından doğrudan sysdig komutunu çalıştırmaktır. Bu komutu verdiğiniz zaman aşağıda bir örneğini görebileceğiniz şekilde strace benzeri bir çıktı alırsınız.
[root@cromlab-rhel7 ~]# sysdig
Bu şekilde o an çalışan sistem çağrıları ve event'ler ekrandan akacaktır. Bu çıktıda her bir olay bir satır olacak şekilde görüntülenmektedir ve her bir satırda aşağıda sıralaması verilen bilgiler ekrana basılacaktır:
%evt.num %evt.time %evt.cpu %proc.name (%thread.tid) %evt.dir %evt.type %evt.args
İlgili bilgilerin açıklaması da şu şekildedir:
evt.num: Event numarası
evt.time: Event tarihi
evt.cpu: Event'in hangi kaç numaralı CPU core üzerinde çalıştığı
proc.name: Süreç ismi.
thread.tid: Thread ID ( tek thread'li süreçler için PID)
evt.dir
evt.type: Event tipi, örm: ‘open', ‘read', ‘write'
evt.args: event'in aldığı argüman.
Filtreleme Parametreleri
Sysdig'i yukarıda verilen şekilde her sistem olayını görüntüleyecek şekilde kullanmak aynı anda binlerce olayın ekrandan akıp gitmesine ve bu bilgi akışı içerisinde kaybolup gitmenize neden olacaktır; işte strace'den alşık olduğumuz bu verimsiz durumu ortadan kaldırmak için sysdig'in çok gelişmiş bir filtreleme sistemi bulunmaktadır. Kendi değimleri ile samanlıkta iğne aramak için geliştirilmiş bu sistem sayesinde binlerce sistem çağrısını en ince ayrıntısına kadar filtreleyerek spesifik aramalar yapabiliyorsunuz.
Örnek olarak cat komutuna ait aktiviteyi görüntülemek için sysdig'i aşağıdaki şekilde kullanabilirsiniz:
# sysdig proc.name=cat
Bu komutu verip, cat komutu ile bir dosya açarsanız (benim örneğimde cat /etc/passwd) bir kısmı aşağıda gösterilene benzer bir çıktı alırsınız:
Görebileceğiniz gibi bu çıktıda, cat komutunun arka planda gerçekleştirdiği tüm işlemler ekrana yansıtılmaktadır.
Örnek olarak cat ve vi komutunun aktivitelerini görüntülemek için komutu şu şekilde kullanmak mümkündür:
# sysdig proc.name=cat or proc.name=vi
ya da cat haricindeki tüm diğer süreçlerin açtığı dosyalar görüntülemek için örnek şu şekildedir:
# sysdig proc.name!=cat and evt.type=open
Filtreleme işlemlerinde kullanılan ve class.field denilen aramaların hangi kriterlere göre yapılabileceğini belirleyebileceğiniz yüm seçenekler aşağıdaki komut üzerinden listelenebilmektedir:
# sysdig -l
Bu komutun çıktısı aşağıdaki gibi olacaktır:
Yukarıdaki listede görülebileceği üzere tüm subsystem'ler için filtreleme seçenekleri bulunmakta. Filtreleme seçeneklerini kendi ihtiyaçlarınıza göre düzenleyebileceğiniz gibi bazı kullanışlı örnekler ise şu şekildedir:
/var/log dizini altında işlem yapan süreçleri görüntülemek için:
# sysdig fd.directory=/var/log/
sshd süreci haricinde dosyalar üzerinde aktivite gerçekleştiren süreçler ve yaptıkları işlemler:
# sysdig proc.name!=sshd and fd.type=file
Apache ve MySQL süreçlerine ait aktivite:
# sysdig proc.name=apache2 and proc.name=mysqld
Komutların aldığı parametreler üzerinden filtreleme yapmak için proc.args class.filed'i kullanılmaktadır. Örnek olarak parametre olarak www.google.com alan bir uygulamanın hareketlerini izlemek için (örn: ping www.google.com)
# sysdig proc.args=www.google.com
Spesifik bir ip adresi tarafından yapılan bağlantılar sonucu oluşan ve sshd süreci ile alakalı olmayan aktiviteyi incelemek için:
# sysdig fd.ip=192.168.1.2 and proc.name!=sshd
Apache dışındaki süreçler tarafından karşılanan gelen network bağlantılarını incelemek için:
# sysdig evt.type=accept and proc.name!=apache
Root kullanıcısına ait tüm aktivitenin izlenmesi:
# sysdig user.name=root
root grubuna dahil tüm kullanıcıların ürettiği aktiviteyi görüntülemek için:
# sysdig group.name=root
Ana süreci zsh olan ve event tipi execve olan sistem çağrılarını görüntülemek için: (execve uygulama çalıştırma sırasında kullanılan sistem çağrısıdır)
# sysdig evt.type=execve and evt.arg.ptid=zsh
Hata üreten tüm sistem çağrılarını görüntülemek için:
# sysdig “evt.rawarg.fdKullanılabilecek tüm event'leri görüntülemek için aşağıdaki şekilde -L paramertesini kullanabilirsiniz:
Çıktı Formatlarını Düzenleme
Filtreleme sonuçlarının daha düzgün görünmesini sağlamak üzere çıktıları customize edebilmekde mümkün. Örnek olarak event tipi chdir (change dir) olan sistem çağrılarını, komutu (cd) çalıştıran kullanıcı ve ilgli dizini görüntülemek üzere formatlı bir şekilde ekrana basmak için şu komut kullanılabilir:
# sysdig -p"user:%user.name dir:%evt.arg.path" evt.type=chdirzsh üzerinden gerçekleştirilen tüm komutları, kullanıcı, komut ve komut agrümanını içerecek şekilde ekrana basmak için:
# sysdig -p"%user.name) %proc.name %proc.args" evt.type=execve and evt.arg.ptid=bashTrace Dosyaları
Trace dosyası, sysdig'in ürettiği sonuçların daha sonra analiz etmek üzere (tcpdump'da vs olduğu gibi) yazıldığı dosyaları ifade etmektedir. Örnek olarak tüm sysdig çıktısını sysdig_ciktisi.scap dosyasına yazılması için komut şu şekilde olacktır:
# sysdig –w sysdig_ciktisi.scapya da sadece 100 adet event'in ilgili dosyaya yazılmasını sağlamak için komut şu şekilde olmalıdır:
# sysdig –n 100 –w sysdig_ciktisi.scapToplanan sysdig çıktılarının yazıldığı bu dosyayı okuyarak analiz etmek için ise aşağıdaki komut kullanılabilir:
# sysdig –r sysdig_ciktisi.scapChisels
Yazının başında bahsettiğim chisels konusu, sysdig üzerinden elde edilen verinin anlamlandırılması üzere kullanılan scriptlere verilen addır ve öntanımlı olarak bir sürü chisel bulunmaktadır. Öncelikle bu chisel'lerin bir listesini -cl parametresi kullanılabilir:
# sysdig -cl Category: CPU Usage ------------------- topprocs_cpu Top processes by CPU usage Category: Errors ---------------- topfiles_errors top files by number of errors topprocs_errors top processes by number of errors Category: I/O ------------- echo_fds Print the data read and written by processes. fdbytes_by I/O bytes, aggregated by an arbitrary filter field fdcount_by FD count, aggregated by an arbitrary filter field iobytes Sum of I/O bytes on any type of FD iobytes_file Sum of file I/O bytes stderr Print stderr of processes stdin Print stdin of processes stdout Print stdout of processes topfiles_bytes Top files by R+W bytes topfiles_time Top files by time topprocs_file Top processes by R+W disk bytes Category: Logs -------------- spy_logs Echo any write made by any process to a log file. Optionall y, export the events around each log message to file. spy_syslog Print every message written to syslog. Optionally, export t he events around each syslog message to file. Category: Misc -------------- around Export to file the events around the where the given filter matches. Category: Net ------------- iobytes_net Show total network I/O bytes spy_ip Show the data exchanged with the given IP address spy_port Show the data exchanged using the given IP port number topconns top network connections by total bytes topports_server Top TCP/UDP server ports by R+W bytes topprocs_net Top processes by network I/O Category: Performance --------------------- bottlenecks Slowest system calls fileslower Trace slow file I/O netlower Trace slow network I/0 proc_exec_time Show process execution time scallslower Trace slow syscalls topscalls Top system calls by number of calls topscalls_time Top system calls by time Category: Security ------------------ list_login_shells List the login shell IDs spy_users Display interactive user activity Category: System State ---------------------- lsof List the open file descriptors. Use the -i flag to get detailed information about a specific chiselchisel'ler hakkında daha detaylu bilgi almak üzere -i parametresi kullanılabilir. Örnek olarak spy_users isimli chisel'in ne iş yaptığına bakmak için aşağıdaki komut kullanılabilir:
# sysdig -i spy_users Category: Security ------------------ spy_users Display interactive user activity lists every command that users launch interactively (e.g. f rom bash) and every directory users visit Args: [int] max_depth - the maximum depth to show in the hierarch y of processesŞimdi chisel'ler üzerinden bir kaç örnek yapalım.
En cok CPU kullanımı olan süreçler:
# sysdig -c topprocs_cpu1 ms'den uzun süren I/O aktivitesi:
# sysdig -c fileslower 11 ms'den uzun süren network aktivitesi:
# sysdig -c netlower 1syscall bazında en çok error üreten süreçler:
# sysdig -c topprocs_errorsSüreçlere ait standart çıktıları ekrana basmak için (filtrelenebilir):
# sysdig -c stdoutYazma + Okuma anlamında en çok disk I/O'nun yapıldığı dosyalar:
# sysdig -c topfiles_bytesEn çık disk I/O üreten (Read + Write) süreçler:
# sysdig -c topprocs_fileDisk I/O anlamında en çok uzun süre aktivite üreten süreçler:
# sysdig -c topprocs_timeByte cinsinden toplam I/O miktarı:
# sysdig -c iobytes_fileHangi süreçlerin hangi log dosyalarına ne yazdığının ekrana basılması:
# sysdig -c spy_logsSyslog'a yazılan her mesajın görüntülenmesi:
# sysdig -c spy_syslogSpesific bir ip'nin ürettiği trafiğin görüntülenmesi (dikkat edeceğiniz üzere chisel'leri filtreleme seçenekleri kullanabiliyoruz):
# sysdig -c spy_ip 1.1.1.1 proc.name!=sshdSpesifik bir port üzerinde gerçekleşen trafiğin görüntülenmesi:
# sysdig -c spy_port 80Byte cinsinden en çok trafik üreten bağlantıların listenmesi:
# sysdig -c topconnsEn çok trafik üreten portların listelenmesi:
# sysdig -c topports_serverEn çok trafik üreten süreçlerin görüntülenmesi:
# sysdig -c topprocs_netSistemdeki kullanıcılara ait aktivitenin interaktif olarak izlenmesi:
# sysdig -c spy_usersÖrnekleri çoğaltmak mümkün ve daha fazlası için http://www.sysdig.org/wiki/sysdig-examples/ adresine bakabilir ya da kendi ihtiyaçlarınıza göre kendi örneklerini türetebilirsiniz. Sysdig, arka planda cereyan eden olayları göz önüne getiriyor oluşunsan ve bu işi oldukça düzgün yapıyor oluşundan dolayı, gerçekten övgüyü hakkaden bir uygulama. Sizin de işinize yarayacağınu ümit ediyorum.
Visited 923 times, 1 visit(s) today
Bu yazılar da ilginizi çekebilir:
- Locust – Açık Kaynak Kod Load Test Uygulaması
- WAFP – Web Application Finger Printer
- Arping – Link Layer (L2) Pinging
- Yasat ile Sistem Denetimi
- CPU Limit ile Süreçlerin İşlemci Kullanımını Sınırlamak
Yorumlar
Trackbacks
Yorumda bulunun.
Çok faydalı bir araçmış, default kurduğum paketler arasına bunu da ekledim. Debian Jessie için bu paket depoda var, doğrudan depodan kurulabiliyor.
[Cevapla]
Makale için teşekkürler. Bana çok faydalı oldu. Bir de birden çok sistemde çalışan sysdig çıktılarını merkezi olarak ayarlayıp, takip edebilecek bir arayüz olsa süper olacakmış.
Makale de düzgün görünmeyen bir kısım var. “Hata üreten tüm sistem çağrılarını görüntülemek için” örneğinde sanırım küçüktür işaretinden kaynaklanan bir markup sorunu olmuş. İfade sayfada
sysdig ” evt.rawarg.res
şeklinde gözüküyor. Belki aynı markup sorunu burada da olur diye aynı ifadeyi küçüktür işaretini okunuşu ile belirterek de yazıyorum: “evt.rawarg.fd KÜÇÜKTÜR 0”. Eğer yan taraftaki ifadede KÜÇÜKTÜR işaretini görüyorsanız aynı markup sorunu yorumlarda olmuyor demektir. İfadenin tam hali: “evt.rawarg.fd < 0"
[Cevapla]
İlginize teşekkür ederim, gerekli düzelmeyi yaptım.
[Cevapla]