Как измерить стоимость незначительной ошибки страницы?
Я хочу убедиться, что прозрачная огромная страница (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 может иметь некоторый поток ядра, чтобы выполнить предварительный обнуление огромных страниц, прежде чем они потребуются любому приложению.