Rust ile geliştirilen Zstandard duyuruldu
(trifectatech.org)- libzstd-rs-sys, Trifecta Foundation'ın zlib ve bzip2'nin ardından üçüncü sıkıştırma projesi olup, zstd'nin Rust tabanlı ilk sürümüdür
- Zstd, modern CPU'lara göre tasarlanmış bir sıkıştırma formatıdır; gzip'ten daha hızlıdır ve daha yüksek sıkıştırma oranı sunar, bu nedenle web trafiğinde gzip'in yerini kademeli olarak alması beklenmektedir
- Mevcut Rust zstd crate'i C kodunu kaynaktan derlediği için C toolchain ve hedef desteği gerektirir; bu da Windows ve WebAssembly kurulumlarını zorlaştırabilir
- Rust uygulaması, drop-in uyumlu bir C kütüphanesi olarak derlenebilir ve C referans uygulamasına alternatif olarak test suite, fuzz testleri ve Miri ile doğrulanmaktadır
- Varsayılan açma performansı C'den birkaç yüzde puan daha yavaştır, ancak yaklaşık %3 performans kaybı bellek güvenliğinin bedelidir; deneysel bir bayrakla C performansına ulaşılabilir
İlk sürüm ve Rust uygulamasının anlamı
- Trifecta Tech Foundation, zlib ve bzip2'nin ardından, zstd'yi ele alan libzstd-rs-sys'in ilk sürümünü üçüncü sıkıştırma projesi olarak duyurdu
- Zstd, modern CPU'lar göz önünde bulundurularak tasarlanmış bir sıkıştırma formatıdır ve gzip'ten çok daha hızlı çalışıp daha iyi sıkıştırma oranı sağlayabilir
- zstd halihazırda yaygın biçimde kullanılmaktadır ve web trafiğinde gzip'in yerini kademeli olarak alması beklenmektedir
- Rust'ta zstd zaten zstd crate'i ile kullanılabiliyor, ancak mevcut crate C kodunu kaynaktan derlediği için hedefe uygun C toolchain ve hedef desteği gerektiriyor
- Windows ya da WebAssembly için C toolchain kurmak zor olabildiğinden, saf Rust uygulaması Rust geliştiricileri için daha iyi bir bağımlılık deneyimi sunuyor
libzstd-rs-sys, zlib ve bzip2 çalışmalarında olduğu gibi drop-in uyumlu bir C kütüphanesi olarak derlenebiliyor ve C referans uygulamasına alternatif olmayı hedefliyor- C referans uygulaması Meta tarafından sürdürülüyor ve katkıda bulunmak için Meta ile katkıcı sözleşmesi imzalamak gerekiyor; bu nedenle bağımsız, yüksek performanslı ve uyumlu bir uygulama açık kaynak ekosistemini güçlendirebilir
Doğrulama, performans ve kalan işler
- İlk referans uygulama
c2rustile dönüştürüldü; ardından açma ve sözlük oluşturucu için temizlik çalışmaları tamamlandı - Rust kodu C statik kütüphanesi olarak derlendikten sonra referans uygulamanın test suite'i ile doğrulandı
- Fuzz testleri ve Miri de uygulamanın doğruluğunu doğrulamak için kullanıldı
- Ön sürüm libzstd-rs-sys v0.0.1-prerelease.2 olarak sunuluyor
-
Bellek güvenliğinin maliyeti
- Varsayılan açma performansı C referans uygulamasından birkaç yüzde puan daha yavaştır
maindalına birleştirilen her değişiklik benchmark suite üzerinde ölçülmektedirunsafe-performance-experimentalözellik bayrağı açıldığında C performansı ile eşleşir- Bu bayrak, girdi verisinin veri yapısı indekslemesinde kullanıldığı 4 noktadaki sınır kontrollerini devre dışı bırakır
- Kullanıcıların çoğu için yaklaşık %3 performans kaybı, iyileştirilmiş bellek güvenliği karşılığında kabul edilebilir bir bedel olabilir
- Son performans kırıntısına kadar ihtiyaç duyanlar riski kabul ederek bu bayrağı açabilir; bu 4 noktadaki davranış, sınır kontrolü yapmayan C ile aynıdır
-
Sıkıştırma uygulaması ve ekosistem entegrasyonu
- Sıkıştırma kısmı için hâlâ fon aranıyor
- Sıkıştırma ve açma arasında kod paylaşımı bulunduğundan sıkıştırma kodunun bir kısmı da incelendi, ancak temizlik çalışmalarının büyük bölümü hâlâ duruyor
- Sıkıştırma performansındaki gerilemeyi önlemek için benchmark'lar kuruldu ve referans uygulamanın test suite'i ile doğru çıktı üretip üretmediği kontrol ediliyor
- Kalan işler Milestone 4: Encoder implementation altında listeleniyor
- C kütüphanesi yerine
libzstd-rs-syskullanan birzstdfork'u bulunuyor ve gelecekte bunun upstream'e alınması isteniyor - En yaygın kullanılan API'lerde entegrasyon nispeten basit
experimentalözelliğindezstd-safeenum kullanırken, FFI güvenliği içinstructkullanılması gerekiyor; burada bir uyumsuzluk var
-
Sponsorluk
- Açma çalışmaları Chainguard, Astral, NLnet Foundation tarafından finanse edildi
- Sözlük oluşturucuya Sovereign Tech Agency yatırım yaptı
1 yorum
Lobste.rs görüşleri
Gerçekten sevindirici bir haber. Birkaç gün önce tek bir bağımlılık yüzünden zstd derlemesi yapmak için
libc-devçekmek zorunda kalmıştım ve birinin bunu Rust ile ciddi biçimde yeniden uygulamayı denemiş olup olmadığını merak ediyordumUmarım toplulukta yaygın biçimde benimsenir
Rust tabanlı bir WireGuard projesi geliştiriyorum, bu yüzden çeşitli Rust kriptografi kütüphanelerini kullanıyorum. Bellek güvenliği gibi açık bir avantaj var ama eski C kütüphanelerinin aksine hepsi güvenlik denetiminden geçmiş değil
Sonuçta asıl merak ettiğim şey, bu algoritmaları Rust’ta yeniden yazmanın gerçekten bu maliyete değip değmeyeceği
Ayrıştırma, protokol durumu, tampon yönetimi gibi “sıkıcı” kripto dışı kodların doğru çalışması, sistemin güvenli olması için şarttır. Saldırganlar, eğer keyfi kod çalıştıran sihirli bir paket gönderebiliyorlarsa, binlerce yıl sürecek çözmeyi birkaç on yıla indiren ileri kriptoanalize ya da zamanlama yan kanallarına uğraşmaz
Bunun avantajı, her iki tarafın da bellek güvenli olması ve sadece dar bir unsafe FFI sınırı bırakmanızdır. Go kriptografi kütüphaneleri şu anda Rust’ta, daha doğrusu crates.io ekosisteminde sunulanlardan daha olgun
-sysve-rs-sysson eklerinin ne zaman kullanılması gerektiğini belgeli biçimde açıklayan bir kaynak bilen var mı diye merak ediyorum. Sezgisel olarak-sys’in Rust ile yazılmamış sistem kütüphanelerini saran crate’ler için olduğunu düşünüyordumAma bu çerçevede
-rs-sysson eki pek anlamlı gelmiyor, demek ki sezgim yanlıştı. Yetkili bir kaynak bilen var mı?*-sys: eski ve yaygın bir gelenek; https://doc.rust-lang.org/cargo/reference/… adresinde açıklanıyor. Ama bu crate’e hiç uymuyorlib*: bunun bir kütüphane olduğunu zaten biliyoruz, Rust’ta bu önek geleneksel değil ve yukarıdaki bağlantıda da*-sysile birlikte yarı dolaylı biçimde kaçınılması gerektiği belirtiliyor.libzstd-sysolsaliblibzstdile linkleneceği düşünülebilir. Ayrıca Rust’tan bağımsız olarak çiftlibadına gerçekten rastladım*-rs: https://rust-lang.github.io/api-guidelines/naming.html belgesinde dendiği gibi, “Her crate zaten Rust’tır! Kullanıcıya bunu sürekli hatırlatmaya gerek yok”-syscrate’leri genelde oldukça ham bir C tarzı arayüz sunar, içinde bolca unsafe kod bulunur ve çoğu zaman harici bir kütüphaneyi derler ya da linklerler-rs-sysadının daha tutarsız kullanıldığını gördüm. Görünüşe göre bir Rust crate’i içinde yeniden paketlenmiş harici kodu derleyen kütüphaneler için kullanılıyor; örneğin hâlâ C parçaları kalan tamamlanmamış Rust uygulamaları ya da sys crate’leri için Rust destek kodlarılibzstdasıl isim. C kütüphaneleri adlarındalibbulundurma eğilimindedir; bunu Rust/Cargo geleneklerine göre değiştirmek yerine referans amaçlı olduğu gibi bırakmışlar-rs, Facebook’un C uygulamasından ayırmak için bunun bir Rust yeniden yazımı olduğunu gösteriyor. Bu, birçok Rust projesinde yaygın bir genel son ek; Python kütüphanelerininpysomethinggibi adlandırılmasına benziyor-sys, bu uygulamanın unsafe C API’sini dışa vuran bir drop-in replacement olmasından geliyor. Cargo kullanıcısının gözünde bu bir Rust kütüphanesi değil. Rust arayüzü yok; C fonksiyonları olan C kodu gibi çağırıyorsunuzYani bu
-rs-sysdeğil,libzstd-rs’nin-syssürümüNeden ruzstd yerine bu tercih edilmeli? Mevcut crate’e yatırım yapmak daha iyi olmaz mı?
Bire bir port, başka bir kod tabanı üzerinde aynı derecede hızlı ve eksiksiz bir sıkıştırıcıyı nasıl yapacağını yeniden keşfetmek yerine, nispeten düz bir kod dönüşümüyle benzer hız ve özellik eşdeğerliği sağlamayı mümkün kılıyor
“C referans uygulaması Meta tarafından yönetiliyor ve katkıda bulunmak için Meta ile bir katkıcı sözleşmesi imzalamanız gerekiyor”
Yakın zamanda öğrendiğim ilginç bir ayrıntı da şu: Facebook’un yönettiği referans zstd uygulaması da LLM ile kodlanıyor ve openssl’in bağımlılıkları arasında yer alıyor; dolayısıyla daha fazla alternatif çıkmasına tamamen olumlu bakıyorum
“Varsayılan ayarlarda, bizim uygulamamızın açma performansı C referans uygulamasından birkaç yüzde puan daha yavaş”
Bu proje hakkında bilmem gereken tek şey bu
Bu arada, alıntıladığın cümlenin hemen ardından şu geliyor
“Ancak
unsafe-performance-experimentalözellik bayrağını açarsanız C performansına ulaşılıyor; bu yüzden bu performans kaybının gerekçelendirilebilir olduğunu düşünüyoruz. Bu bayrak, girdi verisinin veri yapısı indekslemesinde kullanıldığı dört yerde sınır kontrolü yapılan 4 denetimi kapatıyor. Kullanıcıların çoğu için yaklaşık %3’lük performans kaybı, daha yüksek bellek güvenliği karşılığında kabul edilebilir bir bedel olacaktır. Gerçekten son damla performansa ihtiyacınız varsa, bu bayrağı kendi sorumluluğunuzda açabilirsiniz. Bu dört noktadaki davranış, sınır kontrolü yapmayan C ile aynıdır ve birçok üretim sisteminde sorunsuz çalıştığı görülmektedir”