LINUX.ORG.RU

Gentoo и оптимизация

 , ,


4

3

Привет, ЛОР. Не так давно собрал Gentoo на ноутбуке, флаги процессора подогнал, ядро оптимизировал насколько можно, но наслушался предупреждений от ветеранов(и даже на вики об этом сказано), что-де -O3 на всю систему лучше не ставить, как и флаги pgo, lto и graphite.

Но это, кажется, несколько устаревшие рекомендации. Знаю, что собирается так всегда дольше, но сам не пробовал. Копал поиск и наткнулся на вот это:

1) https://www.phoronix.com/scan.php?page=news_item&px=GentooLTO-28-Results 2) https://www.reddit.com/r/Gentoo/comments/8r8uqx/which_packages_are_worth_opti...

Вопрос к тем, кто пробовал гонять эти флаги: действительно ли -O3 толще -O2, и какой быстрее? Не ломает ли систему lto? Хочется протестировать их именно глобально, делая исключения для отдельных билдов, а не наоборот. Время терпит, но до Пн ноут должен быть боевой.

P.S на одном и том же железе генту потребляет где-то на 15% меньше памяти, чем арч. По скорости совсем чуть быстрее, на относительно современном оборудовании заметить тяжело. Разумеется, только при правильно подогнанном make.conf

Спасибо за советы.

★

Оптимизации graphite уже сто лет как безопасны. С тех пор, как вышел gcc-9.1.0, выставил в системе lto глобально, единственное исключение сделал для glibc. Python собран с pgo. Железо — X230 на i7. Всё работает, пожаловаться не могу.

beresk_let ★★★★★
()
Ответ на: комментарий от beresk_let

Спасибо, звучит обнадёживающе.

Эксперимента ради поставил firefox 67 на сборку с pgo и lto. Кажется, только-только он «закончил» собираться... Повиснув без всякого сообщения. Вижу, что portage его(firefox) вроде запустил, но процесс словно заморожен, потребление памяти стабильно и процессор - 0%. Висит так уже минут 5.

Так и должно быть или это ошибка? Боюсь прерывать, собирался 87 минут.

SM5T001 ★
() автор топика
Ответ на: комментарий от SM5T001

Посмотри по логам, чем он там занимается. Cкорее всего, как раз профилирует: в этом суть pgo. И я надеюсь, ты сам тулчейн с LTO уже собрал?

Кстати, используй ccache, чтобы ускорить пересборку: мало ли, какой капризный пакет тебе попадётся — придётся собирать заново с «безопасными» опциями.

beresk_let ★★★★★
()
Последнее исправление: beresk_let (всего исправлений: 1)

PGO ты не сможешь поставить глобально на систему, ebuild должен явным образом поддерживать его, ну и да, компиляция будет в 2 раза дольше, потому что приложение сперва скомпилируется, затем будет запущено чтобы сгенерировать профиль а затем уже повторно скомпилируется с учётом профиля.

LTO у меня давно стоит на всю систему, но некоторые пакеты с ним не собираются и приходится попакетно отключать. Этим оно очень хорошо - оно не вызывает крашей и ошибок в рантайме, проблемные пакеты просто не собираются.

Graphite я пробовал включать во времена GCC-5.0 приблизительно. И оно было очень багованное. Многие пакеты приходили в совершенно неюзабельное состояние из за него, например вим кромсал в лютейший треш любой файл, который я пытался в нём редактировать. Так что я его до сих пор побаиваюсь и не хочу включать.

Так же не рискую включать -O3.

eternal_sorrow ★★★★★
()
Ответ на: комментарий от beresk_let

Спасибо за наводку.

Пересобрал уже gcc, glibc и binutils, но сейчас понял, что забыл включить в последнем default-gold, потому включен просто gold. Его нужно тоже врубать, как я понимаю? Странно будет, если так.

SM5T001 ★
() автор топика
Ответ на: комментарий от SM5T001

Говорят, что gold с LTO лучше работает, чем bfd. Иногда это действительно имеет значение, но такое случается редко.

Пересобирать binutils не надо, достаточно

binutils-config --linker ld.gold

beresk_let ★★★★★
()
Ответ на: комментарий от vvn_black

i7 2670qm + 12гб RAM. Не сказал бы, что выдающиеся параметры, но на работу вполне достаточно.

