Контейнер с одним докером, немного превосходящий его хост в производительности процессора: Почему?
Я провел эксперимент, чтобы сравнить производительность процессора контейнера докера с производительностью процессора хоста, на котором он работает.
Случаи
A: программа Benchmark запускается на хост-компьютере (Intel i5, 2,6 ГГц, 2 процессора, 2 ядра)
B: программа Benchmark запускается на контейнере Docker, работающем на том же хост-компьютере.
(Ограничение ресурсов не выполняется для контейнера в B. i.e. Контейнер имеет все 1024 cpu-доли для себя. Ни один другой контейнер не запущен)
Программа тестирования: численная интеграция
Числовая интеграция: это стандартный пример массовой параллельной программы. Выполняется стандартная численная интеграция примерная программа, написанная на С++ с использованием OpenMP lib (которая уже проверена на корректность). Программа запускается 11 раз, меняя количество доступных потоков в программе с 1-11. Эти 11 прогонов выполняются для каждого случая A и B. Таким образом, выполнено 22 прогона 11 для хоста и 11 для контейнера.
Ось X: количество потоков, доступных в программе
Ось Y: указывает на производительность, которая обратна времени (вычисляется путем умножения инверсии времени на запуск программы с константой).
Результат
![введите описание изображения здесь]()
Наблюдение
Контейнер докеров, запущенный на хосте, немного превосходит хост-машину. Этот эксперимент повторялся 4-5 раз на двух разных хостах и каждый, когда кривая производительности контейнера несколько превышала кривую производительности хоста.
Вопрос
Как производительность контейнера выше, чем хост-компьютер, когда контейнер-докер запущен на самом хосте?
Возможная причина: более высокий приоритет процессов докерной группы?
Я предполагаю, что процессы внутри контейнерной группы могут иметь более высокий приоритет процесса, что приводит к повышению производительности программы, запущенной в контейнере, по сравнению с тем, когда программа напрямую запускается на главной машине. Это похоже на возможное объяснение?
Ответы
Ответ 1
Благодаря комментариям @miraculixx и @Zboson, которые помогли мне понять, что контейнер не намного превосходит хост. Странные результаты (сюжет, о котором идет речь) были вызваны из-за разных версий компилятора, используемых на хосте и контейнере при выполнении эксперимента. Когда случаи A и B снова запускаются после обновления в ту же версию компилятора как в контейнере, так и в хосте, это следующие результаты:
Без флага оптимизации
![введите описание изображения здесь]()
С флагом оптимизации -O3
![введите описание изображения здесь]()
Наблюдение
Можно заметить, что контейнер имеет такую же или немного меньшую производительность, чем хост; что имеет смысл интуитивно. (Без оптимизации есть несколько несоответствий)
P.S Извинения за вводящий в заблуждение заголовок вопроса. Я не знал, что несоответствие производительности может быть из-за разных версий компилятора до тех пор, пока комментарии не будут опубликованы.