Почему дистрибутивы Linux имеют разную производительность?

Обратите внимание на формулировку в руководстве Bash :«все переменные помечены для экспорта». Под «средой» процесса мы подразумеваем то, что передается в параметре envpсистемного вызова execve, и только то, что передается через этот параметр. Остальное просто иллюзия. Вызывающий процесс (оболочки или любой другой тип процесса )может делать с полученными переменными все, что захочет, в соответствии с документально подтвержденным поведением. Он может передать полученные переменные подпроцессу или не делать этого.

Во всем этом я стремлюсь к тому, чтобы не было волшебного блока переменных среды, который автоматически передается в тени от родительского процесса к его дочерним. Родительский процесс может делать со своим «окружением» все, что захочет, разбивать его на части, шифровать в памяти, копировать по какому-то другому адресу в пространстве процесса (, что делает Bash )и т. д. Не может быть быть каким-либо внешним механизмом или механизмом ядра для проверки окружения процесса (ждать — читайте комментарий к /proc/PID/environниже ). Единственное, что имеет значение, это то, что экспортирующий процесс должен собирать кусочки и передавать среду своим дочерним процессам в соответствии со своими собственными правилами; в случае Bash правила перечислены в руководстве Bash.

Это означает, что файл /proc/$$/environвводит в заблуждение. Он не отражает никаких изменений в окружении оболочки, а просто сообщает, что получила оболочка, когда она была execизменена родительским процессом.

1
19.02.2020, 19:51
2 ответа

Вот факторы, которые приходят мне в голову:

  • Конфигурация ядра
  • Выбор ЦП и планировщика ввода-вывода
  • Сколько приложений запущено одновременно после загрузки системы
  • Флаги компилятора, используемые при компиляции ядра
  • Флаги компилятора, используемые при компиляции приложений, используемых в тестах
  • Компилятор (GCC против Clang против ICC, старый GCC против нового GCC)
  • Подкачка
  • Выбор файловой системы (ext4, XFS, BTRFS, ZFS)
  • Конфигурация диска (Программный RAID)

Что касается Clear Linux, они гордятся:

  • Оптимизация флагов компиляции
  • Использование последнего ядра Linux
  • Исправление ядра с помощью специальных исправлений для повышения производительности
  • Использование инструкций AVX512, если ЦП может их поддерживать (, что имеет огромное значение)

Использование полного набора инструкций, который может предложить ЦП, оказывает значительное влияние.

Для сравнения, Arch Linux (и Manjaro )поставляют ядро, библиотеки и исполняемые файлы, скомпилированные с помощью GCC, для универсального 64-битного -x86-процессора(-march=x86-64 -mtune=generic). Это дает хорошую производительность, но не такую ​​хорошую, как исполняемые файлы, скомпилированные специально для процессора, на котором они работают.

Использование инструмента elfx86exts в /usr/bin/lsв Arch Linux показывает, какие инструкции ЦП необходимы, как минимум:

$ elfx86exts /usr/bin/ls
MODE64 (call)
CMOV (cmovne)
SSE2 (movdqa)
SSE1 (movups)
CPU Generation: Intel Core

У меня не было возможности попробовать то же самое в Clear Linux, но я предполагаю, что появится более длинный список инструкций.

Подводя итог, исправление ядра и настройка конфигурации ядра дают хорошие результаты, но, что более важно, поддержка доступных инструкций ЦП имеет большое значение.

2
28.04.2021, 23:23

Прирост производительности от ручной настройки флагов компиляции сильно переоценен. И стоимость не -тривиальна (, если вы скомпилируете одну конфигурацию, адаптированную для вашей машины, я другую для своей, любые ошибки, на которые вы наткнетесь, будут только вашими, вероятно, у меня будет свой собственный набор, за одного ).

Возьмите книгу Бентли «Написание эффективных программ» (, к сожалению, давно вышедшую из печати )или его «Жемчужины программирования» (, 2-е издание ). Реального прироста производительности добиться гораздо труднее, и он на порядки выше.

0
28.04.2021, 23:23

Теги

Похожие вопросы