Интересно, не могли бы вы сделать это как реализацию планировщика ввода-вывода.
Основная трудность ограничения пропускной способности ввода-вывода в Linux заключается в том, что к тому времени, когда оно достигает где-то рядом с устройством, ядро, вероятно, уже давно забыло, кто его вызвал.
Точно так же вы можете найти очень хитрую причину в определении того, кто несет ответственность за данный фрагмент IO:
- Если двоичный файл загружен по требованию, кто владеет IO, делающим это?
- Отображенный раздел памяти (исполняемый по требованию исполняемый файл или другой) может быть удален из памяти, потому что кто-то else использовал слишком много оперативной памяти, в результате чего ядро решило выселить эти страницы, что ставит несправедливое бремя, связанное с квотой другого пользователя, для последующего просмотра страницы в
- Операции ввода-вывода могут комбинироваться и могут выполняться разными пользователями
- Операция записи может вызвать IO рано или поздно в зависимости от того, как ядро планирует это; более поздний график может означать, что в долгосрочной перспективе потребуется выполнить меньше операций ввода-вывода, поскольку в это же время выполняется другая запись для того же блока; запись в уже грязный блок в кэше не делает его более грязным.
Если вы понимаете все эти и другие предостережения и по-прежнему хотите это сделать, я представляю, что делать это в качестве планировщика ввода-вывода - это путь.
Планировщики ввода-вывода подключаются в Linux (2.6) и могут быть изменены динамически - ядро ожидает завершения всех операций ввода-вывода на устройстве (планировщик ввода-вывода переключается на блочное устройство), а затем переключается на новое.