Ручная пометка страниц памяти как «грязных»

При последовательном изменении огромного (~ 65 ГБ) файла отображения памяти, находящегося на жестком диске в Linux, я заметил следующее поведение:

  • Если я изменяю почти все в файле (я предполагаю, что по крайней мере один байт на каждой странице памяти), пропускная способность чтения / записи составляет около 40 МБ / с.
  • Если я изменяю только некоторые страницы, оставляя другие без изменений, хотя чтение и запись уменьшенный резко, до около 7 МБ / с

Таким образом, изменение меньшего количества вещей на самом деле снижает производительность. Процесс в значительной степени связан с вводом / выводом (5% процессорного времени user95% процессорного времени iowait), поэтому фактическая обработка не может учитывать разницу пропускной способности. Я предполагаю, что в первом случае система подкачки ядра использует последовательные записи, а во втором — записи с произвольным доступом. В результате частый поиск будет учитывать разницу в производительности.

Если я принудительно изменю данные на каждой странице (например, меняя некоторые младшие биты), производительность возрастает до уровня 40 МБ / с, но такой подход портит данные. Эффективные NOOP, такие как XOR, двойное отображение данных на странице с фиксированным шаблоном не влияет на производительность (я использовал objdump чтобы убедиться, что код не исключен компилятором). Я предполагаю, что двойной XOR полностью обрабатывается внутри кеша ЦП, и, поскольку второй XOR восстанавливает исходные данные, никакие изменения не достигают фактической памяти, таким образом сохраняя чистую страницу памяти.

Так есть ли способ улучшить пропускную способность во втором случае? В частности, есть ли способ заставить ядро ​​выполнить обратную запись, даже выбирая чистые страницы, или надежно вручную пометить страницы как грязные программно?

3

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]