6 puan yazan GN⁺ 2025-03-15 | 2 yorum | WhatsApp'ta paylaş
  • KVM tabanlı tek süreçli bir sandbox
    • Genel Linux programları veya belirli API'leri kullanan programlar sandbox içinde çalıştırılabilir
  • Donanım sanallaştırması kullanarak yerel performans sunar
  • KVM API'sinin yalnızca bir kısmını kullanır → kod tabanı küçük ve verimlidir

TinyKVM'in tasarımı

  • Statik Linux ELF programlarını çalıştırma desteği
    • Dinamik çalıştırılabilir dosya desteği daha sonra eklenecek
    • Harici HTTP sunucularına veya önbelleğe erişim sağlamak için API ile genişletilebilir
    • Şu anda AMD64(x86_64) üzerinde çalışıyor, AArch64(64 bit ARM) portu planlanıyor
  • Hugepage desteği
    • Misafir sayfaları için hugepage oluşturulabilir
    • Ana makinede de hugepage kullanılabilir → performansı iyileştirir
    • Örnek: 2MB sayfa ayırmada LLVM derleme performansında %5 artış gözlendi
  • Hızlı fonksiyon çağrıları
    • Misafirden fonksiyon çağrısında ek yük 2μs
    • Zamanlayıcı olmadan çalıştırıldığında ek yük 1.2μs'ye düşer
  • Uzak hata ayıklama desteği
    • GDB ile uzaktan hata ayıklama yapılabilir
    • Hata ayıklamadan sonra program normal şekilde devam ettirilebilir
  • Copy-on-Write desteği
    • Kendi fork işlevini destekler → bellek kopyalamayı en aza indirir
    • Örnek: 6GB'lık bir model kopyalandığında örnek başına yalnızca 260MB bellek gerekir
  • Hızlı durum başlatma
    • Misafir durumu hızlıca sıfırlanabilir → güvenliği artırır
    • Her istekte sıfırlamak, durum sızıntısı riskini azaltır
  • Sadeleştirilmiş kod tabanı
    • KVM API'sinden yaklaşık 42k LOC kullanır
    • TinyKVM'in kendi kod tabanı yaklaşık 9k LOC → rakip çözümlerden çok daha küçüktür
    • Örnek: Wasmtime 350k LOC, FireCracker 165k LOC
  • Statik sayfa tablosu oluşturma
    • Çalışma zamanında sayfa tabloları değiştirilemez → güvenliği artırır
    • Sayfa tablosu bütünlük denetimi yapılır
  • Ayrılmış süreç bağlamı
    • KVM misafiri ayrı PCID/ASID kullanır → Spectre gibi spekülatif yürütme saldırılarına karşı dayanıklıdır
  • Güçlendirilmiş çekirdek
    • SMEP, SMAP etkin
    • CPU istisnaları kullanıcı modunda işlenebilir

Sistem çağrılarının işlenmesi

  • Ana makine ile API bağlantısı
    • Sistem çağrıları SYSCALL/SYSRET veya OUT komutu üzerinden yapılır
    • Sistem çağrısı sırasında VM exit oluşur → yaklaşık 1μs sürer
    • Küçük çağrıları azaltan, büyük G/Ç birimlerine dayalı API tasarımı önerilir

Karşılaştırmalar

  • VM çağrı ek yükü
    • VM sıfırlama sırasında tail latency ölçülür
    • Sıfırlama olmadan yapılan basit çağrılarda ek yük düşüktür
  • Bellek performansı
    • Bellek performansı normal düzeydedir
    • Örnek: HTTP karşılaştırmasında saniyede 1500 AVIF kodlama yapılabilir
  • JPEG → AVIF dönüştürme performansı
    • Saniyede yaklaşık 1582 görüntü dönüştürülebilir
    • YUV dönüştürme yolu kullanılarak kayıpsız dönüşüm yapılabilir

Hızlı sandbox performansının nedenleri

  • I/O ve sürücü kullanılmaması
    • I/O, sürücü ve sanal aygıt yoktur → performans kaybını önler
    • Yalnızca CPU kaynakları kullanılır → yerel hıza yaklaşır
  • Hugepage optimizasyonu
    • Hugepage kullanımı sayfa yürüyüşlerini azaltır → performansı artırır
    • Büyük ölçekli LLM iş yüklerinde %99.7 yerel performansa ulaşıldı
  • Hızlı VM çağrıları
    • Misafirden fonksiyon çağrılarında ek yük en aza indirilir
    • Veriler yerel CPU hızında işlenebilir

Sınırlamalar

  • vCPU sayısı azaltılamaz
    • KVM API'sinde vCPU sayısını azaltmak mümkün değildir
    • Çoklu işlem, birden fazla VM'in paralel çalıştırılmasıyla çözülebilir
  • Sıfırlama performansı düşüşü sorunu
    • VM durumunu sıfırlarken performans düşüşü yaşanabilir
    • Ancak durum paylaşımı ve kopyalama ile bu sorun çözülebilir

Gelecek çalışmalar

  • Intel TDX ve AMD SEV desteği eklenecek
  • AArch64 portu
  • Bellek kilitleme (KVM_MEM_READONLY) özelliği eklenecek → güvenlik artacak
  • Daha kullanıcı dostu API iyileştirmeleri
  • Dinamik bağlantı yükleme desteği eklenecek → Varnish ile entegrasyon güçlenecek

