Ограничение использования файловой системы программно в Linux - PullRequest
1 голос
/ 20 декабря 2009

Мне было поручено написать системный вызов для ядра Linux, который странным образом определяет (и уменьшает) максимальный объем передачи пользователя в минуту (для файловых операций). Этот системный вызов будет называться lim_fs_usage и будет принимать параметр для максимального количества байтов, которые все пользователи могут получить за минуту. Для краткости я собираюсь определить пропускную способность всех операций файловой системы в Linux. Проект также просит выбрать подходящий метод для распространения этого ограниченного ресурса (доступ к файлам) среди пользователей, но я думаю, что это не будет большой проблемой.

Я провел долгий поиск и сканирование, но не смог найти метод для программного управления доступом к файловой системе. Я думал о подключении (mmap()) жесткого диска к памяти и управлении операциями с памятью, но это оказалось бесполезным. Я также пытался найти API для виртуальной файловой системы, чтобы отслеживать и ограничивать его, но я не смог его найти. Любые идеи, пожалуйста ... Любая помощь с благодарностью. Заранее спасибо ...

Ответы [ 3 ]

1 голос
/ 21 декабря 2009

Интересно, не могли бы вы сделать это как реализацию планировщика ввода-вывода.

Основная трудность ограничения пропускной способности ввода-вывода в Linux заключается в том, что к тому времени, когда оно достигает где-то рядом с устройством, ядро, вероятно, уже давно забыло, кто его вызвал.

Точно так же вы можете найти очень хитрую причину в определении того, кто несет ответственность за данный фрагмент IO:

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

Если вы понимаете все эти и другие предостережения и по-прежнему хотите это сделать, я представляю, что делать это в качестве планировщика ввода-вывода - это путь.

Планировщики ввода-вывода подключаются в Linux (2.6) и могут быть изменены динамически - ядро ​​ожидает завершения всех операций ввода-вывода на устройстве (планировщик ввода-вывода переключается на блочное устройство), а затем переключается на новое.

0 голосов
/ 21 декабря 2009

После долгого периода размышлений и поисков я решил использовать предложенный метод «hoking». Я имею в виду создание нового системного вызова, который инициализирует и управляет глобальной переменной, такой как hdd_ bandwith _limit. Эта переменная будет использоваться в модифицированной реализации Read() и Write() системных вызовов (вместо переменной «count»). Тогда я решу вопрос о распространении этого ресурса, что является реальной проблемой. Вероятно, я выясню, сколько пользователей используют систему в определенный момент, и разделю этот ресурс поровну. Будет ли Round-Robin-подобный дистрибутив. Но, тем не менее, я открыт для предложений по этому вопросу распространения. Это будет SJF или FCFS или Round-Robin? Синхронизация - другая проблема. Как я могу знать, что работа пользователя короткая или длинная? Или он сделал с операцией или нет?

0 голосов
/ 20 декабря 2009

Поскольку это срочно, я дам вам идею изо всех сил, не занимаясь исследованиями выполнимости - как насчет вставки хука для отслеживания системных вызовов, связанных с доступом к файловой системе? Вы можете написать специализированные модули ядра для работы с различными файловыми системами (ext3, ext4 и т. Д.), Но в качестве подтверждения концепции вы можете начать с одной. Не забывайте, что root зарезервировал блоки в памяти, пространстве процесса и на диске для своих собственных операций.

Управление операциями с памятью не имеет отношения к тому, что вы пытаетесь сделать (но, возможно, я ошибаюсь здесь).

...