Yazar InsightTech AI
15 Eyl 2026
9 dk okuma
Modern bulut altyapılarında ve konteynerize ortamlarda güvenlik, hız ve verimlilik üçgeni, sistem mühendisleri için sürekli bir denge arayışı halini almıştır. eBPF (extended Berkeley Packet Filter) teknolojisi, Linux çekirdeğine güvenli ve dinamik kod enjekte etme imkanı sunarak, ağ izleme, hata ayıklama ve güvenlik denetimi gibi alanlarda devrim yaratmıştır. Ancak, bu teknolojinin potansiyelini tam olarak ortaya çıkarabilmek için, çekirdek uzayında (kernel space) çalışan kodun performansı kritik bir öneme sahiptir. Özellikle dosya sistemi erişimlerini denetleyen LSM (Linux Security Modules) kancaları, her dosya açma işlemi sırasında tetiklendiği için, verimsiz algoritmalar kısa sürede ciddi CPU yüküne dönüşebilir. Bu bağlamda, eBPF programlarının performansını optimize etmek, sadece teknik bir zorunluluk değil, aynı zamanda ölçeklenebilir ve maliyet etkin çözümler sunan bir rekabet avantajıdır.
Son dönemde, eBPF tabanlı güvenlik ajanları geliştirirken karşılaşılan en yaygın sorunlardan biri, politika uygulama (policy enforcement) mantığının kendisinden ziyade, hangi politikanın geçerli olduğunu belirleme sürecindeki verimsizliktir. Özellikle yol bazlı (path-based) politika kullanımlarında, aynı dosyanın veya alt dizinlerin tekrar tekrar erişilmesi durumunda, çekirdek her seferinde aynı hesaplamaları yapmak zorunda kalır. Bu durum, özellikle veritabanı erişimleri gibi yoğun dosya I/O gerektiren iş yüklerinde, sistem genelinde hissedilir bir performans düşüşüne yol açar. Bu makalede, Nathan Naveen ve ekibinin Bomfather projesinde uyguladığı ve çekirdek CPU maliyetini yaklaşık %90 oranında düşüren memoizasyon (hafızalama) tekniğini derinlemesine inceleyeceğiz. Bu yaklaşım, eBPF programlarının tasarımında 'bir kez hesapla, sonra kullan' prensibinin ne kadar güçlü bir performans kaldıracı olabileceğini gözler önüne sermektedir.
Sorunun kökeninde, eBPF programının dosya açma olaylarını (file open) yakalayan LSM kancası yatmaktadır. Geleneksel yaklaşımda, her dosya erişiminde sistem, dosyanın tam yolunu yeniden yapılandırmak, dentry (directory entry) yapısı üzerinden üst seviye dizinlere doğru yürümek ve her seviyede ilgili politikanın varlığını kontrol etmek zorundadır. Bu 'yavaş yol' (slow path), özellikle Postgres gibi veritabanı sunucularının /var/lib/postgres/data/base/ altındaki binlerce dosyaya sık sık eriştiği senaryolarda, aynı dentry zincirinin tekrar tekrar taranmasına neden olur. Bu tekrarlayan işlemler, çekirdek CPU döngülerini gereksiz yere tüketir ve sistem genelinde gecikmelere (latency) yol açar.
Çözüm olarak, Nathan Naveen ve ekibi, inode bazlı bir önbellek (cache) mekanizması geliştirmiştir. eBPF map'lerinde doğrudan dentry pointer'ları saklanamadığı için, önbellek anahtarı olarak inode numarası, mount ID ve mount namespace ID bir araya getirilmiştir. Bu üçlü kombinasyon, dosyanın hangi mount ağacında ve hangi namespace'te bulunduğunu benzersiz bir şekilde tanımlar. Önbellek değeri ise, dosya için geçerli olan politikanın bit maskesi (bitmask) konumunu (access_index) ve önbellek durumunu (state) içeren hafif bir yapıdır. Bu yapı, BPF_MAP_TYPE_LRU_HASH tipi bir map'te saklanarak, en az kullanılan girdilerin otomatik olarak atılmasını sağlar. Böylece, aynı inode'a yapılan ikinci ve sonraki erişimlerde, sistem yavaş yolu atlayarak doğrudan önbellekten sonucu alır ve izin/kısıtlama kararını anında verir. Bu mekanizma, çekirdek CPU maliyetini dramatik bir şekilde düşürerek, eBPF ajanlarının gerçek zamanlı performansını önemli ölçüde artırır.
| Özellik | Önbelleksiz (Yavaş Yol) | Memoizasyon (Hızlı Yol) |
|---|---|---|
| Çekirdek CPU Maliyeti | Yüksek (Her erişimde tam yol taraması) | Düşük (~%90 azalma) |
| Dentry Taraması | Her dosya açılışında tekrarlanır | Sadece ilk erişimde yapılır |
| Anahtar Yapısı | Yok (Doğrudan işlem) | mntns_id, mount_id, inode |
| Map Tipi | Gereksiz | BPF_MAP_TYPE_LRU_HASH |
| Veritabanı Erişim Performansı | Düşük (Tekrarlayan hesaplamalar) | Yüksek (Önbellek isabeti) |
| Bakım Karmaşıklığı | Düşük | Orta (Önbellek tutarlılığı) |
Aşağıdaki kod bloğu, eBPF C kodunda inode bazlı önbellek yapısının nasıl tanımlandığını ve kullanıldığını göstermektedir. Bu yapı, çekirdek uzayında hafif ve verimli bir şekilde çalışacak şekilde tasarlanmıştır. Geliştiriciler, bu şablonu kendi eBPF programlarında uyarlayarak benzer performans iyileştirmeleri elde edebilirler. Kod, LRU hash map'inin tanımlanmasını ve anahtar/değer yapılarının nasıl oluşturulduğunu detaylandırmaktadır.
struct inode_cache_key {
u64 mntns_id;
u64 mount_id;
u64 inode;#define INODE_POLICY_CACHE_NO_POLICY 0
#define INODE_POLICY_CACHE_ACCESS_INDEX 1
#define INODE_POLICY_CACHE_GLOBAL_READ_ONLY 2
#define INODE_POLICY_CACHE_ACCESS_INDEX_AND_GLOBAL_RO 3
InsightTech'teki öncü inovasyondan beslenen bir vizyonla dijital geleceği mükemmellik ve dürüstlükle şekillendiriyoruz.
InsightTech Editor EkibieBPF güvenlik ajanlarında inode tabanlı memoizasyon kullanarak çekirdek CPU maliyetini %90 oranında düşüren teknik optimizasyon …
En son bültenimizi almak için e-posta adresinizi girin.
Merak etmeyin, spam gondermeyiz
InsightTech'te, işletmeleri güçlendiren yüksek etkili teknoloji çözümleri sunmaya odaklanıyoruz.
Teklif Alın