Вопрос или проблема
Я столкнулся с регрессией производительности при выполнении интерпретатора Python при обновлении с Ubuntu 18 до Ubuntu 24. Как вы думаете, что может быть причиной этого? Есть ли исправление или обходное решение?
У меня есть некоторые доказательства, которые указывают на то, что изменения в ядре Linux — и не что-то в пространстве пользователя — вероятно, являются причиной проблемы.
Я могу воспроизвести расхождение в производительности с помощью очень простого теста:
python3 -c "import timeit; print(timeit.Timer('for _ in range(0,1000): pass').timeit())"
Я выполняю этот тест, загружаясь с ISO-образов Ubuntu 18 и Ubuntu 24 на одной и той же системе Cisco UCS C220 M5SX. Вы можете найти ISO-образы на сайте Canonical и воспроизвести эксперимент.
У меня есть набор бинарников Python 3.11, собранных из исходников на системе Debian Squeeze, которые будут работать на огромном количестве дистрибутивов Linux. Это дает мне возможность протестировать те же самые бинарники Python на 18 и 24. Мы будем называть эти бинарники Python python_pegged. Мы будем называть полученный с помощью ‘apt-get’ python3 python_sys.
Я также пытался запустить контейнер Docker ubuntu:18.04 из Ubuntu 24 — он имеет плохие характеристики производительности Ubuntu 24 и не ведет себя как Ubuntu 18, что заставляет меня думать, что пространство пользователя не отвечает за проблему.
Экспериментальные результаты:
Ubuntu 18.04.6 на железе python_sys 13 секунд
Ubuntu 18.04.6 на железе python_pegged 13 секунд
Ubuntu 18.04.6 на железе sysbench --test=cpu run 1288 событий/с
Ubuntu 24.04 на железе python_sys 83 секунды
Ubuntu 24.04 на железе python_pegged 112 секунд
Ubuntu 24.04 на железе sysbench --test=cpu run 925 событий/с
Контейнер docker ubuntu:18.04, размещенный на Ubuntu 24.04 python_sys 82 секунды
Контейнер docker ubuntu:18.04, размещенный на Ubuntu 24.04 python_pegged 112 секунд
В Ubuntu 24 следующие действия не оказали никакого эффекта:
- установить governor масштабирования на производительность
- tuned-adm профиль throughput-performance
- tuned-adm профиль virtual-host
- tuned-adm профиль balanced
Система имеет 40 физических ядер и 80 потоков. Я пытался запустить различные числа параллельных экземпляров.
параллельные экземпляры секунды
40 82..83
80 53..53
120 87..115
Меня удивляет, что 80 экземпляров работают быстрее, чем 40. Я проводил эксперимент несколько раз, и результаты никогда не менялись. Я пробовал различные профили tuned без эффекта. 53 секунды — все еще далеко от 13, полученных на ubuntu18.
Python сталкивается с чем-то затратным в ubuntu24, что sysbench не делает — или, по крайней мере, не в такой степени. Возможно, я начну использовать профайлер в ближайшем будущем, чтобы углубиться в проблему.
Тестирование различных промежуточных версий указывает на то, что регрессия произошла при обновлении с 21 до 22.
Результаты perf stat -a по команде python3:
Статистика | Ubuntu 20 | Ubuntu 22 |
---|---|---|
cpu-clock | 80% | 80% |
context-switches | 0.003 K / сек (3829) | 6.656 / сек (45238) |
cpu-migrations | 0 K / сек (3) | 0.039 / сек (268) |
page-faults | 0.001 K / сек (620) | 0.151 / сек (1029) |
cycles | 0.047 GHz | 0.034 GHz |
instructions | 3.34 insn / цикл | 0.88 insn / цикл |
branches | 30.703 М / сек | 5.329 М/сек |
branch-misses | 0.03% | 13.18% |
Заметные различия. Я не уверен, что 6 переключений контекста в секунду действительно влияют на результат. Количество инструкций в секунду, вероятно, является наиболее актуальной статистикой здесь.
Ответ или решение
Проблема, с которой вы столкнулись, действительно представляет собой интересный случай регрессии производительности между версиями Ubuntu. Давайте разберем возможные причины этой ситуации, а также пути ее решения.
Возможные причины низкой производительности:
-
Изменения в ядре Linux: Поскольку вы указали, что это началось с обновления с Ubuntu 21 на 22, есть вероятность, что изменения в ядре Linux (возможно, в планировщике задач или алгоритмах управления ресурсами) могут негативно влиять на производительность Python. Неправильная настройка управления производительностью или изменения в параметрах конфигурации ядра могут приводить к увеличению количества переключений контекста и ухудшению производительности.
-
Проблемы с интерпретатором Python: Хотя вы протестировали как системный Python (
python_sys
), так и собранный из исходников (python_pegged
), стоит проверить, используются ли в них одни и те же версии библиотек и компиляторов, так как несовместимость в библиотеках может также вызвать проблемы с производительностью. -
Регулирование частоты процессора: Поскольку вы упомянули, что изменение значений в
scaling_governor
не дало результата, возможно, стоит вручную установить частоту процессора на максимальное значение в BIOS/UEFI, чтобы исключить влияние режимов экономии энергии. -
Системные настройки и параметры tunning: Вы пробовали различные профили
tuned
, но стоит еще раз взглянуть на другие настройки системы. Например, связанные с CPU, памятью и I/O. Некоторые параметры могут быть не настроены оптимально для многопоточной нагрузки.
Рекомендации по устранению проблемы:
-
Профилирование кода: Используйте профилировщики, такие как
cProfile
илиline_profiler
, чтобы проанализировать, какие именно участки кода Python потребляют больше всего ресурсов. Это поможет определить конкретные узкие места. -
Тестирование с разными версиями ядра: Если возможно, попробуйте использовать промежуточные версии ядра между Ubuntu 18 и 24. Это позволит выяснить, с какой именно версией ядра возникли проблемы.
-
Параметры ядра: Изучите параметры ядра (в файле
/etc/sysctl.conf
или черезsysctl
), чтобы оптимизировать производительность. Например, параметры, такие какvm.swappiness
и настройки планировщика, могут значительно повлиять на производительность. -
Обновление и проверка библиотек: Убедитесь, что все используемые библиотеки и зависимости Python обновлены до последних стабильных версий. Иногда зависимые библиотеки могут влиять на производительность интерпретатора.
-
Использование других дистрибутивов или виртуализация: Если проблема становится критичной и не поддается решению, возможно, стоит рассмотреть возможность использования другой версии дистрибутива или виртуализации на более старых версиях Ubuntu, где это не является проблемой.
Заключение:
Ваша проблема является сложной и требует комплексного подхода к диагностике и устранению. Я рекомендую провести профилирование, взаимодействовать с сообществом Ubuntu и, возможно, даже обратиться к разработчикам ядра для более глубокого анализа изменений. Удачи в решении этой проблемы!