Я столкнулся с странной регрессией производительности ядра Linux с 3.11 по 3.12 в системах x86_64. Запуск Mark Stock Radiance на Fedora 20, 3.12 заметно медленнее. Ничего другого не изменилось - идентичный двоичный, идентичный glibc - я просто загружаю другую версию ядра, и производительность меняется. Временная программа, rpict, представляет собой код пользователя на уровне 100%.
Прежде чем сообщить об этом как об ошибке, я хотел бы найти причину такого поведения. Я не знаю много о ядре Linux, и журнал изменений с 3.11 по 3.12 не дает мне подсказки.
Я наблюдал это на двух системах: Intel Haswell (i7-4771) и AMD Richland (A8-6600K). В системе Haswell пользовательское время перешло от 895 с с 3.11 до 962 с 3.12. На Ричленд, с 1764 по 1844 год. Эти времена повторяются в течение нескольких секунд.
Я сделал некоторое профилирование с perf, и обнаружил, что IPC снизился в той же пропорции, что и замедление. В системе Хасуэлла это, по-видимому, вызвано более пропущенными ветвями, но почему должен снижаться уровень прогноза? Radiance действительно использует генератор случайных чисел - может ли "лучшая" случайность вызвать пропущенные ветки? Но помимо поддержки OMAP4, RNG не должен казаться измененным в 3.12.
В системе AMD perf просто указывает на более холостые ходовые циклы, но причина не ясна.
Система Хасуэлла:
3.11.10 895s user, 3.74% branch-misses, 1.65 insns per cycle
3.12.6 962s user, 4.22% branch-misses, 1.52 insns per cycle
Система Ричленд:
3.11.10 1764s user, 8.23% branch-misses, 0.75 insns per cycle
3.12.6 1844s user, 8.26% branch-misses, 0.72 insns per cycle
Я также посмотрел на diff от вывода dmesg обоих ядер, но не видел ничего, что могло бы вызвать такое замедление программы, связанной с процессором.
Я попытался переключить регулятор cpufreq из значения по умолчанию по умолчанию, но это не повлияло.
Исполняемый файл был скомпилирован с использованием gcc 4.7.3, но не с использованием инструкций AVX. libm по-прежнему использует некоторый AVX (например, __ieee754_pow_fma4
), но эти функции составляют всего 0,3% от общего времени выполнения.
Дополнительная информация:
- Diff конфигураций ядра
- diff выходных данных dmesg в системе Haswell.
- diff/proc/pid/maps - 3.11 отображает только одну область кучи; 3.12 лота.
- вывод перформанса из системы A8-6600K
- perf stats w/TLB misses Статистика dTLB выглядит совсем по-другому!
- /usr/bin/time -v output из системы A8-6600K
Любые идеи (кроме деаэробных изменений ядра)?