Всё равно при сборке чуть-чуть уходит в своп, но это не так заметно, если включить zswap и BFQ

SM5T001 ★
() автор топика
Ответ на: комментарий от RazrFalcon
CFLAGS="${CFLAGS} -flto=4"
CXXFLAGS="${CXXFLAGS} -flto=4"
LDFLAGS="${LDFLAGS} -flto=4"

Вот тебе и весь ман. Вместо 4 подставь количество ядер в системе (или потоков, если ты тоже живёшь опасно и до сих пор не отключил SMT).
Насчёт 8.3.0 ничего не скажу, не пробовал. Знаю точно, что там флаг fno-plt сломан, но включать его глобально — передроч (и для xorg-server до сих пор нужно отключать).

beresk_let ★★★★★
()
Последнее исправление: beresk_let (всего исправлений: 2)
Ответ на: комментарий от beresk_let

То есть меняем make.conf и emerge -e?

или потоков, если ты тоже живёшь опасно и до сих пор не отключил SMT

Мне «повезло». У меня нет HT.

Насколько сильно оно бьёт по времени сборки? Как минимум в Rust lto может и в 2-3 раза медленнее быть.

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

То есть меняем make.conf и emerge -e?

Сперва, наверное, всё-таки пересобрать тулчейн, а потом уже emerge -e.

Насколько сильно оно бьёт по времени сборки?

Я на ночь оставил и спать лёг. С утра оно ещё шуршало, как с работы вернулся — уже пересобралось. Точное время не замерял.

beresk_let ★★★★★
()
Ответ на: комментарий от RazrFalcon

Не только: gcc, binutils и что у тебя там в роли стандартной библиотеки (glibc/uclibc/musl/whatever).

beresk_let ★★★★★
()
Ответ на: комментарий от RazrFalcon

gcc с pgo собирался где-то в 2 раза дольше. Судя по отзывам, с lto у билдов можно считать в 2.5 раза.

Впрочем, насколько я понял, это очень сильно зависит от конкретной конфигурации.

Буду тестировать с системой целиком, по результатам отпишусь. По крайней мере @system точно рискну пересобрать, благо это будет не настолько долго.

SM5T001 ★
() автор топика

-O3 и даже -Ofast можно всюду ставить - проблем и замедлений не встречал (разве что sqlite при сборке проверяет макрос __FAST_MATH__ и обижается). Наоборот, некоторый софт значительно ускоряется. «Предупреждения» эти устарели на 5-10лет.

Вот -flto или -fwhole-program не стоит ставить глобально - я встречал замедления работы софта от него.

-march=native ещё не забудь, ну или хотя бы -mavx или что твой проц максимльно поддерживает.

anonymous
()
Ответ на: комментарий от beresk_let

glibc в ебилде стрипает флаги (flag-o-matic.eclass), оставляя только -O2 -march=native -Wall -pipe и -Wl,--sort-common -Wl,--hash-style=gnu -Wl,--as-needed и т.п.

kickass ★
()
Ответ на: комментарий от anonymous

Наоборот, некоторый софт значительно ускоряется.

Хм, значит стоит попробовать, попытка не пытка.

-march=native ещё не забудь

Заметил, кстати, что часто рекомендуют ставить именно native вместо конкретного семейства процессора. КМК так, конечно, система получается универсальнее, но оптимизация будет страдать. Хотя мб я ошибаюсь и оно само подхватывает тип процессора когда можно. Но судя по логам при native это не так.

Сейчас использую именно -marc=*processorfamily*, всё работает отлично.

SM5T001 ★
() автор топика
Ответ на: комментарий от SM5T001

Нет, всё наоборот: native включает все опции под твой процессор. А «конкретное семейство» - нет.

anonymous
()
Ответ на: комментарий от SM5T001

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

Серьёзные пацаны упарываются по сборке каждого большого пакета, а на целую систему пилят некий надор стандартов (в силу своей компетенции).

Особо упоротые интересуются и набором программ, понимая, что LFS не их выбор, а свободы хочется - выбирают CRUX (много рутины сделано «за тебя»), пилят свой набор софта, костылей, ядер, условий компиляций (ярче, чем у Коровы. Gentoo в этом плане менее гибкая), и нагло плюют на любителей медитации «ради медитации».

n1rdeks ☆
()
Ответ на: комментарий от SM5T001

