Я ищу способ получить последовательное измерение времени (<1%-е различие между различными выполнениями) для моей программы в соответствии с Ubuntu 14.04. perf stat
шоу, что я все еще получаю довольно много контекстных переключений, хотя моя программа никогда не дает контроль к ОС (никакой ввод-вывод, никакое выделение памяти и т.д.). Я действительно выполняю использование программы sudo nice -n -20
на экранированном ЦП (мой Intel i7 CPU
имеет четыре физических ядра, гиперпоточность отключена в BIOS) с -k on
переключатель к cset shield
.
Я понимаю, что неперемещаемые процессы ядра являются источником контекстных переключений. Так, мои вопросы: существует ли способ настроить защиту при начальной загрузке, так, чтобы те неперемещаемые процессы работали на неэкранированных центральных процессорах для запуска с? В случае, что ответ является "нет", там иначе, я могу получить чистую среду для своего критического процесса в соответствии с Ubuntu?
Im, собирающийся засунуть мою шею здесь и сказать, что это не возможно на Linux в целом.
В системах SMP существует планировщик, работающий на каждом ядре, которое является, почему Вы все еще получаете контекстные переключения. Если Ваше приложение действительно настолько очень важно, возможно, необходимо использовать некоторый RTOS, а не Linux.
Смотрите на schedtool пакет. Это предлагает средства блокировки ЦП и выбор планировщиков ЦП пользователю.
<час>Взволнованный о вещах влияния GUI? От виртуального терминала уничтожьте X и посмотрите. Вероятно, с i7 ЦП, существует достаточно ядер для создания этого не важным. Это - весь вопрос управления совместно используемыми ресурсами с ЦП, являющимся только одним таким ресурсом. Некоторые ресурсы так многочисленны, трудно помнить, что они совместно используются, как память. Чем больше Вы удостоверяетесь, что Ваш "критический процесс" не задержан ни из-за чего больше, тем хуже Ваш Linux общего назначения ОС будет вести себя с точки зрения взаимодействия с пользователем.
Я не знаю то, что Вы подразумеваете под неэкранированными процессорами, но ими, способ присвоить любой процесс CPU состоит в том, чтобы использовать taskset. Можно даже использовать его на модулях ядра для принуждения сырой политики NUMA.
Когда я хочу выполненный выполнить сопоставимые эксперименты I: Заблокируйте частоты тактовой частоты ЦП или регулятор, чтобы избежать возможных различий в ответе; Вызовите задачу работать на определенном ЦП (если не многопоточный); Если существует какой-либо дисковый ввод-вывод, включенный, или какой-либо другой источник кэширования, сбросьте кэш памяти между выполнениями для справедливого сравнения.
Для моих экспериментов, который всегда был достаточно хорош, но возможно не для Ваших. Я отредактирую это с большим количеством деталей при желании.
Редактирование: Я забыл упоминать, и очень важный. Я только использую выпуск сервера Ubuntu для этого типа работы. Рабочие столы имеют путь к большому количеству другого материала, всегда работающего. и таким образом, "в других отношениях неактивный" компьютер действительно не, где почти бездействуют. На неактивном сервере существует только случайное задание крона, которое может и действительно портить то выполнение эксперимента.
, Например, я сделал 262 выполнения программы, которая занимает в среднем 5,6217 секунд для выполнения. Стандартное отклонение времени выполнения составляло 0,0119 секунды, и очень худшие случаи в целом составляли +0.68% и-0.56%. Я вызвал ЦП 7 и вызвал режим производительности (но обратите внимание, что даже в процессорах Intel i7 режима производительности может замедлить тактовую частоту собой.)
, Кроме того, если я отключаю intel_pstate регулятор частоты и использую acpi_cpufreq один в "powersave" режиме, в основном блокируя центральные процессоры в минимуме pstate (самая низкая частота), тогда я добираюсь о +/-изменения времени выполнения на 0,01% на среднем времени выполнения 13,22 секунд.