Destekle iletişim

E-postayla, genellikle iki gün içinde yanıt veririz.

Google reCAPTCHA, kötüye kullanıma karşı bu gönderimi denetler; bu sırada veriler Google'a aktarılır. Komut dosyası yalnızca bu form açıldığında yüklenir.

← Tüm yazılar

Tüm lib/ dizinini yüklemenin gerçek bedeli

Bu hizmetin tek giriş dosyasının 46. satırı:

foreach (glob(__DIR__ . '/lib/*.php') as $f) { require_once $f; }

Bu, her istekte yüklenen 65 dosya ve 1,5 megabayt demek. Bir sayaç görseli, bir istatistik sayfası, bir 404 — hepsi aynı. Dün bu 20.734 kez oldu.

26 sayaç tasarım ailesi — 715 KB, biri kullanılıyor bayraklar 189 KB · grafikler 158 KB · diğer her şey 470 KB soğuk, opcode önbelleği yok: 132 ms opcode'lar diskte önbellekli: 18,2 ms opcode'lar paylaşılan bellekte: 0,33 ms — glob ve 65 stat çağrısı 65 dosya, 1,5 MB, 56 sınıf, her istekte

Önemli olan küçük sayı

Opcode önbelleği kapalıyken hepsini sıfırdan yüklemek yaklaşık 132 milisaniye sürüyor. Bunu bir soruna dönüştürecek sayı bu olurdu, ama sunucunun ödediği sayı bu değil.

Opcode'lar önceden derlenip paylaşılan bellekte tutulduğunda geriye, dizin listesi ve zaman damgası doğrulaması açık olduğu için dosya başına bir stat() çağrısı kalıyor: 0,33 milisaniye. Dünkü trafikle bu, bütün gün boyunca yedi saniyeden az iş demek.

İkisinin arasında üçüncü bir ölçüm duruyor: opcode önbelleği bellek yerine diskten okurken alınan 18,2 milisaniye. Bu gerçek değer değil, bir üst sınır — önbellek var ama gerçeğinden daha yavaş olduğunda olan şey bu. Komut satırından ölçülebilen tek sıcak sayı bu olduğu için raporlanıyor; aksini iddia etmek kolay bir hata olurdu.

Yani bunun maliyeti neredeyse sıfır ve neredeyse sıfır olması tamamen başka bir şey sayesinde. Opcode önbelleğini kapatın, aynı satır dört yüz kat pahalıya gelir. Bu gerçek bir bağımlılık ve onu bir yükseltme sırasında keşfetmek yerine var olduğunu önceden bilmekte fayda var.

1,5 megabaytın içinde gerçekte ne var

Yüzde kırk yedisi — 26 dosyaya yayılmış 715 kilobayt — sayaç tasarım aileleri. Bir sayaç görseli çizmek için bunlardan tam olarak biri gerekiyor. Diğer 25'i yükleniyor, tanımlanıyor ve onlara hiç dokunulmuyor.

Ardından: coğrafya sayfasında gereken 189 kilobayt bayrak verisi; bir şey grafik çizdiğinde gereken 158 kilobayt grafik kütüphanesi. İkisinin de, bu hizmetin her şeyden çok yanıtladığı istek olan bir sayaç görselini sunmakla ilgisi yok.

Bunun görünür maliyeti zamandan çok bellek. İstek başına en yüksek bellek kullanımı yaklaşık dört megabayt artıyor ve opcode'ların aksine — ki onlar tüm süreçler arasında paylaşılır — bu kısım istek başına, paralel olarak, her işçi süreç tarafından aynı anda ödeniyor.

Birisi bunu çoktan fark etmiş

Glob ifadesi lib/*.php. Özyinelemeli değil ve hemen altında iki dizin var: lib/live/ 229 kilobayt, lib/recht/ 182 kilobayt. Eskiden yükleme yolunda olan, artık olmayan dört yüz kilobayt.

Büyük oldukları ve nadiren gerektikleri için taşındılar: istatistik bölümleri ve hukuki metinler. Bütün mekanizma, bir dizin daha derinde olmaktan ibaret. Ne yapılandırma var, ne tembel yükleyici, ne de autoload haritası — bir dosya ya glob'un içindedir ya da değildir.

Bu gerçek bir düzeltme ve bunu söylemeye değer, çünkü akla gelen bir sonraki adım bir autoloader olurdu; burada bir autoloader ise, iki kez bir mkdir ile zaten çözülmüş bir sorun için büyük bir değişiklik olurdu.

Neden böyle kalıyor

Tek bir glob, işe yarayabilecek en basit çözüm ve kanıtlara bakılırsa gerçekten işe yarıyor: küçük bir sunucuda, hızlı olması gereken yolda, milisaniyenin üçte biri. Onu dosya başına require satırlarıyla değiştirmek, her yeni dosyanın bir yerde bir satıra ihtiyaç duyması demek; unutulan satır da biraz daha büyük bir yük yerine canlı sistemde ölümcül bir hataya yol açar.

Asıl gereken, bunu en başta katlanılabilir kılan şeyin yazıya dökülmesi: eğer lib/ içindeki bir dosya büyürse, bir alt dizine taşınır ve kullanıldığı yerde require edilir. O iki dizinin izlediği kural buydu ve şimdiye kadar hiçbir yerde yazılı değildi.

İşin genel hâli ölçümden daha sıkıcı. “Her şey her şeyi yükler” genellikle yanlış bir yapıdır ve onu yeniden kurmadan önce neye mal olduğunu ölçmeye değer. Burada maliyeti 0,33 milisaniye ve dört megabayt; izlenmeye değer olan da dört megabayt, çünkü o, eşzamanlılıkla birlikte büyüyor, milisaniyeler ise büyümüyor.

Reklam