Но судя по логам при native это не так.

Я плакать... Ты, видимо, рано взялся за вопрос «оптимизации», если не читал, что делают данные флаги.

Куда катиццо мир? (взгрустнул)

n1rdeks ☆
()
Ответ на: комментарий от beresk_let

Оптимизации graphite уже сто лет как безопасны. С тех пор, как вышел gcc-9.1.0, выставил в системе lto глобально, единственное исключение сделал для glibc. Python собран с pgo. Железо — X230 на i7. Всё работает, пожаловаться не могу.

Вот только как работает?

n1rdeks ☆
()
Ответ на: комментарий от n1rdeks

Но никто не мешает вручную настроить CPU_FLAGS_X86.

Удивительно, но некоторые билды берут их вообще из USE, так что на всякий прописал и туда.

SM5T001 ★
() автор топика
Ответ на: комментарий от SM5T001

Ну спасибо ))) Я прямо и не знал, честно ))) Читать неплохо. В документации много написано.

Или просто ты начал, или знатный тролль )))

n1rdeks ☆
()
Ответ на: комментарий от SM5T001

Сейчас использую именно -marc=*processorfamily*, всё работает отлично.

Что это и зачем оно? Как это оптимизирует? В чем отличия от флага «native»?

Что будет, если поставить один флаг и тыцнуть флаги сборки, а потом второй? Какая будет разница?

n1rdeks ☆
()
Ответ на: комментарий от beresk_let

Да, сравни скорость работы с lto и без. LTO-то как раз нифига не безопасная оптимизация, хотя на вики про это ничего нет.

anonymous
()
Ответ на: комментарий от kickass

да эти флаги используются в 2-3 пакетах (чаще связано с работой кодировки видео, если не ошибаюсь, давно gentoo не видел)

n1rdeks ☆
()
Ответ на: комментарий от kickass

Ну так ты выставь flto и попробуй собрать. У меня не вышло, хотя flag-o-matic я не отключал.

beresk_let ★★★★★
()
Ответ на: комментарий от n1rdeks

Субъективно ухудшений не вижу. Я убедился, что система с такими настройками работает не хуже, чем раньше. Любопытство удовлетворено, и хватит с меня.

beresk_let ★★★★★
()
Последнее исправление: beresk_let (всего исправлений: 1)
Ответ на: комментарий от anonymous

Да, сравни скорость работы с lto и без.

Расскажешь, как измерить — сравню.

LTO-то как раз нифига не безопасная оптимизация

В 9.1.0 хорошо зделоли, грю маладца.

beresk_let ★★★★★
()
Ответ на: комментарий от beresk_let

тесты, тесты ))) Я вот считаю, что надо писать осмысленно флаги. Или не писать. В случае с https://wiki.gentoo.org/wiki/File:Larry-nefarius-v2.svg с данной личностью и её зоопарком на десктопе в общих настройках не зря рекомендуют всё усреднённое...

Ну и, конечно, я рад, что тебе повезло и ты не видишь разницы (а вот компиляция явно дольше :), так что реже обновляйся)

n1rdeks ☆
()
Ответ на: комментарий от n1rdeks

Я вот считаю, что надо писать осмысленно.

Я тоже так считаю. Поэтому и говорю: у меня не было задачи Заоптемезиравать™ всё, я другое проверял — взлетит оно или не взлетит. Взлетело.

тесты, тесты )))

Дядь, ну ты хоть расскажи тогда, какие тесты, сколько гонять, на что смотреть.

beresk_let ★★★★★
()

действительно ли -O3 толще -O2

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

и какой быстрее?

Зависит от собираемого кода, в каких-то случаях может вообще -Os быть быстрее всех

Не ломает ли систему lto?

Где-то видел черные списки, хотя мне хотелось бы увидеть белые, т.е. списки пакетов где это что-то дает кроме замедления сборки и потенциальных багов

annulen ★★★★★
()
Последнее исправление: annulen (всего исправлений: 1)
Ответ на: комментарий от beresk_let

Их два - первый «по времени», второй - «спасибо Татьяне за синий скрин» креш-тест. После флагов многие приложения работают нестабильно. На десктопе ты просто перезапускаешь, другие ситуации мы не рассматриваем.

n1rdeks ☆
()
Ответ на: комментарий от annulen

Всё, манул пришел, корм распугал. Пойду в другую тему...