Sonuç

  • TinyKVM, en küçük ve en hızlı sandbox çözümlerinden biridir
  • Hem güvenlik güçlendirmesi hem performans optimizasyonu sağlar
  • Küçük kod tabanı sayesinde bakımı kolaydır
  • Açık kaynak bir kütüphane olarak sunuluyor → ilgileniyorsanız kod deposuna göz atabilirsiniz

TinyKVM deposu

2 yorum

 
xcutz 2025-03-16

İlginçmiş.

 
GN⁺ 2025-03-15
Hacker News görüşleri
  • Bunu gerçekten çok beğendim. Umarım şu anda yaptıkları işi sürdürürler

    • IncludeOS'un ana katkıcılarından biri olduğunu biliyordum. Bu blog yazısını okurken aklıma ilk gelen proje buydu
    • Uzun zamandır ağ işlevi sanallaştırmasına takıntılıyım. Dağıtık sistemlerde iş birimlerini ayırmak için en doğal sınır bu ve temiz bir soyutlama ile verimli bir ölçeklendirme mekanizması sağlıyor
    • Varnish'i prodüksiyonda büyük memnuniyetle kullanıyorum. nginx'ten bile daha güvenilir bulduğum kısım bu. Genelde varlığını bile unutuyorum. Doğru şekilde yapılandırdıktan sonra hiç hata kaynağı olmadı
  • Firecracker'a benziyor ama çok daha hızlı

    • En sevdiğim yanı, VM durumunu önceden tanımlanmış bir duruma anında sıfırlayabilmesi. Aslında yeniden başlatmadan VM'i yeniden başlatmak gibi
    • Sürekli saldırı alan ağ servisleri için ideal bir önlem gibi görünüyor. Saldırı başarılı olsa bile, sonuç bir sonraki istekte silinmiş oluyor
    • ML model çalıştırıcısı gibi bu amaç düşünülmeden yazılmış programlar için kolay COW sayfa paylaşımı da oldukça iyi
  • Orijinal gönderi: bağlantı

    • Bu konuyla ilgili çok sayıda gönderi bulunabilir
  • Gerçekten ilginç. 2.5us anlık görüntü geri yükleme performansı Wasmtime ile aynı seviyede, ama yerel kod çalıştırabilme gibi büyük bir avantajı var. Yine de çok daha yavaş olmasına rağmen hâlâ mikro saniye düzeyinde birlikte çalışabilirlik sunuyor

    • tinykvm_examples deposunda zaten bir QuickJS demosu var, ancak JIT özellikli bir JavaScript runtime'ı çalıştırabildiğini doğrulamak bunu çok daha heyecanlı hale getirirdi
    • React uygulamalarını sunucu tarafında render etme deneylerimde yerel QuickJS yaklaşık 12-20ms, v8 ise JIT ısındıktan sonra 2-4ms idi
    • Bunu daha fazla incelemem gerekiyor, ama sandbox içinde çalışan ve tüm HTTP isteklerini Varnish üzerinden işleyen, Deno benzeri tek bir çalıştırılabilir dosya yapmak istiyorum
    • Belirtilen JS URL'sini aldıktan sonra anlık görüntü alınır ve her isteğin yalıtılmış bir anlık görüntüde çalışması sağlanır
    • İstek başına rastgele seed'i sıfırlayan bir mekanizma gerekecektir
  • Bu temelde libkrun gibi bir şey değil mi? bağlantı

  • Bunun tam olarak amaçlanan kullanım alanı bu değil ama, X sunucusu (veya Wayland) çalıştırma deneyimi olan var mı?

    • Mac üzerinde bir RDP sunucusu için geliştirme yapıyorum ve bazen istemci tarafında başka ihtiyaçlarım oluyor. Şu anda UTM (QEMU Mac frontend'i) ve DietPi (oldukça sadeleştirilmiş bir Debian) VM kullanıyorum
    • Docker'a aşinayım, ancak grafik sunucusu çalıştırmak için hangi adımların gerektiğini de iyi biliyorum. Daha basit bir yol olup olmadığını merak ediyorum
  • İlginç, ama büyük resmi anlamakta zorlanıyorum. Bu, çekirdek olmadan bir VM içinde kullanıcı süreci çalıştırmak mı? Tüm sistem çağrıları VM'in sonlanmasına yol açıp host'a proxy mi ediliyor? Yoksa hiç sistem çağrısı mı yok?

  • Kullanım senaryosuna uyuyorsa gerçekten harika

    • Gönderiden birkaç not
    • TinyKVM'in yerel hızın %99.7'sinde çalıştığını bulmuşlar
    • Dosya veya ağ erişimi gerekmiyorsa ve statikse, doğrudan çalıştırılabilir
    • TinyKVM konuğu, değiştirilemeyen küçük bir çekirdeğe sahip
  • Gerçekten harika

    • Self-hosted bir PaaS için mikro-VM'leri araştırıyorum ve düşük overhead'li olması gerçekten ilginç bir seçenek gibi görünüyor
  • Makalede Varnish üzerinde çalıştığı yazmıyor; hatta yazar bunun Varnish'i çalıştırmak için olmadığını söylüyor