У який момент асинхронне зчитування вводу / виводу диска ефективніше, ніж синхронне?


22

Якщо припустити, що існує деякий біт коду, який читає файли для кількох споживачів, а файли мають будь-який довільний розмір: На який розмір стає ефективніше читати файл асинхронно? Або кажучи іншим способом, наскільки маленьким повинен бути файл, щоб він був швидшим, щоб просто читати його синхронно?

Я помітив (і, можливо, я помиляюся), що при читанні дуже маленьких файлів потрібно читати їх асинхронно, ніж синхронно (зокрема з .NET). Я припускаю, що це стосується часу встановлення таких речей, як порти завершення вводу / виводу, потоки тощо.

Чи є якесь правило, щоб допомогти тут? Або це залежить від системи та навколишнього середовища?


Чи можете ви дати код, який ви використовуєте для еталону? Я думаю, що це може статися лише у тому випадку, коли розмір файлу менший за розмір внутрішнього буфера зчитувача потоку. Але якщо вам доведеться прочитати стільки невеликих файлів, ви, мабуть,
зіткнетеся

Боюсь, у мене немає коду. Це щось, на що я зіткнувся з часом, і з тих пір був у мене на думці. Код був у .NET і по суті був прямим File.ReadAllBytes () проти FileStream.BeginRead () у циклі for for
blesh

Коли криві, що представляють їх ефективність, перетинаються, а асинхронізований IO виходить з схрещування з більш високим значенням, ніж крива синхронізації IO.
Томас Едінг

Відповіді:


14

На жаль, відповідь - "це залежить". Вам було б легко написати невелику програму, щоб емпірично визначити час читання асинхронізації та синхронізації.

Це буде залежати від безлічі факторів. Чи зберігаються вони на спінінг-дисках, SSD або мережевому диску? Який процесор ви використовуєте? Скільки розеток / сердечників? Ви біжите у ВМ або голий метал? У вас працює старовинна ОС чи сучасна?


1
Так, я зрозумів стільки ж. Напевно, я сподівався, що буде якесь дослідження, яке слід використовувати як керівництво або правило.
м'ясо

9

Async має 3 основні переваги:

  1. Це знижує використання процесора. Це може бути корисно, якщо ви також робите важкі для процесора операції з тільки що прочитаними вами даними.
  2. Використання якоїсь інфраструктури асинхронізації дозволяє легко паралелізувати код. Особливо, якщо ви читаєте безліч файлів.
  3. Відправляючи кілька запитів читання-запису в ОС, ОС і HW можуть переупорядкувати виконання цих операцій швидше. SATA2 має таку особливість.

Я вважаю, що головною перевагою асинхронного зчитування є те, коли ви працюєте з великою кількістю файлів або вам потрібно багато потужності процесора.


Зверніть увагу на пункт 2, що він нічого не оптимізує, якщо операція вводу / виводу є вузьким місцем. Речі відрізняються, якщо ви паралельно отримуєте доступ до файлів, розміщених на різних дисках, через RAID або мережу.
Арсеній Муренко

5
Гм, у мене виникають проблеми з розумінням того, що ти маєш на увазі під №1. Я б сказав, що це навпаки на практиці. Оскільки у випадку з асинхронією ви тепер змінюєте свої потоки (з blocked waiting for I/O0% CPU) на continue normal processing(> 0% CPU).
Ісак Саво

3

Це залежить

Слід пам’ятати, наскільки дорого коштує контекстне переключення між процесами. Node.JS розроблений таким чином, оскільки передбачає, що робити контекстний комутатор дуже дорого, і в іншому випадку у IE у вас буде багато процесів, які очікують, що комп'ютер завалить.

З іншого боку, Erlang робить переключення контексту процесу дуже дешевим, тому все може бути синхронним, а час виконання Erlang може відслідковувати все.

Отже, фактори, які слід враховувати:

  • Вартість операції з переключенням контексту
  • швидкість диска для операцій пошуку
  • швидкість диска для операцій з читанням
  • - це файли в кеші

І я впевнений, що я залишаю півдесятка факторів


2

Я не впевнений, що є певний "пункт", але це має найбільше сенс, коли у вас працює багато потоків, оскільки це дозволяє перекривати введення-виведення з іншими роботами. Якщо у вас запасні нитки простоюють, то читання асинхронно не дасть вам переваги. Лише коли у вас заповнюються робочі черги, і ваш потік може бути корисно виконувати іншу роботу замість того, щоб чекати вводу-виводу, що доступ до файлу асинхроніки дає будь-яку перевагу.


так, у цьому вся суть багатопоточності!
Влад

1

Я думаю, що тут проблема не стільки в швидкості читання, скільки в затримці.

Якщо ви читаєте з мережевого накопичувача або з повільного механічного жорсткого диска з довгими чергами, для читання продуктивність сприйме потужність. І якщо ваш додаток також читає в потоці GUI, і в цьому випадку це дуже поганий додаток, це буде жахливо для користувача.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.