n1rdeks ☆
()
Ответ на: комментарий от kickass

Выполнил вот это:

gcc -march=native -E -v - </dev/null 2>&1 | grep cc1

И получил, что native выдаёт вот такое:

l1-cache-size=32 --param l1-cache-line-size=64 --param l2-cache-size=6144 -mtune=sandybridge

Но он врёт, у меня не такой кеш. Более того, даже по инструкциям он немного привирает, если смотреть на выхлоп

grep -m1 ^flag /proc/cpuinfo | tr ' ' '\n' | sort

Или я чего-то не понял, или определяет native далеко не идеально. ЧЯДНТ?

SM5T001 ★
() автор топика
Ответ на: комментарий от n1rdeks

Ничего не понял.
Во-первых, по времени чего? Компиляции? Запуска? Исполнения? Если компиляции, то и так понятно, что с LTO будет дольше. Если исполнения, то как именно замерять (если мы не говорим о цифромолках типа архиваторов или кодеков)?
Во-вторых, я верно понимаю, что креш-тест — это проверка на то, что оно запускается и работает? В таком случае, этот тест система успешно выдерживает уже примерно месяц. Или речь о каком-то конкретном испытании?

beresk_let ★★★★★
()
Ответ на: комментарий от beresk_let

вот первое - это правильно, это «по нашему». Как и писал - «ВСЁ», что касается времени. Второе - это не только запуск, это нестабильная работа. Баги вылезают резко, бешенно и неожиданно.

n1rdeks ☆
()
Ответ на: комментарий от n1rdeks

«ВСЁ», что касается времени
Баги вылезают резко, бешенно и неожиданно.

Ну так я тебя спрашиваю: как протестировать, где методика-то? Как именно ты предлагаешь тестировать «ВСЁ» и что конкретно составляет это ВСЁ?

Можно абстрактно рассуждать о тестах, многократных измерениях, соблюдении идентичных условий, репрезентативной выборке и трёх сигмах, а также о нужности всего этого в настоящем исследовании. Однако:

  • я не утверждал, что описанные выше опции дают безусловный выигрыш;
  • я не заявлял, что получил какой-либо выигрыш;
  • моей целью было проверить работоспособность своей системы, собранной с такими настройками;
  • эта цель выполнена: я проверил, система работает.
beresk_let ★★★★★
()
Ответ на: комментарий от kickass

Скорость работы измеряется не в мегабайтах.

anonymous
()
Ответ на: комментарий от beresk_let

Собери с lto и без него какую-нибудь программу, что обсчитывает что-то со 100% загрузкой проца и замерь знимаемое ей время.

anonymous
()
Ответ на: комментарий от beresk_let

если мы не говорим о цифромолках

А что-то кроме них вообще кого-то интересует? Тот же браузер - цифромолка, запускай mozilla kraken.

anonymous
()
Ответ на: комментарий от annulen

Зависит от собираемого кода, в каких-то случаях может вообще -Os быть быстрее всех

Тут я, кончено немного перегнул, с большой долей вероятности -O3 будет самым быстрым, если только проигрыш от кэш-эффектов не перевесит выигрыш. Но прирост может быть очень незначительным, а кэш-эффекты какие-то все равно будут, плюс увеличение размеров бинарников и сопуствующее (небольшое, но все же) увеличение жора памяти, плюс дольше сборка, плюс возможны баги с новыми версиями компилятора

annulen ★★★★★
()
Ответ на: комментарий от anonymous

Тот же браузер - цифромолка

Не весь. JS-движок - да, отчасти цифромолка, но когда в дело включается JIT (а всякие кракены тестят его как раз, там цифромольные задачи на JS), то больше зависит от качества выхлопа JIT-компилятора, чем от того, насколько заоптимизирован сам компилятор при его сборке.

annulen ★★★★★
()
Ответ на: комментарий от anonymous

Ответ всё ещё на уровне «ну протестируй там как-нибудь, придумай, — а мы тебе потом расскажем, почему твой тест никуда не годится».

Что делать-то будем? JSON парсить, видео кодировать, исходники ядра паковать, что? Чем конкретно, какой программой? С какими опциями? В каких условиях? Сколько раз? Чем будем время замерять: простого time хватит, или нужно что-то похитрее?

beresk_let ★★★★★
()
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.