Dağıtılmış Derlemeler

Sorun bildirin Kaynağı göster

Büyük bir kod tabanınız olduğunda bağımlılık zincirleri çok derin hale gelebilir. Basit ikili programlar bile çoğu zaman on binlerce derleme hedefine bağlı olabilir. Bu ölçekte, bir derlemeyi tek bir makinede makul bir sürede tamamlamak imkansızdır: Hiçbir derleme sistemi, makine donanımına uygulanan temel fizik yasalarının üstesinden gelemez. Bu işi yapmanın tek yolu, sistem tarafından yapılan iş birimlerinin rastgele ve ölçeklenebilir sayıda makineye yayıldığı dağıtılmış derlemeleri destekleyen bir derleme sistemidir. Sistemin çalışmasını yeterince küçük birimlere ayırdığımızı varsayarsak (daha sonra buna daha ayrıntılı değineceğiz) bu, her büyüklükteki her türlü derlemeyi ödemek istediğimiz kadar hızlı bir şekilde tamamlamamıza olanak tanır. Bu ölçeklenebilirlik, yapı tabanlı bir derleme sistemi tanımlayarak üzerinde çalıştığımız en önemli hedeftir.

Uzaktan önbelleğe alma

Dağıtılmış derlemenin en basit türü, yalnızca uzaktan önbelleğe alma özelliğinden yararlanan türdedir ve Şekil 1'de gösterilmiştir.

Uzaktan önbelleğe alma özellikli dağıtılmış derleme

Şekil 1. Uzaktan önbelleğe almayı gösteren dağıtılmış derleme

Hem geliştirici iş istasyonları hem de sürekli entegrasyon sistemleri dahil, derleme işlemleri yapan her sistem, yaygın bir uzak önbellek hizmetine bir referans paylaşır. Bu hizmet, Redis gibi hızlı ve yerel bir kısa süreli depolama sistemi veya Google Cloud Storage gibi bir bulut hizmeti olabilir. Kullanıcının doğrudan veya bağımlılık olarak bir yapı derlemesi gerektiğinde sistem öncelikle uzak önbelleği kontrol ederek bu yapının zaten mevcut olup olmadığını kontrol eder. Böyle bir durumda yapı, derlemek yerine indirilebilir. Aksi takdirde, sistem yapıyı oluşturur ve sonucu tekrar önbelleğe yükler. Bu, çok sık değişmeyen düşük seviyeli bağımlılıkların her kullanıcı tarafından yeniden oluşturulması yerine bir kez oluşturulup kullanıcılar arasında paylaşılabileceği anlamına gelir. Google'da birçok yapı, sıfırdan derlemek yerine önbellekten sunulur. Bu durum, derleme sistemimizi çalıştırma maliyetini büyük ölçüde azaltır.

Uzaktan önbelleğe alma sisteminin çalışması için derleme sisteminin, derlemelerin tamamen yeniden üretilebilir olduğunu garanti etmesi gerekir. Diğer bir deyişle, her derleme hedefi için o hedefin giriş kümesini belirlemek mümkün olmalıdır. Böylece, aynı giriş kümesi herhangi bir makinede tam olarak aynı çıktıyı üretir. Bir yapıyı indirmenin sonuçlarının o yapıyı kendisinin indirme sonuçlarıyla aynı olmasını sağlamanın tek yolu budur. Bu, önbellekteki her bir yapının hem hedefine hem de girişlerinin bir karmasına anahtarlandırılması gerektiğini unutmayın. Böylece, farklı mühendisler aynı hedef üzerinde aynı anda farklı değişiklikler yapabilir ve uzak önbellek, ortaya çıkan tüm yapıları depolar ve bunları çakışma olmadan uygun şekilde sunar.

Uzak önbellekten fayda sağlayabilmek için bir yapıyı indirme işlemi, yapıyı derlemekten daha hızlı olmalıdır. Özellikle önbellek sunucusu, derlemeyi yapan makineden uzaktaysa bu durum her zaman geçerli değildir. Google’ın ağı ve derleme sistemi, derleme sonuçlarını hızlı bir şekilde paylaşabilmek için dikkatli bir şekilde ayarlanmıştır.

Uzaktan yürütme

Uzaktan önbelleğe alma, gerçek bir şekilde dağıtılmış bir derleme değildir. Önbellek kaybolursa veya her şeyin yeniden oluşturulmasını gerektiren alt düzey bir değişiklik yaparsanız derlemenin tamamını makinenizde yerel olarak gerçekleştirmeniz gerekir. Gerçek hedef, derlemeyi yapmanın asıl işinin herhangi bir çalışana yayılabileceği uzaktan yürütmeyi desteklemektir. Şekil 2'de bir uzaktan yürütme sistemi gösterilmektedir.

Uzaktan yürütme sistemi

2. Şekil. Uzaktan yürütme sistemi

