Cara Mendapatkan Kinerja Baca Bersamaan yang Baik dari Disk di Windows

Saat bekerja dengan file besar dalam lingkungan multithreaded, mencapai kinerja baca yang optimal dari disk dapat menghadirkan tantangan yang signifikan. Dalam skenario di mana Anda memiliki beberapa thread yang mencoba membaca dari file terpisah secara bersamaan, Anda mungkin mengalami throughput yang buruk akibat kebijakan penjadwalan disk sistem operasi. Postingan ini membahas masalah umum yang dihadapi dan menyajikan strategi untuk meningkatkan kinerja baca disk di Windows.

Masalah: Kendala Kinerja Baca Bersamaan

Bayangkan Anda memiliki dua file besar, masing-masing sekitar 2 GiB, dan dua thread terpisah yang mencoba membacanya secara bersamaan. Alih-alih menikmati peningkatan kinerja, Anda menemukan bahwa kedua thread berkinerja buruk dan mencapai throughput gabungan hanya 2-3 MiB/dtk. Berikut adalah ringkasan situasinya:

  • Pengaturan: Dua thread, masing-masing membaca satu file.
  • Pengamatan: Throughput gabungan yang buruk ketika kedua thread aktif (~2-3 MiB/dtk) dibandingkan dengan kinerja yang jauh lebih baik (~45 MiB/dtk) untuk satu thread.
  • Penyebab yang Dicurigai: Perilaku pencarian disk yang dipengaruhi oleh penjadwal disk Windows, yang menyebabkan pola pembacaan yang tidak efisien.

Memahami Penjadwalan Disk di Windows

Sebelum kita menyelami solusi, sangat penting untuk memahami bagaimana Windows mengelola permintaan I/O disk. Secara historis, Windows menggunakan antrian FIFO (First In, First Out) untuk permintaan disk, di mana permintaan dibagi menjadi blok 64 KB. Ini mengakibatkan:

  • Pencarian Disk yang Sering: Ketika dua thread membaca secara bersamaan, permintaan mereka saling mengganggu, menyebabkan pencarian terus-menerus ke belakang dan ke depan di seluruh disk.
  • Ketidakfleksibelan: Sebelum Windows Vista, hampir tidak ada yang bisa dilakukan oleh pengembang untuk memodifikasi penanganan permintaan disk.

Namun, dengan diperkenalkannya Windows Vista, algoritma penjadwalan disk yang lebih canggih diterapkan, memungkinkan pengelolaan operasi I/O bersamaan yang lebih baik. Ini menimbulkan pertanyaan: Apa yang dapat kita lakukan untuk mengoptimalkan kinerja baca di sistem sebelum Vista atau bahkan di versi yang lebih baru jika masalah tetap ada?

Solusi yang Diusulkan untuk Meningkatkan Kinerja Baca Bersamaan

  1. Kebijakan Akses Disk Buatan Sendiri: Karena Anda tidak dapat memodifikasi kebijakan penjadwalan di versi Windows yang lebih awal, pertimbangkan untuk membuat metode sendiri untuk mengelola akses disk di thread Anda.

    • Contoh Implementasi Kebijakan:
      if (THREAD_A sedang membaca dari disk) {
          tunggu THREAD_A untuk berhenti membaca atau tunggu X ms
      }
      baca selama X ms (atau Y MB)
      berhenti membaca dan periksa status THREAD_A lagi
      

    Kebijakan ini memperkenalkan mekanisme menunggu di mana thread hanya mengakses disk ketika thread lain tidak sedang membaca, sehingga mengurangi masalah pencarian.

  2. Menggunakan Primitif Sinkronisasi: Gunakan semafor atau mutex untuk mengendalikan akses ke disk, memastikan hanya satu thread yang membaca pada satu waktu. Ini mungkin mengurangi throughput sedikit dibandingkan dengan pembacaan bersamaan yang sebenarnya, tetapi dapat meningkatkan efisiensi keseluruhan.

  3. Pantau Kinerja dengan Metode Pengukuran: Gunakan alat pemantauan kinerja (seperti perfmon) untuk menilai status antrean disk dan sesuaikan interval pembacaan dan ukuran data Anda secara dinamis. Pendekatan ‘auto-tuning’ ini memungkinkan Anda untuk mengadaptasi strategi berdasarkan metrik kinerja waktu nyata:

    • Ukur kecepatan transfer saat ini.
    • Sesuaikan nilai X dan Y berdasarkan data kinerja historis.
  4. Tingkatkan ke Versi Windows yang Lebih Baru: Jika memungkinkan, pertimbangkan untuk memperbarui sistem operasi Anda. Windows Vista dan seterusnya menyediakan penjadwalan disk yang lebih pintar, memungkinkan pembacaan bersamaan yang lebih efisien.

Kesimpulan

Mencapai kinerja baca bersamaan yang baik dari disk di Windows melibatkan pemahaman batasan penjadwalan I/O OS dan menerapkan teknik perangkat lunak yang cerdik untuk mengatasi mereka. Dengan memperkenalkan kebijakan akses disk yang kustom, menggunakan teknik sinkronisasi, dan memantau metrik kinerja, Anda dapat secara signifikan meningkatkan throughput aplikasi Anda saat menangani file besar dan multithreading.

Terapkan strategi ini dengan cermat, dan Anda akan berada di jalur yang tepat untuk mengoptimalkan proses baca disk Anda dan sepenuhnya memanfaatkan kekuatan pemrograman bersamaan dalam aplikasi Anda.