EYDefterEmre Yakut
← tüm yazılar
Protokol · Sistem · derin

Diski gezme, defterini oku — ve kendi masamı toplayan iki araç

Disk analiz aracı yazdım. Klasör klasör gezerek 1,4 milyon dosyayı taramak dokuz dakika sürüyordu. NTFS zaten hepsinin kaydını tek bir tabloda tutuyor.

klasör klasör gezmekC:\ Users\ emrey\ Documents\ … …1.4 M dosya · ~9 dk · disk sürekli arıyor$MFT’i doğrudan okumakFILE0 #1024 $STANDARD_INFOFILE0 #1031 $FILE_NAMEFILE0 #1038 $DATAFILE0 #1045 $FILE_NAMEFILE0 #1052 $DATAaynı 1.4 M dosya · 11 sn · tek sıralı okumaNTFS zaten her dosyanın kaydını tek bir tabloda tutuyor — sormak yerine tabloyu oku

Eylül başında bir sabah şunu fark ettim: müşterilere düzen kuran sistemler yazıyorum ve kendi çalışma ortamım dağınık. Disk sürekli kırmızı, gelen kutusunda üç yüz okunmamış mail, aynı belgenin üç kopyası.

İkisini de araca çevirdim.

Disk: klasör gezmek neden yavaş

Klasik yaklaşım özyinelemeli dizin gezinme: kök klasörü listele, her alt klasöre gir, tekrarla.

C:\               → 34 girdi
  Users\          → 8 girdi
    emrey\        → 91 girdi
      Documents\  → 1.204 girdi
        …

Her klasör ayrı bir sistem çağrısı. Her çağrı diskte başka bir yere gidiyor. 1,4 milyon dosya için bu, yüz binlerce küçük ve dağınık okuma demek.

Ölçtüm: 9 dakika 12 saniye.

Ama NTFS zaten defter tutuyor

Sonra bariz olanı hatırladım: NTFS bütün bu bilgiyi zaten tek bir yerde tutuyor. Adı $MFT — ana dosya tablosu. Diskteki her dosya ve klasörün burada sabit boyutlu bir kaydı var:

FILE0  #128934
  $STANDARD_INFORMATION   oluşturma, değiştirme, erişim, öznitelikler
  $FILE_NAME              ad + üst klasörün kayıt numarası
  $DATA                   ya içeriğin kendisi ya da diskteki yerleri
güzel bir ayrıntı

Çok küçük bir dosyanın içeriği $DATA özniteliğinin içinde durur — ayrıca disk alanı ayrılmaz. Bu yüzden binlerce küçücük dosya, boyutlarının toplamından az yer kaplayabilir. Tersi de doğru: her dosya en az bir kayıt tüketir, yani bir baytlık dosya bile bedava değildir.

Ağacı kurmak

Bir kayıt kendi tam yolunu bilmiyor. Bildiği tek şey üst klasörünün kayıt numarası. Bu aslında bir kolaylık:

1. $MFT'i sıralı oku          → tek büyük okuma, disk mutlu
2. kayıtları numaraya göre indeksle
3. her dosya için üst zincirini yürü:
     128934 → 4102 → 91 → 5 (kök)
     "Documents\proje\rapor.pdf"

Sonuç: 11 saniye. Kırk kat hızlanma. Ve fark bir algoritma zekâsından gelmiyor — aynı veri, aynı disk. Tek fark: parça parça sormak yerine bütünü bir kez okumak.

Bedeli var: yönetici yetkisi gerekiyor, yalnız NTFS’te çalışıyor (eski yöntem yedek olarak duruyor), ve okuma sürerken dosyalar değişebiliyor. On bir saniyelik pencerede bu kabul edilebilir; bir yedekleme aracı için olmazdı.

Hızlanınca ürün değişti

Beklemediğim şey: araç hızlanınca ne işe yaradığı değişti.

Dokuz dakika süren bir tarama, ayda bir çalıştırdığın bir şey. On bir saniye süren bir tarama, merak ettiğinde açtığın bir şey.

Ve sık çalıştırılabilir olunca yeni bir soru mümkün oldu: dün ile bugün arasındaki fark ne? “Bu klasör 40 GB” bilgisi işe yaramıyor — orası hep 40 GB’dı. “Bu klasör dün 2 GB’dı” doğrudan eyleme dönüşüyor.

Çünkü asıl soru “ne büyük?” değil, “ne büyüyor?”

İkinci araç: gelen kutusu

Gelen kutusu sorununun özü “çok mail” değil. Hangisinin hâlâ açık olduğunun belirsizliği.

Üç yüz mailin büyük kısmı zaten bitmiş işler. Ama kapandığını görmek için her birini açman gerekiyor.

Araç konuşmaları takip ediyor ve şunu soruyor: bu konuşmanın son mesajı kimden ve ne tür?

son mesajdurum
Benden, soru içeriyorkarşı tarafta — bekliyorum
Onlardan, soru içeriyorbende — cevap gerekiyor
Onlardan, teşekkür/onaykapandı
Otomatik üretilmişkapandı

Dördüncü satır beklediğimden büyük çıktı: otomatik yanıtlar, sistem bildirimleri, bültenler — gelen kutusunun üçte birinden fazlası.

Bunları tespit etmek göründüğünden zor. Konu satırında kalıp aramak yetmiyor; bazı başlıklar çok daha güvenilir. İkisi birlikte kullanılınca yanlış pozitif neredeyse sıfıra iniyor.

Sonuç: 300 mail, gerçekten cevap bekleyen 19 konuşmaya indi.

Neden tek kullanıcılı araçlar iyi okul

İkisinin ortak özelliği: kullanıcı sayısı bir, ve o kullanıcı ben.

  • Gereksinim tartışması yok. Ne istediğimi biliyorum, çünkü eksikliğini ben çekiyorum.
  • Geri bildirim anında. Kötü bir karar aynı gün canımı yakıyor, üç ay sonra bir destek talebinde değil.
  • Kapsam kendiliğinden dar. “Ya şunu da isteyen olursa” diye bir soru yok.
  • Bitirme baskısı gerçek. Yarım kalan araç kendi işimi görmüyor.
bir otomasyon kuralı

Kendi dosyalarını yöneten bir araç yazıyorsan, yaptığı her işlem geri alınabilir olmalı. Silme değil taşıma, ve mutlaka bir kayıt. Aracın bir gün yanlış bir kural uygulayacağını baştan varsay; soru “olur mu” değil, “olduğunda ne kaybederim”.

Ve beklenmedik bir ek

Disk aracına sonradan bir “çalışmalar kataloğu” ekledim: diskteki proje klasörlerini bulup son değişiklik tarihleriyle listeliyor.

Yazma sebebim komikti — kaç proje olduğunu unutmuştum. Liste çıkınca yüzüme baktı: bu yıl ne kadar çok şeye başlamışım.

Bu defterin fikri de oradan çıktı.

Ne öğrendim

Bir sistem senin sorduğun soruyu zaten cevaplamış olabilir. İş, cevabı yeniden üretmek değil, nerede durduğunu bulmak.

Ve “buna zamanım yok” cümlesi, çoğu zaman düzeltmemenin maliyetini hiç hesaplamadan kuruluyor. İki araç bir hafta sürdü; kazandırdıkları günde yirmi dakika. Bir ayda başa baş.

Asıl kazanç zaman da değil: dikkat. Dolu bir disk ya da üç yüz okunmamış mail, sürekli arka planda bir yük taşıtıyor.

ProtokolSistem