Alkisah, seorang temen mengirimkan pesan privat lewat Facebook dan menanyakan masalah squid proxy yang secara diam-diam mencuri bandwidth, padahal tidak ada klien yang sedang browsing massal atau mendownload file besar secara bersamaan. Bandwidth public downstream yang terpakai sebesar 15 megabits, tapi yang nyampe ke klien hanya 7 sampai 9 megabits. Nah loe, kok bisa ada “pencurian” bandwidth seperti ini? Selidik punya selidik ternyata hal ini disebabkan oleh implementasi konfigurasi squid yang tidak sesuai. Berikut ulasan studi kasus squid proxy range_offset_limit.
Studi konfigurasi
Teman saya tersebut menerangkan sebelum kasus tersebut terjadi dia menambahkan tag konfigurasi baru didalam squid.conf
range_offset_limit 768 Mb
Sepengetahuan saya, tag range_offset_limit biasanya digunakan untuk ujicoba caching object yang bersifat partial content (HTTP 206). Saya pribadi terus terang belum pernah mencoba hal ini (mencoba caching object partial content), karena secara resmi developer squid sendiri menyatakan bahwa squid tidak memungkinkan untuk melakukan caching terhadap range response atau partial content. Partial content bisa di cache tapi dengan bantuan aplikasi tambahan.
Default-nya squid menggunakan range_offset_limit 0
Apa tujuan range_offset_limit yang nilainya gede
Saat squid diatur menggunakan range_offset_limit 768 Mb, maka request ke server tujuan akan dibatasi menjadi 1 koneksi saja sampai file yang di download mencapai 768 Mb – selama proses tersebut berlangsung, request RANGE untuk mendownload file yang sama menjadi sulit atau tidak bisa dilakukan.
Contoh sederhananya, saat user mendownload sebuah file dengan download manager (IDM, FlashGet, dsb) maka file tersebut hanya akan di download dengan single thread/single connection alias koneksi tunggal. Nggak bisa di split/dibagi-bagi atau dipecah sebagaimana kebiasaan download manager pada umumnya yang mencoba mendownload file dengan ukuran besar (misalnya lebih dari 100 Mb) menggunakan beberapa koneksi/thread secara simultan atau terus menerus.
Jadi, range_offset_limit yang nilainya gede diharapkan bisa “menghambat” kinerja download manager dengan membatasi download hanya dengan 1 koneksi/thread. Dan benar saja, jika mendownload file berukuran besar dengan download manager, maka download manager hanya akan menggunakan 1 koneksi untuk mendownload file tersebut. Jika ada koneksi tambahan maka squid akan mengirimkan pesan bahwa koneksi tambahan menuju server asal download tidak dapat dilakukan.
Apa yang terjadi selanjutnya?
Sesuatu yang buruk terjadi. Squid secara diam-diam mengambil bandwidth dengan jumlah yang cukup besar. Jumlah bandwidth yang masuk kedalam squid lebih besar daripada yang disampaikan ke klien. Bagaimana hal ini bisa terjadi? Setelah menelaah lebih dalam ternyata range_offset_limit inilah penyebabnya.
Silakan buka spoiler berikut untuk mengetahui lebih lanjut tentang range_offset_limit
range_offset_limit mengatur sejauh mana squid akan mengirimkan permintaan Range sebelum squid mendownload keseluruhan file. Jika batas ini terlewati, maka squid akan mengirimkan request range dan hasilnya object tersebut tidak akan dicache.
range_offset_limit bisa memiliki nilai dalam satuan ukuran file (misalnya 17 Mb), -1, dan 0. Jika di set -1 maka squid akan mendowload keseluruhan file dari awal sampai selesai sehingga ada kemungkinan file tersebut masuk cache, sedangkan jika di set 0 (default) maka squid tidak akan mendownload lebih dari apa yg di minta klien.
Efek range_offset_limit yang memiliki nilai sangat tinggi atau -1 adalah squid akan memaksa download akan diteruskan sampai nilainya tercapai (misalnya 17 Mb), sedangkan jika nilainya -1, maka squid akan menyelesaikan download object yang diminta sampai selesai walaupun klien membatalkan download file yang bersangkutan.
Nah, bayangkan jika klien-klien yang dilayani squid sedang mendownload patch game berukuran besar, kemudian patchernya ditutup.
Ada klien-klien sedang buka video-video di Tube8 kemudian menutup browsernya dengan tiba-tiba. :D
Ada klien lain yang lihat video youtube tapi videonya belom kelar selesai di didownload, dia udah buka beberapa video lainnya.
Dan bayangkan, jika klien-klien seperti ini jumlahnya banyak (seperti pada lingkungan jaringan RT/RW).
Sudah pasti bandwidth anda akan terkuras oleh squid yang berusaha menyelesaikan semua download tersebut! :)
Penyelesaian masalah
range_offset_limit sebaiknya disesuaikan dengan tujuan anda melakukan web caching menggunakan squid. Hitung dengan cermat berapa nilainya selaras dengan jumlah bandwidth dan jumlah klien yang dilayani oleh squid. Jangan memberikan nilai terlalu besar atau memberikan nilai -1 karena sama saja anda melakukan bunuh diri. Hehehehe…
Kesimpulan
range_offset_limit pada ujicoba caching partial content (HTTP 206) biasanya diberi nilai -1, dan dalam hal ini sangat potensial terjadi konsumsi bandwidth dalam jumlah besar apalagi kalo klien yang dilayani squid jumlahnya banyak dan aktif dalam melakukan aktivitas download atau streaming. Berilah nilai ideal namun tidak terlalu besar untuk memperbesar kesempatan object-object tertentu agar dapat di cache lebih efisien dan efektif.
Bahan Bacaan