Поток, прикрепленный к ЦП 1, выполняет случайное чтение из заранее выделенной и инициализированной области памяти размером 2 ГБ и во время цикла доступа к памяти не выполняется никаких системных вызовов.
Perf работает в отдельном процессе, измеряющем mem_inst_retired.all_loads:k,mem_inst_retired.all_stores:k -I 200 -p
Почему выполняются какие-либо операции с памятью ядра, когда процесс выполняет только чтение памяти из пользовательского пространства? Хотя это может быть эффектом наблюдателя, могут ли прерывания, генерируемые PMU (блоком мониторинга производительности) для выборки, заставлять ядро выполнять операции с памятью, которые приписываются процессу доступа? Я просмотрел SDM, но не нашел хорошего ответа.
Как perf приписывает операции режима ядра конкретному процессу? Что касается системных вызовов, то ясно, что ядро работает «от имени» процесса, но как насчет задач ядра, таких как планирование, сжатие памяти или балансировка нагрузки, которые могут повлиять на процесс? Где проходит черта?
Я заметил, что изменение интервала выборки с 200 мс на 5 с приводит к изменению измеряемых операций ядра с ~ 10^5 до ~ 10. ^7 операций за интервал.
Вот простой код, который осуществляет доступ и измеряет активность загрузки/сохранения: https://gist.github.com/VinayBanakar/8c ... d3e3687aac
Я запускаю простую программу, в которой: [list] [*]Поток, прикрепленный к ЦП 1, выполняет случайное чтение из заранее выделенной и инициализированной области памяти размером 2 ГБ и во время цикла доступа к памяти не выполняется никаких системных вызовов. [*]Perf работает в отдельном процессе, измеряющем mem_inst_retired.all_loads:k,mem_inst_retired.all_stores:k -I 200 -p
[/list] Вот минимальный тестовый код: [code]void access_memory(char *memory) { // Pin thread to CPU 1 cpu_set_t cpuset; CPU_ZERO(&cpuset); CPU_SET(1, &cpuset); pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
Вопросы: [list] [*]Почему выполняются какие-либо операции с памятью ядра, когда процесс выполняет только чтение памяти из пользовательского пространства? Хотя это может быть эффектом наблюдателя, могут ли прерывания, генерируемые PMU (блоком мониторинга производительности) для выборки, заставлять ядро выполнять операции с памятью, которые приписываются процессу доступа? Я просмотрел SDM, но не нашел хорошего ответа. [*]Как perf приписывает операции режима ядра конкретному процессу? Что касается системных вызовов, то ясно, что ядро работает «от имени» процесса, но как насчет задач ядра, таких как планирование, сжатие памяти или балансировка нагрузки, которые могут повлиять на процесс? Где проходит черта? [/list] Я заметил, что изменение интервала выборки с 200 мс на 5 с приводит к изменению измеряемых операций ядра с ~ 10^5 до ~ 10. ^7 операций за интервал. Вот простой код, который осуществляет доступ и измеряет активность загрузки/сохранения: https://gist.github.com/VinayBanakar/8cd04c5fa03a6895292498d3e3687aac