Медленная сборка Xcode для файлов .c и .m

После обновления OSX до High Sierra и обновления Xcode до 9.2.0 время сборки больших проектов вышло из-под контроля. Время сборки увеличилось с ~ 10 минут до ~ 120 минут.

Во время исследования я заметил, что Xcode порождает xcexec дочерних процессов, которые используют большую часть процессорного времени. xcexec тратят почти все время на вызов системы close. Каждый xcexec процесс вызывает около 2 миллионов вызовов закрытия в минуту.

После проверки двоичного файла xcexec это похоже на инструмент-оболочку для запуска других действий сборки (например, clang).

Я полностью переустановил Xcode без изменений. Система сборки установлена ​​по умолчанию.

Что вызывает такое поведение?


person Berik    schedule 02.02.2018    source источник


Ответы (1)


В инструкциях по установке watchman содержится указание вам установить kern.maxfiles следующим образом:

 $ sudo sysctl -w kern.maxfiles=10485760
 $ sudo sysctl -w kern.maxfilesperproc=1048576

Значение по умолчанию для (обоих) этих значений — 131072 в macOS High Sierra. Предложение Watchman — это 80-кратное изменение критической для производительности настройки вашего ядра. Изменение этих значений может привести к различным характеристикам производительности, особенно для тяжелых операций с файлами, таких как компиляция.

Watchman изменяет ограничение, чтобы одновременно можно было просматривать больше файлов.

Однако Xcode начнет индексировать ваш проект и откроет столько файлов, сколько разрешено (через kern.maxfiles). На этапе компиляции Xcode запускает xcexec, который закроет все дескрипторы открытых файлов для индексации и только затем запустит подпроцесс этапа сборки. Эта операция почти не займет времени. Но после изменения kern.maxfiles это внезапно происходит.

Я тестировал MBP в середине 2015 года, macOS 10.13.3, Xcode 9.2.0.

Согласно моему бенчмаркингу, kern.maxfilesperproc не влияет на производительность сборки Xcode.

Производительность сборок Xcode сильно снижается, как только kern.maxfiles превышает 327680.

Я рекомендую установить kern.maxfiles на (не больше) 327680, если вам нужно поддерживать сторож с большими проектами.

Обратите внимание, что настройка kern.maxfiles с sysctl не сохраняется при перезагрузке. Настройте значения в /Library/LaunchDaemons/limit.maxfiles.plist.

person Berik    schedule 02.02.2018
comment
этот раздел документации сторожа применим только к старым версиям macOS (10.6 и более ранние версии). Вы не должны применять эти конфигурации в более новых системах, так как сторож может использовать там fsevents, и для этого не нужны более высокие ограничения файлового дескриптора. - person Wez Furlong; 03.02.2018
comment
Спасибо, что нашли время написать это! Была такая же проблема после обновления до Мохаве. - person Alexandre G; 11.03.2019