Pada titik mana asinkron pembacaan disk I / O lebih efisien daripada sinkron?

22

Dengan asumsi ada sedikit kode yang membaca file untuk banyak konsumen, dan file-file itu dari ukuran sembarang: Pada ukuran apa itu menjadi lebih efisien untuk membaca file secara tidak sinkron? Atau dengan kata lain, seberapa kecil suatu file agar lebih cepat hanya dengan membacanya secara sinkron?

Saya perhatikan (dan mungkin saya salah) bahwa ketika membaca file yang sangat kecil, perlu waktu lebih lama untuk membacanya secara tidak sinkron daripada sinkron (khususnya dengan .NET). Saya berasumsi ini ada hubungannya dengan mengatur waktu untuk hal-hal seperti I / O Completion Ports, threads, dll.

Apakah ada aturan praktis untuk membantu di sini? Atau tergantung pada sistem dan lingkungan?

daging
sumber
Bisakah Anda memberikan kode yang Anda gunakan untuk benchmark? Saya pikir ini bisa terjadi hanya dalam kasus di mana ukuran file lebih kecil dari ukuran buffer internal pembaca aliran. Tetapi jika Anda harus membaca bahwa banyak file kecil Anda mungkin akan menemukan masalah lain dengan disk i / o
Daniel Iankov
Saya tidak memiliki kode yang berguna, saya khawatir. Itu adalah sesuatu yang saya temui beberapa waktu lalu dan sudah ada di pikiran saya sejak saat itu. Kode dalam .NET dan pada dasarnya
File lurus.ReadAllBytes
Ketika kurva yang mewakili efisiensi silang mereka, dan Iyn async keluar dari persimpangan pada nilai yang lebih tinggi daripada kurva IO sinkronisasi.
Thomas Eding

Jawaban:

14

Sayangnya, jawabannya adalah, "itu tergantung." Akan mudah bagi Anda untuk menulis sebuah program kecil untuk secara empiris menentukan waktu dari kedua async dan sinkronisasi dibaca.

Itu akan tergantung pada banyak faktor. Apakah mereka disimpan di disk berputar, SSD, atau drive jaringan? CPU jenis apa yang Anda gunakan? Berapa soket / core? Apakah Anda menjalankan VM atau bare metal? Apakah Anda menjalankan OS kuno atau modern?

Martin C. Martin
sumber
1
Ya, saya pikir banyak. Saya kira saya berharap ada semacam studi untuk digunakan sebagai panduan atau aturan praktis.
blesh
9

Async memiliki 3 keunggulan utama:

  1. Ini menurunkan pemanfaatan CPU. Ini bisa berguna jika Anda juga melakukan operasi CPU-berat dengan data yang baru saja Anda baca.
  2. Menggunakan beberapa jenis infrastruktur async membuat kode mudah diparalelkan. Apalagi jika Anda membaca banyak file.
  3. Dengan mengirimkan beberapa permintaan baca-tulis ke OS, OS dan HW dapat memesan ulang operasi-operasi tersebut agar diselesaikan lebih cepat. SATA2 memiliki fitur tersebut.

Saya percaya keuntungan utama dari asynchronous read adalah ketika Anda bekerja dengan banyak file atau Anda membutuhkan banyak daya CPU.

Euforia
sumber
Perhatikan untuk poin 2 bahwa itu tidak akan mengoptimalkan apa pun jika operasi I / O adalah hambatan. Hal-hal berbeda jika Anda mengakses secara paralel, melalui RAID atau jaringan, file-file yang terletak pada disk yang berbeda.
Arseni Mourzenko
5
Hmm, saya kesulitan memahami apa yang Anda maksud dengan # 1. Saya akan mengatakan itu sebaliknya dalam praktek. Karena dengan case async, Anda sekarang mengubah utas Anda dari blocked waiting for I/O(0% CPU) menjadi continue normal processing(> 0% CPU).
Isak Savo
3

Tergantung

Satu hal yang perlu diingat adalah seberapa mahal perubahan konteks antar proses. Node.JS dirancang seperti itu karena mengasumsikan bahwa melakukan pengalih konteks sangat mahal dan Anda akan memiliki banyak proses menunggu di IE yang akan merusak komputer.

Di sisi lain Erlang membuat proses konteks beralih sangat murah sehingga semuanya bisa sinkron dan waktu lari Erlang dapat melacak semuanya.

Jadi faktor yang perlu dipertimbangkan:

  • Biaya operasi pengalih konteks
  • kecepatan disk untuk operasi pencarian
  • kecepatan disk untuk operasi baca
  • adalah file dalam cache

Dan saya yakin saya akan meninggalkan setengah lusin faktor

Zachary K
sumber
2

Saya tidak yakin ada "titik" tertentu, tetapi itu paling masuk akal ketika Anda memiliki banyak utas yang berfungsi, karena memungkinkan Anda untuk tumpang tindih I / O dengan pekerjaan lain. Jika Anda memiliki utas cadangan yang menganggur, membaca asinkron tidak akan memberi Anda keuntungan apa pun. Hanya ketika Anda memiliki antrian kerja yang terisi dan utas Anda bisa bermanfaat melakukan pekerjaan lain alih-alih menunggu I / O, akses file async memberi keuntungan.

TMN
sumber
ya, itulah inti dari multithreading!
Vlad
1

Saya pikir masalahnya di sini bukan kecepatan membaca, karena latensi.

Jika Anda membaca dari drive jaringan, atau dari hard disk drive mekanis lambat dengan antrian panjang, kinerja akan mengambil menukik untuk membaca. Dan jika aplikasi Anda juga melakukan pembacaan di utas GUI, dalam hal ini aplikasi yang sangat buruk, maka itu akan mengerikan bagi pengguna.

Coder
sumber