LINUX.ORG.RU

История изменений

Исправление pon4ik, (текущая версия) :

На практике буфер служит для (внезапно) буферизации каких-то i/o или вычислительных задач. В зависимости от характера данных он либо всегда содержит данные для процессинга и тогда спать не эффективно по определению.

Но чаще всего ввод вывод имеет немного другой характер, имеются пиковые нагрузки и состояние простоя. Как раз вариации на тему busy_poll являются эффективным подходом в таком случае в паре с ожиданием на cv или семафоре.

Например я видел примерно такой подход, который справлялся с задачей на ура:

  • ждём входа на cv (спать пока буфер пуст)
  • разгребаем его полностью (всё что успеваем, на то он и ring)
  • активно(не отдавая поток планировщику) ждём ещё 2us(параметр из конфига, под конкретное окружение), если он начинает заполнятся разгребаем
  • засыпаем на cv

Да, тут можно было бы попробовать вести статистику и менять этот таймаут в рантайме, вопрос сколько бы заняли эти вычисления и какова была бы их точность. Сложная статистика вполне могла бы занять дольше 2us :) А простая давать плохие результаты. Но история не про классический sleep(по сути если на родственных (affinity) ядрах крутится кто-то ещё, это команда отзаниматься им своими делами и уснуть, а потом, так уж и быть если таймаут истёк тебя разбудить), а про то, как выработать квант максимально эффективно.

Исходная версия pon4ik, :

На практике буфер служит для (внезапно) буферизации каких-то i/o задач. В зависимости от характера данных он либо всегда содержит данные для процессинга и тогда спать не эффективно по определению.

Но чаще всего ввод вывод имеет немного другой характер, имеются пиковые нагрузки и состояние простоя. Как раз вариации на тему busy_poll являются эффективным подходом в таком случае в паре с ожиданием на cv или семафоре.

Например я видел примерно такой подход, который справлялся с задачей на ура:

  • ждём входа на cv (спать пока буфер пуст)
  • разгребаем его полностью (всё что успеваем, на то он и ring)
  • активно(не отдавая поток планировщику) ждём ещё 2us(параметр из конфига, под конкретное окружение), если он начинает заполнятся разгребаем
  • засыпаем на cv

Да, тут можно было бы попробовать вести статистику и менять этот таймаут в рантайме, вопрос сколько бы заняли эти вычисления и какова была бы их точность. Сложная статистика вполне могла бы занять дольше 2us :) А простая давать плохие результаты. Но история не про классический sleep(по сути если на родственных (affinity) ядрах крутится кто-то ещё, это команда отзаниматься им своими делами и уснуть, а потом, так уж и быть если таймаут истёк тебя разбудить), а про то, как выработать квант максимально эффективно.