Linux sistemlerinde performans sorunlarını çözmek, yüzeysel metriklerin ötesine geçmeyi gerektiren, detaylı bir analiz sürecidir. Bir uygulamanın veya sistem bileşeninin neden beklendiği gibi çalışmadığını anlamak için çekirdek seviyesindeki etkileşimleri ve donanım olaylarını incelemek zorunludur. Bu yazıda, bu tür derinlemesine incelemeler için iki temel aracı, strace ve perf'i, gerçek dünya senaryolarıyla ele alacağız.
strace ile Sistem Çağrısı Analizi
strace, bir programın yaptığı sistem çağrılarını ve aldığı sinyalleri izlemek için kullanılan vazgeçilmez bir tanı aracıdır. Bir uygulamanın I/O beklemeleri, beklenmedik dosya erişimleri, gereksiz süreç yaratma veya ağ sorunları gibi davranışlarını, çekirdek sınırındaki etkileşimlerini gözlemleyerek ortaya çıkarır. Özellikle bir uygulamanın neden "takıldığını" veya yavaşladığını anlamak istediğinizde ilk başvurmanız gereken araçlardan biridir.
strace Temelleri ve Kullanım Alanları
Bir uygulamanın başından sonuna kadar tüm sistem çağrılarını izlemek için doğrudan komutun önüne strace yazmak yeterlidir:
strace ls /tmpBu komut, ls /tmp komutunun yaptığı tüm sistem çağrılarını standart hata çıktısına basacaktır. Ancak üretim ortamında çalışan bir süreci izlemek daha yaygındır. Bunun için -p parametresi kullanılır:
strace -p 12345Burada 12345 izlenecek sürecin PID'sidir. Çıktı çok fazla olabilir, bu yüzden genellikle belirli sistem çağrılarına odaklanmak isteriz:
- Dosya sistemi çağrılarını izlemek:
-e trace=file - Ağ çağrılarını izlemek:
-e trace=network - Süreç yönetimi çağrılarını izlemek:
-e trace=process
Tüm çıktıyı bir dosyaya kaydetmek için -o parametresi kullanılır:
strace -o strace.log -e trace=file,network -p 12345Üretim Ortamı Senaryosu: Yavaş Bir Uygulama
Bir web sunucunuzun belirli isteklerde zaman aşımına uğradığını varsayalım. Yük az olmasına rağmen, bazı işlemlerin takıldığını görüyorsunuz. Bu durumda, ilgili web sunucusu worker sürecinin PID'sini alıp strace ile izleyebilirsiniz:
strace -p <web_worker_pid>Çıktıda, uzun süreli read(), write(), poll() veya connect() çağrıları görebilirsiniz. Örneğin, read(3, "", 8192) = 0 gibi bir çıktı, dosya tanımlayıcı 3'ten okuma girişiminin hemen boş döndüğünü gösterebilir; bu, bir kaynak tükenmesine veya yanlış dosya açma moduna işaret edebilir. Veya uzun süren bir sendto() çağrısı, ağ tarafında bir gecikme olduğunu gösterir.
...poll([{fd=3, events=POLLIN|POLLPRI}], 1, 60000) = 0 (Timeout)Bu çıktı, dosya tanımlayıcı 3 üzerinde 60 saniye bekledikten sonra bir olay gelmediğini gösterir. Bu, veritabanı bağlantısının koptuğuna, bir mikroservis çağrısının yanıt vermediğine veya bir kuyruktan mesaj gelmediğine işaret edebilir. strace, bu bekleme noktasını kesin olarak belirleyerek sorunun kaynağını daraltmanızı sağlar.
perf ile Düşük Seviye Performans İncelemesi
perf, Linux çekirdeğinin Performans Olayları Alt Sistemi'ni kullanan güçlü bir profil oluşturma aracıdır. Donanım performans sayaçlarına (CPU döngüleri, önbellek kaçakları, dallanma tahmin hataları), çekirdek tracepoint'lerine ve kullanıcı alanı dinamik problarına erişerek sistemin ve uygulamaların düşük seviyeli davranışlarını analiz etmenizi sağlar. strace bir uygulamanın ne yaptığını (sistem çağrıları) gösterirken, perf bir uygulamanın nerede zaman harcadığını (CPU döngüleri, önbellek erişimi) ortaya koyar.
perf Temelleri ve Kullanım Alanları
Bir komutun veya sürecin genel performans istatistiklerini almak için perf stat kullanılır:
perf stat -p <PID> 10Bu komut, belirtilen PID'ye sahip süreci 10 saniye boyunca izler ve CPU döngüleri, talimatlar, önbellek referansları/kaçakları gibi metrikleri özetler. Özellikle CPU-bound uygulamalarda veya önbellek verimliliğini değerlendirirken paha biçilmezdir.
Uygulamanın CPU kullanımının hangi fonksiyonlarda yoğunlaştığını görmek için perf record ve perf report ikilisi kullanılır:
perf record -g -p <PID> sleep 10
perf report-g parametresi, çağrı grafiklerini (call graph) kaydetmeyi sağlar. perf report, kaydedilen veriyi interaktif bir arayüzde sunarak en çok CPU zamanı harcayan fonksiyonları ve bunların çağrı zincirlerini (stack trace) görmenizi sağlar. Bu, uygulamanızdaki "sıcak noktaları" (hotspots) belirlemek için en etkili yöntemdir.
Üretim Ortamı Senaryosu: CPU Yoğun Uygulama Optimizasyonu
Bir veri işleme motorunuz var ve beklenen verimi alamıyorsunuz. Sunucunun CPU kullanımı %90'ın üzerinde seyrediyor ancak hangi kod bölümünün bu yükü yarattığını bilmiyorsunuz. Bu durumda perf record -g kullanarak motorun çalışma anındaki profilini çıkarabilirsiniz:
perf record -g -F 99 -p <data_engine_pid> -- sleep 30
perf report-F 99, saniyede 99 örnekleme frekansı belirler (çekirdek frekanslarıyla çakışmayı önlemek için asal sayı tercih edilir). perf report çıktısında, CPU'nun büyük bir kısmını tüketen, belki de beklenmedik bir algoritma veya verimli olmayan bir döngü görebilirsiniz. Örneğin, bir string manipülasyon fonksiyonunun veya bir şifreleme rutininin %40'ın üzerinde CPU harcadığını tespit edebilirsiniz. Bu bilgi, doğrudan optimize etmeniz gereken kod bloğunu işaret eder.
strace ve perf: Tamamlayıcı Bir Yaklaşım
strace ve perf birbirini mükemmel şekilde tamamlar. strace, bir uygulamanın neden beklediğini (hangi sistem çağrısında takıldığını) anlamanıza yardımcı olurken, perf, uygulamanın nerede aktif olarak zaman harcadığını (hangi kod yollarında CPU döngüleri tükettiğini) gösterir.
Ortak bir senaryo: Bir uygulama yavaş çalışıyor. strace çıktısında yoğun poll() çağrıları görüyorsunuz. Bu, uygulamanın bir I/O veya ağ kaynağından veri beklediğini gösterir. Ancak bu bekleme süresi içinde CPU'da ne oluyor? Belki de gelen verinin işlenmesi CPU yoğun bir işlem. Bu noktada perf devreye girer. perf record ile uygulamanın profilini çıkardığınızda, poll() çağrıları arasında veya hemen sonrasında belirli bir veri işleme fonksiyonunun CPU'yu tavan yaptığını görebilirsiniz. Bu, sorunun temel nedeninin hem I/O beklemesi hem de beklemeden sonraki verimsiz işlem olduğunu ortaya koyar.
Üretim Ortamında Dikkat Edilmesi Gerekenler
- Performans Yükü:
strace, özellikle yüksek işlem hacimli uygulamalarda önemli bir performans yükü oluşturabilir. Her sistem çağrısının izlenmesi ve günlüğe kaydedilmesi maliyetlidir.perf'in yükü genellikle daha düşüktür, ancak yüksek örnekleme frekansları veya uzun süreli kayıtlar büyük veri dosyalarına neden olabilir. - Güvenlik ve Yetkilendirme: Bu araçların çoğu, çekirdek seviyesindeki verilere erişmek için root yetkileri gerektirir. Üretim ortamında dikkatli ve kontrollü kullanılmalıdırlar.
- Alternatifler: Daha düşük overhead ile daha derinlemesine izleme için eBPF tabanlı araçlar (örneğin
bpftrace,bccaraçları) düşünülebilir. Ancakstraceveperf, hala sorun giderme toolkit'inizin temel taşlarıdır.
Sonuç
strace ve perf, Linux performans sorunlarını teşhis etmek için sistem uzmanlarının ve geliştiricilerin cephaneliğindeki en güçlü silahlardan ikisidir. Biri sistem çağrıları düzeyinde uygulamanın dış dünyayla etkileşimini, diğeri ise CPU ve donanım olayları düzeyinde uygulamanın iç işleyişini aydınlatır. Bu araçları etkin bir şekilde kullanarak, sistemlerinizdeki gizli darboğazları ortaya çıkarabilir, uygulamalarınızın performansını kritik düzeyde iyileştirebilirsiniz. Unutmayın, derinlemesine bilgiye ulaşmak, her zaman en karmaşık sorunların çözümünün anahtarıdır.