System Design 1: Back of The Envelope Estimation
Perkiraan Kasar (Back of The Envelope Estimation)
Pendahuluan
Dalam system design interview, terkadang Anda diminta untuk memperkirakan kapasitas atau kebutuhan performa sistem menggunakan pendekatan perkiraan kasar (back-of-the-envelope estimation).
Menurut Jeff Dean, Google Senior Fellow, “Perkiraan kasar adalah estimasi yang dibuat menggunakan kombinasi of thought experiments & common performance numbers untuk mendapatkan gambaran awal mengenai desain mana yang akan memenuhi kebutuhan Anda.”
Anda dapat melakukan perkiraan kasar secara efektif, Anda perlu memahami dasar-dasar skalabilitas dengan baik. Beberapa konsep penting yang harus Anda kuasai meliputi:
Konsep pangkat dua (power of two)
Angka latensi yang wajib diketahui setiap programmer
Angka ketersediaan sistem (availability numbers)
Pemahaman yang kuat tentang konsep-konsep ini akan membantu Anda membuat estimasi yang lebih akurat dalam merancang sistem yang efisien dan dapat diskalakan.
Konsep Pangkat Dua dalam Volume Data
Saat bekerja dengan sistem terdistribusi, volume data bisa menjadi sangat besar. Namun, semua perhitungan tetap kembali pada dasar-dasarnya. Untuk mendapatkan perhitungan yang akurat, sangat penting untuk memahami satuan volume data yang menggunakan pangkat dua.
Dalam sistem komputasi:
1 byte terdiri dari 8 bit.
Satu karakter ASCII menggunakan 1 byte memori (8 bit).
Tabel berikut menjelaskan satuan volume data berdasarkan pangkat dua:
10 (2^10)
1 Ribu
1 Kilobyte
1 KB
20 (2^20)
1 Juta
1 Megabyte
1 MB
30 (2^30)
1 Miliar
1 Gigabyte
1 GB
40 (2^40)
1 Triliun
1 Terabyte
1 TB
50 (2^50)
1 Kuadriliun
1 Petabyte
1 PB
Contoh 1: Konversi Ukuran Data Menggunakan Pangkat Dua
Misalkan kita ingin mengonversi 2^30 byte ke satuan yang lebih besar.
Dari tabel, kita tahu bahwa 2^30 byte = 1 Gigabyte (GB).
Jadi, 2 × 2^30 byte = 2 GB.
Jika kita memiliki 8 × 2^30 byte, itu berarti 8 GB.
Contoh 2: Perhitungan Penyimpanan Berdasarkan Pangkat Dua
Misalkan sebuah sistem harus menyimpan 1 miliar file, dan setiap file berukuran 1 KB.
Perhitungan:
Dari tabel, kita tahu bahwa 1 KB = 2^10 byte.
Jika ada 1 miliar file (10^9 file), maka total ukuran penyimpanan adalah:
1 miliar × 2^10 byte= 10^9 × 2^10 byte
Konversi ke satuan yang lebih besar:
10^9 ≈ 2^30 (karena 1 miliar ≈ 2^30)
Jadi, 2^30 × 2^10 = 2^40 byte = 1 Terabyte (TB).
Maka total penyimpanan yang dibutuhkan adalah 1 TB.
Contoh 3: Perhitungan Bandwidth Menggunakan Pangkat Dua
Misalkan kita ingin menghitung bandwidth yang dibutuhkan untuk mentransfer 10 Terabyte (TB) data dalam 1 jam.
Perhitungan:
Dari tabel, 1 TB = 2^40 byte.
Jika ada 10 TB, maka total byte yang ditransfer adalah:
10 × 2^40 byte = 10 × 1,099,511,627,776 byte
Konversi ke bit (karena bandwidth biasanya dihitung dalam bit):
1 byte = 8 bit, maka:
10 * 2^40 * 8 = 10 * 2^40 * 2^3 = 10 × 2^43 bit
Waktu transfer = 1 jam = 3600 detik, jadi bandwidth per detik adalah:
(10 × 2^43 bit) / 3600 detik
Perkiraan hasilnya sekitar 22.2 Gbps.
Jadi, untuk mentransfer 10 TB data dalam 1 jam, kita membutuhkan koneksi dengan bandwidth sekitar 22.2 Gbps.
Pemahaman konsep ini sangat berguna dalam memperkirakan kapasitas penyimpanan, kebutuhan bandwidth, dan performa sistem dalam skala besar.
Angka latensi yang harus diketahui setiap programmer
Dr. Dean dari Google mengungkapkan durasi berbagai operasi komputer khas pada tahun 2010. Beberapa angka mungkin sudah usang seiring dengan semakin cepat dan kuatnya komputer. Namun, angka-angka tersebut masih dapat memberikan gambaran tentang kecepatan dan kelambatan berbagai operasi komputer.
Berikut adalah tabel latensi berdasarkan gambar yang Anda berikan:
Referensi cache L1
0,5 ns
Mispredict cabang (branch mispredict)
5 ns
Referensi cache L2
7 ns
Mutex lock/unlock
100 ns
Referensi memori utama
100 ns
Kompres 1 KB dengan Zippy
10.000 ns = 10 µs
Kirim 2K byte melalui jaringan 1 Gbps
20.000 ns = 20 µs
Baca 1 MB secara berurutan dari memori
250.000 ns = 250 µs
Round trip dalam satu pusat data
500.000 ns = 500 µs
Pencarian disk (disk seek)
10.000.000 ns = 10 ms
Baca 1 MB secara berurutan dari jaringan
10.000.000 ns = 10 ms
Baca 1 MB secara berurutan dari disk
30.000.000 ns = 30 ms
Kirim paket dari California -> Belanda -> California
150.000.000 ns = 150 ms
Keterangan:
ns = nanosecond (1 ns = 10⁻⁹ detik)
µs = microsecond (1 µs = 10⁻⁶ detik = 1.000 ns)
ms = millisecond (1 ms = 10⁻³ detik = 1.000 µs = 1.000.000 ns)
Tabel ini menunjukkan estimasi waktu yang dibutuhkan untuk berbagai operasi dalam sistem komputer, memberikan gambaran seberapa cepat atau lambat setiap operasi berlangsung.
Berikut beberapa contoh penggunaan angka dari tabel untuk memahami performa sistem.
Contoh 1: Perbandingan Latensi L1 Cache vs. Main Memory
L1 cache reference: 0.5 ns
Main memory reference: 100 ns
Perbandingan:
100 ns / 0.5 ns = 200
👉 Akses L1 cache 200x lebih cepat dibandingkan akses main memory (RAM).
Contoh 2: Membaca 10 MB dari Disk vs. Memori
Misalkan kita ingin membaca 10 MB data dari disk dan RAM:
Baca 1 MB dari disk = 30 ms
Baca 1 MB dari RAM = 250 µs = 0.25 ms
Untuk 10 MB:
Dari disk: 10×30 = 300 ms
Dari RAM: 10×0.25 = 2.5 ms
👉 Membaca 10 MB dari RAM 120x lebih cepat dibandingkan dari disk.
Contoh 3: Membandingkan Latensi Jaringan Lokal vs. Internasional
Round trip dalam satu data center = 500 µs = 0.5 ms
Packet dari California ke Belanda (dan kembali) = 150 ms
Perbandingan:
150 ms / 0.5 ms = 300
👉 Latensi jaringan internasional 300x lebih lambat dibandingkan komunikasi dalam satu data center.
Kesimpulan
💡 Cache jauh lebih cepat dibandingkan RAM, RAM jauh lebih cepat dibandingkan disk. 💡 Jaringan lokal dalam data center jauh lebih cepat dibandingkan jaringan global. 💡 Pemahaman angka-angka ini membantu dalam optimasi performa aplikasi.
Angka Ketersediaan
Ketersediaan tinggi (High availability) adalah kemampuan suatu sistem untuk tetap beroperasi secara terus-menerus dalam jangka waktu yang diinginkan. Ketersediaan tinggi diukur dalam bentuk persentase, dengan 100% berarti layanan yang tidak mengalami downtime sama sekali. Sebagian besar layanan memiliki tingkat ketersediaan antara 99% hingga 100%.
Service Level Agreement (SLA) adalah istilah yang umum digunakan oleh penyedia layanan. Ini adalah perjanjian antara Anda (penyedia layanan) dan pelanggan Anda, yang secara resmi mendefinisikan tingkat uptime yang akan diberikan oleh layanan Anda. Penyedia cloud seperti Amazon, Google, dan Microsoft menetapkan SLA mereka pada tingkat 99,9% atau lebih tinggi.
Uptime biasanya diukur dalam jumlah angka sembilan (nines). Semakin banyak angka sembilan, semakin baik ketersediaannya. Seperti yang ditunjukkan dalam Tabel 2-3, semakin tinggi angka sembilan, semakin sedikit waktu downtime yang diharapkan dalam satu tahun.
Tabel Ketersediaan dan Downtime
Ketersediaan (%)
Downtime per Hari
Downtime per Tahun
99%
14,40 menit
3,65 hari
99.9%
1,44 menit
8,77 jam
99.99%
8,64 detik
52,60 menit
99.999%
864,00 milidetik
5,26 menit
99.9999%
86,40 milidetik
31,56 detik
Misalkan sebuah layanan memiliki SLA 99.99%. Kita ingin mengetahui berapa lama downtime yang dapat diterima dalam satu bulan.
Dari tabel, downtime per tahun untuk 99.99% adalah 52,60 menit.
Dalam satu tahun ada 12 bulan, jadi downtime per bulan adalah:
52.60 menit / 12 = 4.38 menit
Jadi, layanan dengan 99.99% uptime dapat mengalami downtime maksimal 4.38 menit per bulan.
Studi Kasus
Contoh: Estimasi QPS Twitter dan Kebutuhan Penyimpanan
Catatan: Angka-angka berikut hanya digunakan untuk latihan dan bukan angka sebenarnya dari Twitter.
Asumsi:
300 juta pengguna aktif bulanan.
50% pengguna menggunakan Twitter setiap hari.
Setiap pengguna rata-rata memposting 2 tweet per hari.
10% dari tweet berisi media (gambar/video).
Data disimpan selama 5 tahun.
Estimasi Perhitungan
Estimasi Query Per Second (QPS)
Kita menghitung jumlah Daily Active Users (DAU) dan estimasi QPS berdasarkan jumlah tweet yang diposting:
Pengguna aktif harian (DAU):
300 juta × 50% = 150 juta pengguna
Estimasi QPS rata-rata:
150 juta × 2 tweet / (24 jam×3600 detik) = 300 juta / 86400 ≈ 3500 QPS
Perkiraan Peak QPS (lonjakan trafik):
Pada jam sibuk, beban bisa meningkat hingga 2 kali lipat dari rata-rata.
2 × 3500 = 7000 QPS
Estimasi Penyimpanan Media
Karena media hanya terdapat pada 10% dari total tweet, kita hanya menghitung kebutuhan penyimpanan media.
Rata-rata ukuran satu tweet (tanpa media):
tweet_id
: 64 bytestext
: 140 bytesTotal (tanpa media): 204 bytes
Rata-rata ukuran media: 1 MB per tweet dengan media
Penyimpanan media harian:
150 juta × 2 tweet × 10% × 1 MB = 30 TB per hari
Penyimpanan media selama 5 tahun:
30 TB × 365 × 5 = 54,75 ≈ 55 PB
Tips untuk Menguasai Perhitungan
Gunakan Pembulatan & Perkiraan
Saat wawancara, hindari perhitungan yang rumit.
Misalnya, daripada menghitung 99987 / 9.1, sederhanakan menjadi 100.000 / 10.
Tulis Asumsi dengan Jelas
Pastikan setiap angka yang digunakan memiliki konteks yang jelas.
Contoh: “Pengguna aktif harian adalah 50% dari total pengguna bulanan.”
Gunakan Satuan dengan Jelas
Saat menulis angka, tambahkan satuan (misal 5 MB, bukan hanya 5).
Ini mencegah kebingungan antara MB, GB, atau unit lainnya.
Latih Perhitungan Sejenis
Biasanya yang sering ditanyakan dalam wawancara meliputi:
QPS (Query per second)
Peak QPS
Kebutuhan penyimpanan
Cache
Jumlah server
Berlatih dengan berbagai skenario akan membantu meningkatkan kecepatan berpikir.
Last updated