При последовательном изменении огромного (~ 65 ГБ) файла отображения памяти, находящегося на жестком диске в Linux, я заметил следующее поведение:
Таким образом, изменение меньшего количества вещей на самом деле снижает производительность. Процесс в значительной степени связан с вводом / выводом (5% процессорного времени user
95% процессорного времени iowait
), поэтому фактическая обработка не может учитывать разницу пропускной способности. Я предполагаю, что в первом случае система подкачки ядра использует последовательные записи, а во втором — записи с произвольным доступом. В результате частый поиск будет учитывать разницу в производительности.
Если я принудительно изменю данные на каждой странице (например, меняя некоторые младшие биты), производительность возрастает до уровня 40 МБ / с, но такой подход портит данные. Эффективные NOOP, такие как XOR, двойное отображение данных на странице с фиксированным шаблоном не влияет на производительность (я использовал objdump
чтобы убедиться, что код не исключен компилятором). Я предполагаю, что двойной XOR полностью обрабатывается внутри кеша ЦП, и, поскольку второй XOR восстанавливает исходные данные, никакие изменения не достигают фактической памяти, таким образом сохраняя чистую страницу памяти.
Так есть ли способ улучшить пропускную способность во втором случае? В частности, есть ли способ заставить ядро выполнить обратную запись, даже выбирая чистые страницы, или надежно вручную пометить страницы как грязные программно?
Задача ещё не решена.