Как измерить стоимость незначительной ошибки страницы?

Я хочу убедиться, что прозрачная огромная страница (THP) вызовет большую задержку сбоя страницы, потому что Linux должен обнулять страницы перед возвратом их пользователю. THP в 512 раз больше страниц размером 4 КБ, поэтому его медленнее очищать. Когда память фрагментирована, ОС часто сжимает память для генерации THP.

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

1 ответ

Проверьте https://www.kernel.org/doc/Documentation/vm/transhuge.txt документацию и выполните поиск в документах LWN и RedHat на наличие задержек THP и сбоев THP.

https://www.kernel.org/doc/Documentation/vm/transhuge.txt говорит о нулевом THP:

По умолчанию ядро ​​пытается использовать огромную нулевую страницу при сбое чтения страницы с анонимным отображением. Можно отключить огромную нулевую страницу, написав 0, или включить ее обратно, написав 1:

echo 0 >/sys/kernel/mm/transparent_hugepage/use_zero_page
echo 1 >/sys/kernel/mm/transparent_hugepage/use_zero_page

Вы можете изменить настройку (введено примерно в 2012 году: https://lwn.net/Articles/517465/ Добавление огромной нулевой страницы) и выполнить измерения отображения страниц и задержки доступа. Просто прочитайте некоторое системное время с помощью rdtsc/rdtscp/CLOCK_MONOTONIC, сделайте доступ к странице, перечитайте время; записывать статистику о разнице во времени, например, min/max/avg; нарисуйте гистограмму - посчитайте, сколько различий было в диапазонах 0..100, 101..300, 301..600 ... и сколько было больше, чем какое-то огромное значение. Массив для подсчета гистограммы достаточно мал.

Вы можете попробовать mmap() с MAP_POPULATE флаг - ( http://d3s.mff.cuni.cz/teaching/advanced_operating_systems/slides/10_huge_pages.pdf стр. 17)

В блоге RedHat есть сообщение о задержке сбоя THP и страницы (с помощью их отслеживания отслеживания SystemTap): https://developers.redhat.com/blog/2014/03/10/examining-huge-pages-or-transparent-huge-pages-performance/

Чтобы предотвратить утечку информации от предыдущего пользователя страницы, ядро ​​записывает нули на всю страницу. Для страницы размером 4096 байт это относительно короткая операция, которая займет всего пару микросекунд. Размер огромных страниц x86 составляет 2 МБ, что в 512 раз больше обычной страницы. Таким образом, операция может занять сотни микросекунд и повлиять на работу кода, чувствительного к задержке. Ниже приведен простой скрипт командной строки SystemTap, который показывает, в каких приложениях обнуляются огромные страницы и сколько времени занимают эти операции. Он будет работать до тех пор, пока не будет нажата cntl-c.

stap  -e 'global huge_clear probe kernel.function("clear_huge_page").return {
  huge_clear [execname(), pid()] <<< (gettimeofday_us() - @entry(gettimeofday_us()))}'

Кроме того, я не уверен в этом, но теоретически ядро ​​Linux может иметь некоторый поток ядра, чтобы выполнить предварительный обнуление огромных страниц, прежде чем они потребуются любому приложению.

Другие вопросы по тегам