Her kullanıcının makinesinde çalışan derleme aracı (kullanıcıların insan mühendisi veya otomatik derleme sistemi olduğu durumlarda), istekleri merkezi bir derleme ana sistemine gönderir. Derleme ana sistemi, istekleri bileşen işlemlerine ayırır ve bu işlemlerin ölçeklenebilir bir çalışan havuzu üzerinden yürütülmesini planlar. Her çalışan, istediği işlemleri kullanıcı tarafından belirtilen girişlerle gerçekleştirir ve ortaya çıkan yapıları yazar. Bu yapılar, nihai çıktı oluşturulup kullanıcıya gönderilene kadar gerekli işlemleri yürüten diğer makinelerde paylaşılır.

Böyle bir sistemi uygulamanın en zor kısmı çalışanlar, ana makine ve kullanıcının yerel makinesi arasındaki iletişimi yönetmektir. Çalışanlar, diğer çalışanlar tarafından üretilen ara yapılara bağlı olabilir ve nihai çıkışın kullanıcının yerel makinesine geri gönderilmesi gerekir. Bunu yapmak için her çalışanın sonuçlarını önbelleğe yazmasını ve bağımlılıklarını önbellekten okumasını sağlayarak daha önce açıklanan dağıtılmış önbelleğin üzerine inşa edebiliriz. Ana makine, çalışanların bağlı oldukları her şey bitene kadar ilerlemelerini engeller. Bu durumda, çalışanlar girdilerini önbellekten okuyabilirler. Nihai ürün de önbelleğe alınır ve yerel makinenin ürünü indirmesine olanak tanır. Çalışanların derleme işleminden önce bu değişiklikleri uygulayabilmesi için kullanıcının kaynak ağacındaki yerel değişiklikleri dışa aktarmak için ayrı bir yönteme ihtiyacımız olduğunu da unutmayın.

Bunun işe yaraması için daha önce açıklanan yapı tabanlı derleme sistemlerinin tüm parçalarının bir araya getirilmesi gerekir. Derleme ortamlarının tamamen kendi kendini tanımlayan nitelikte olması gerekir. Böylece, çalışanları insan müdahalesi olmadan geliştirebiliriz. Her adım farklı bir makinede yürütülebileceği için derleme işlemlerinin kendisi tamamen bağımsız olmalıdır. Her çalışanın diğer çalışanlardan aldığı sonuçlara güvenebilmesi için çıkışların tamamen deterministik olması gerekir. Bu tür garantileri görev tabanlı bir sistem için sağlamak son derece zordur. Bu da, tek bir sistem üzerine güvenilir bir uzaktan yürütme sistemi oluşturmayı neredeyse imkansız hale getirir.

Google'da dağıtılmış derlemeler

Google, 2008'den beri hem uzaktan önbelleğe almayı hem de uzaktan yürütmeyi içeren dağıtılmış bir derleme sistemi kullanmaktadır. Şekil 3'te gösterilmiştir.

Üst seviye derleme sistemi

3. Şekil. Google'ın dağıtılmış derleme sistemi

Google'ın uzak önbelleğine ObjFS adı verilir. Derleme çıkışlarını üretim makinelerimiz filomuza dağılmış Bigtable'larda depolayan bir arka uçtan ve her geliştiricinin makinesinde çalışan objfsd adlı bir ön uç FUSE arka plandan oluşur. FUSE arka plan programı, mühendislerin derleme çıkışlarına sanki iş istasyonunda depolanan normal dosyalarmış gibi göz atmasına olanak tanırken, dosya içeriği yalnızca doğrudan kullanıcı tarafından istenen birkaç dosya için isteğe bağlı olarak indirilir. Dosya içeriklerini isteğe bağlı olarak sunmak hem ağ hem de disk kullanımını büyük ölçüde azaltır ve sistem, tüm derleme çıktılarını geliştiricinin yerel diskinde depoladığımız zamana kıyasla iki kat daha hızlı derleme yapabilir.

Google'ın uzaktan yürütme sisteminin adı Forge. Blaze'de (Bazel'in dahili eşdeğeri) Distribütör adı verilen bir Forge istemcisi, her işlem için Scheduler adı verilen veri merkezlerimizde çalışan bir işe her işlem için istek gönderir. Scheduler, işlem sonuçlarının bir önbellekte olmasını sağlar. Böylece, işlem sistemdeki başka bir kullanıcı tarafından oluşturulmuşsa anında yanıt döndürmesini sağlar. Aksi takdirde işlem sıraya alınır. Yürütücü işlerinden oluşan büyük bir havuz, bu sıradaki işlemleri sürekli olarak okur, yürütür ve sonuçları doğrudan ObjFS Bigtable'larında depolar. Bu sonuçlar, yürütücülere gelecekteki işlemler için sunulur veya son kullanıcı tarafından objfsd aracılığıyla indirilebilir.

Sonuç olarak Google'da gerçekleştirilen tüm derlemeleri verimli bir şekilde desteklemek için ölçeklendirme yapan bir sistem elde edilir. Google'ın derlemelerinin ölçeği gerçekten muazzam: Google her gün milyonlarca test durumu yürüten ve milyarlarca kaynak kod satırından petabaytlarca derleme çıkışı üretiyor. Böyle bir sistem, mühendislerimizin karmaşık kod tabanlarını hızlı bir şekilde derlemesini sağlamakla kalmaz, aynı zamanda derlememize dayalı çok sayıda otomatik araç ve sistem uygulamamıza da olanak tanır.