Есть ли прирост производительности в приложениях x86 для Windows / Linux при минимизации количества страниц? - PullRequest
3 голосов
/ 16 июня 2019

Я пишу и запускаю программное обеспечение для Windows и Linux последних пяти лет, скажем, на машинах последних пяти лет.

Я считаю, что запущенные процессы никогда не приблизятся к объему памятиу нас есть (мы обычно используем 3 ГБ из 32 ГБ), но я уверен, что мы будем заполнять кэш до переполнения.

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

Насколько я понимаю, если память процессов выгружается вдиск, сокращая количество страниц и, следовательно, дисковый ввод-вывод является огромным выигрышем с точки зрения времени и задержки настенных часов (например, для реагирования на сетевые события, события пользователя, таймеры и т. д.). Однако с такой дешевой памятью в настоящее время я неЯ думаю, что процессы, использующие мою структуру данных, никогда не будут загружаться из памяти.Так есть ли еще преимущество в улучшении этого?Например, если я использую 10 000 строк кэша, имеет ли значение, будут ли они распределены по 157 страницам 4 КБ (= 643 КБ) или 10 000 страниц 4 КБ (= 40 МБ)? Подзапрос: , даже если вы совсем не собираетесь заполнять ОЗУ, есть ли случаи, когда современная ОС все равно будет запускать запущенный процесс?(Я думаю, что Linux 90-х мог бы сделать это, например, для увеличения кеширования файлов.)

В отличие от этого, я также могу уменьшить количество строк кэша, и я подозреваю, что это, вероятно, немного увеличит время настенных часов.Просто чтобы понять, на что я рассчитываю, я подсчитываю количество областей памяти, выровненных по 64 байта, к которым прикасаюсь хотя бы один байт, как общее количество строк кэша, используемых этой структурой.Пример: если гипотетически у меня 40 000 16-байтовых структур, компьютер, процессы которого постоянно обращаются к большему объему памяти, имеющему кэш-память L1, вероятно, будет работать все быстрее, если эти структуры будут упакованы в 10 000 64-байтовых строк кэша вместо каждой из двух строк кэша.на 80000 строк кэша?

1 Ответ

2 голосов
/ 17 июня 2019

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

Когда общее количество необходимых физических страниц собирается превысить объем основной памяти, ОС попытается освободить часть физической памяти, переместив некоторые резидентные страницы во вторичное хранилище. Такая ситуация может привести к серьезным сбоям страниц, что может существенно повлиять на производительность. Даже если вы точно знаете, что система не достигнет этой точки, существуют другие проблемы с производительностью, которые могут возникнуть при излишнем использовании большего количества виртуальных страниц (т. Е. На использованных страницах есть неиспользуемое пространство).

На процессорах Intel и AMD записи таблицы страниц и другие структуры подкачки кэшируются в аппаратных кэшах в блоке управления памятью для эффективного преобразования виртуальных адресов в физические адреса. К ним относятся TLB L1 и L2. В случае пропуска L2 TLB аппаратный компонент, называемый обходчиком страниц, задействуется для выполнения требуемой трансляции адресов. Больше страниц означает больше промахов. На микроархитектурах до Broadwell 1 и pre-Zen в каждый момент времени может быть только один просмотр страниц. На более поздних микроархитектурах их может быть только две. Кроме того, в Intel Ivy Bridge и более поздних версиях сборщику TLB может быть сложнее не отставать от промахов.

На процессорах Intel и AMD кэши L1D и L2 спроектированы таким образом, что все строки кэша в пределах одной страницы 4K гарантированно отображаются в разные наборы кэшей. Таким образом, если используются все строки кэша на странице, например, в борьбе за распространение строк кэша на 10 разных страницах, количество конфликтов на этих уровнях кэша может быть уменьшено. Тем не менее, на всех процессорах AMD и на микроархитектурах Intel до Haswell конфликты между банками чаще возникают, когда доступы более распределены по наборам кэша.

На процессорах Intel и AMD аппаратные средства предварительной выборки данных не работают за пределами 4K. Шаблон доступа, который может быть обнаружен одним или несколькими средствами предварительной выборки, но имеет доступ, распределенный по многим страницам, меньше выиграл бы от аппаратной предварительной выборки.

В Windows / Intel биты доступа к записям таблицы страниц всех существующих страниц сбрасываются каждую секунду менеджером рабочего набора. Поэтому, когда доступы неоправданно распределяются в виртуальном адресном пространстве, число обходов страниц, для которых требуются вспомогательные микрокоды (чтобы установить бит доступа) на доступ к памяти, может увеличиться.

То же самое относится и к незначительным сбоям страниц (на Intel и AMD). Как в Windows, так и в Linux используется разбиение на страницы по требованию, т. Е. Выделенная виртуальная страница отображается только на физическую страницу по требованию. При доступе к виртуальной странице, которая еще не сопоставлена ​​с физической страницей, возникает незначительная ошибка страницы. Как и в случае с битом доступа, количество незначительных сбоев страниц при обращении может быть больше.

На процессорах Intel с большим количеством обращающихся страниц становится более вероятным доступ к соседним логическим ядрам с 4K-псевдонимом. Для получения дополнительной информации о псевдонимах 4K см .: Пропускная способность памяти L1: снижение эффективности на 50% при использовании адресов, которые отличаются на 4096 + 64 байта .

Возможно, есть и другие потенциальные проблемы.

Подзапрос: даже если вы совсем близко не заполняете ОЗУ, есть ли в каких случаях современная ОС будет запускать запущенный процесс? (Я думаю Linux 90-х мог бы сделать это для увеличения кеширования файлов, для экземпляр.)

В Windows и Linux максимальный размер рабочего набора установлен для каждого процесса. В Linux это называется RLIMIT_RSS и не применяется. В Windows это ограничение может быть мягким (по умолчанию) или жестким. Ограничение применяется только в том случае, если оно жесткое (это можно указать, вызвав функцию SetProcessWorkingSetSizeEx и передав флаг QUOTA_LIMITS_HARDWS_MIN_ENABLE). Когда процесс достигает предела своего жесткого рабочего набора, дальнейшие запросы на выделение памяти будут удовлетворены путем перемещения некоторых его страниц в файл подкачки, даже если свободная физическая память доступна.

Я не знаю о Linux 90-х годов.


Примечания:

(1) Руководство по оптимизации Intel упоминает в разделе 2.2.3, что Skylake может выполнять два обхода страницы параллельно по сравнению с одним в Haswell и более ранних микроархитектурах. Насколько мне известно, в руководстве не указано, может ли Бродвелл выполнять одну или две прогулки по страницам параллельно. Однако, согласно слайду 10 из этих слайдов Intel (озаглавленных «Процессор Intel Xeon D: первый процессор Xeon, оптимизированный для плотных решений»), Xeon Broadwell поддерживает два просмотра страниц. Я думаю, что это также относится ко всем моделям Broadwell.

...