Malam Komputer Saya Reboot dengan Sendirinya
Suatu malam, di tengah sebuah pekerjaan yang panjang, seluruh komputer saya mati dengan sendirinya lalu menyala kembali. Bukan programnya — mesinnya. Satu saat sebuah proses sedang berjalan; saat berikutnya saya menatap layar login yang baru, seolah-olah ada yang mencabut kabel daya lalu mencolokkannya kembali.
Saya telah menghabiskan berhari-hari berhati-hati tentang satu sumber daya yang saya yakini penting. Kerusakan itu datang dari yang tak pernah terpikir untuk saya awasi.
Kerusakan tanpa pesan
Bagian yang paling meresahkan adalah betapa sedikitnya yang bisa dibaca. Tidak ada stack trace, tidak ada exception, tidak ada baris log yang menandai akhirnya. Hanya sebuah reboot yang tiba-tiba dan, terkubur di dalam catatan sistem operasi itu sendiri, padanan digital dari sebuah angkat bahu: sistem dimulai ulang tanpa dimatikan dengan bersih.
Bug yang normal meninggalkan jasad. Yang satu ini meninggalkan ruangan kosong. Dan sebuah error tanpa pesan adalah jenis petunjuknya tersendiri — biasanya itu berarti kegagalan terjadi di suatu tempat di bawah program Anda, di sebuah lapisan yang tidak berhenti untuk menjelaskan dirinya sebelum ia menyeret semuanya turun bersamanya.
Saya telah menganggarkan memori yang salah
Saya menjalankan sebuah batch pekerjaan yang sangat besar di GPU, dan saya telah mengukur batch itu dengan saksama — terhadap memori GPU. Saya tahu berapa banyak VRAM yang dimiliki kartu itu, saya tahu kira-kira berapa banyak yang akan dibutuhkan setiap unit pekerjaan, dan saya telah melakukan perhitungan untuk tetap aman di bawah batas atasnya. Sejauh yang saya pikirkan, memori adalah masalah yang sudah terselesaikan.
Itu terselesaikan untuk memori yang salah. VRAM kartu itu baik-baik saja sepanjang waktu; seandainya saya mengawasi meterannya pada saat kerusakan terjadi, ia akan terlihat sangat tenang. Batas atas yang sebenarnya saya tabrak adalah RAM sistem mesin host — memori biasa tempat sisa komputer berjalan — dan saya sama sekali tidak menganggarkan itu, karena dalam model mental saya ia memang bukan kendalanya.
Ke mana perginya RAM host
Mengirim batch pekerjaan yang besar ke sebuah GPU tidaklah gratis di sisi host. Sebelum GPU dapat menjalankan apa pun, pekerjaan itu harus disiapkan, diatur, dan diserahkan melintasi — dan persiapan itu berada di RAM sistem. Setiap bagian dari penyiapan itu sederhana dengan sendirinya. Dikalikan di sepanjang sebuah batch yang cukup besar untuk menjenuhkan GPU, bagian-bagian sederhana itu menumpuk menjadi sesuatu yang sangat besar.
RAM sistem terisi penuh. Sistem operasi melakukan apa yang biasanya ia lakukan ketika memori menipis — ia meluap ke disk, dan kemudian kehabisan itu juga. Tekanan memori yang parah tidak selalu mengumumkan dirinya dengan exception yang bisa ditangkap. Itu bisa berarti sebuah alokasi yang gagal, sebuah proses yang dimatikan, atau seluruh mesin yang menjadi tidak stabil. Mesin saya menjadi tidak stabil cukup parah hingga reboot.
Mengapa saya tak pernah melihatnya datang
Hal yang menjengkelkan jika dilihat ke belakang adalah bahwa saya memang memantau dengan saksama — saya hanya memantau pengukur yang salah. Mata saya tertuju pada GPU, sumber daya yang telah saya optimalkan, saya cemaskan, dan saya merasa pintar tentangnya. Sepanjang waktu, tekanan itu menumpuk di sebuah tempat yang tak ada alasan bagi saya untuk melihatnya, karena saya sudah memutuskan bahwa di situ bukanlah tempat masalahnya berada.
Itu adalah sebuah pola yang kini telah saya saksikan terlalu sering untuk disebut kebetulan: Anda memasang instrumen pada kendala yang sedang Anda pikirkan, dan Anda menjadi buta terhadap yang tidak. Bug itu tidak bersembunyi. Ia duduk di sebuah titik buta yang Anda bangun sendiri, dengan merasa yakin tentang di mana batasnya berada.
Solusinya: harapkan tembok itu, dan mantul darinya
Perbaikannya bukanlah perhitungan yang lebih baik. Itu adalah melepaskan gagasan bahwa saya bisa menghitung ukuran yang aman terlebih dahulu sama sekali. Alih-alih memprediksi secara persis seberapa besar batch yang dapat dilewati mesin itu, saya membiarkan mesin yang memberi tahu saya: coba batch itu, dan jika ia menemui error memori yang dapat dipulihkan, perlakukan itu sebagai sinyal untuk mundur — kurangi beban kerja secara konservatif lalu coba lagi, mengecilkannya hingga ia muat.
Itu adalah sebuah loop kecil yang rendah hati, dan ia jauh lebih tangguh daripada aritmetika hati-hati saya yang mana pun, justru karena ia tidak bergantung pada apakah saya telah memahami setiap biaya tersembunyi terlebih dahulu. Saya tidak lagi perlu tahu persis di mana temboknya berada; untuk error memori yang dapat dipulihkan, prosesnya dapat meraba-raba menuju ukuran yang bisa dipakai pada perangkat keras apa pun yang ia jalankan. Kehabisan di tingkat host seperti malam itu adalah kasus yang lebih sulit — ia tetap membutuhkan batasan dan pemantauan eksternal, bukan sekadar loop coba-ulang.
Asumsi sumber daya itu sunyi sampai ia tak lagi sunyi
Pelajaran yang saya simpan hanya sedikit berkaitan dengan GPU secara khusus. Pelajarannya adalah bahwa asumsi sumber daya itu tak terlihat tepat sampai saat ia menjadi katastrofik. Anda bisa benar persis tentang batas yang sedang Anda bayangkan dan tetap dihancurkan oleh yang tidak Anda bayangkan — dan kegagalan itu, ketika datang, sering kali tiba tanpa penjelasan, karena lapisan yang patah berada di bawah lapisan tempat pesan-pesan error Anda berada.
Maka saya berhenti mencoba untuk tepat tentang sumber daya dan mulai mencoba untuk defensif tentangnya. Ketepatan mengandaikan Anda mengetahui semua biaya. Defensifitas mengandaikan Anda telah melewatkan setidaknya satu. Dalam sebuah sistem yang dimaksudkan untuk berjalan berjam-jam, tanpa pengawasan, pada memori yang tidak sepenuhnya Anda kendalikan, asumsi kedua adalah satu-satunya yang aman.
Sebuah program yang crash meninggalkan Anda sebuah pesan. Sebuah mesin yang reboot meninggalkan Anda sebuah kesunyian. Saya telah belajar memperlakukan kesunyian itu sebagai salah satu hal yang lebih jujur yang pernah dikatakan perangkat keras saya kepada saya: Anda menganggarkan hal yang salah.
— Tidak ada sinyal, tidak ada imbal hasil, bukan nasihat investasi.