четверг, 21 марта 2013 г.

Настройка make.conf

В  Gentoo-like дистрибутивах настройки для всех собираемых программ указаны в файле /etc/make.conf. Здесь указаны глобальные флаги компиляции (уровень оптимизации, процессор, набор инструкций процессора, размер кэша и еще всякое), опции для пакетного менеджера, USE-флаги (расширяют или уменьшают функциональность программ), доступные локализации, архитектура ну и еще немного по мелочи.

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

Содержимое моего /etc/make.conf выглядит приблизительно так:

ACCEPT_LICENSE="*"
source /var/lib/layman/make.conf
CFLAGS="-O2 -march=native -pipe -ffast-math"
CXXFLAGS="${CFLAGS}"
MAKEOPTS="-j3 -s"
EMERGE_DEFAULT_OPTS="--jobs=2 --load-average=5"
LINGUAS="en ru ru_RU"
USE="-cli -libnotify -gimp -ipod -bluetooth -wifi -cups mmx sse sse2 sse3 3dnow 3dnowext mmxext"
VIDEO_CARDS="vesa nouveau fglrx radeon"
FEATURES="ccache"
CCACHE_DIR="/var/tmp/ccache"
CCACHE_SIZE="3G"
PORTAGE_NICENESS="15"


Строка ACCEPT_LICENSE="*" показывает список допустимых лицензий. Здесь звездочка(*) указывает что допустимы любые лицензии - вероятно, наиболее правильный выбор, если вы не заморачиваетесь правильностью свободы софта.

Строку source /var/lib/layman/make.conf не нужно трогать, оставьте как есть.

Следующие две строки задают настройки компиляции программ, использующих компилятор gcc:

CFLAGS="-O2 -march=native -pipe -ffast-math"
CXXFLAGS="${CFLAGS}"


Первый параметр указывает уровень оптимизации программы. Всего таких уровней существует 5.

-O0    оптимизация отключена

-O(-O1)    включает оптимизацию. Компилятор пытается уменьшить размер кода и ускорить работу программы (увеличивается время компиляции).
Активируются следующие флаги (могут использоваться и другие специфичные флаги): -fauto-inc-dec -fcprop-registers -fdce -fdefer-pop -fdelayed-branch -fdse -fguess-branch-probability -fif-conversion2 -fif-conversion -finline-small-functions -fipa-pure-const -fipa-reference -fmerge-constants -fsplit-wide-types -ftree-builtin-call-dce -ftree-ccp -ftree-ch -ftree-copyrename -ftree-dce -ftree-dominator-opts -ftree-dse -ftree-fre -ftree-sra -ftree-ter -funit-at-a-time
-O2    следующий уровень оптимизации. GCC выполняет почти все поддерживемые оптимизации (кроме ускорения выполнения за счет увеличения кода). Не выполняется раскрутка циклов и подстановка функций. Еще больше увеличивается время компиляции и эффективность кода
Активируются все флаги уровня -O1, а также следующие: -fthread-jumps -falign-functions -falign-jumps -falign-loops -falign-labels -fcaller-saves -fcrossjumping -fcse-follow-jumps -fcse-skip-blocks -fdelete-null-pointer-checks -fexpensive-optimizations -fgcse -fgcse-lm -findirect-inlining -foptimize-sibling-calls -fpeephole2 -fregmove -freorder-blocks -freorder-functions -frerun-cse-after-loop -fsched-interblock -fsched-spec -fschedule-insns -fschedule-insns2 -fstrict-aliasing -fstrict-overflow -ftree-switch-conversion -ftree-pre -ftree-vrp

-O3    максимальный уровень оптимизации. Еще немного увеличивает время компиляции и немного повышает эффективность кода, но может быть и обратный эффект - производительность программы может упасть.
Активируются все флаги уровня -O2, а также следующие: -finline-functions -funswitch-loops -fpredictive-commoning -fgcse-after-reload -ftree-vectorize

-Os    оптимизация по размеру. Компилятор пытается уменьшить размер кода. Активируются в основном те флаги из -O2, которые не увеличивают размер выходного файла.
Отключаются следующие флаги: -falign-functions -falign-jumps -falign-loops -falign-labels -freorder-blocks -freorder-blocks-and-partition -fprefetch-loop-arrays -ftree-vect-loop-version

-Ofast    еще один уровень оптимизации, добавленный в gcc >= 4.6. Как следует из названия, служит для ускорения работы программ.
Активируются все флаги из -O3, а также флаг -ffast-math.

Флаг -ffast-math разрешает компилятору нарушать некоторые ANSI или IEEE правила и/или спецификации в интересах оптимизации кода по скорости выполнения (например, предполагать что параметры функции sqrt - неотрицательные числа). Следует учитывать, что некоторые пакеты могут с этой опцией не собраться.

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

Флаг -pipe заставляет компилятор передавать промежуточные данные через конвеер в оперативной памяти (разгружает HDD). Вобщем, нужна почти всегда.

Есть в указании флагов компиляции и свои правила:
    - если флаги противоречат друг другу, то силу имеет флаг указанный последним;
    - опции, начинающиеся с -f, -m, -W можно отключить, добавив префикс no- (например, если есть флаг -f(опция), то отключить его можно так -fno-(опция)).

Строка MAKEOPTS="-j3 -s" задает опции команды make:
    -j3 - задает количество запускаемых копий make, рекомендуемое значение количество_процессоров(ядер, потоков)+1 или удвоенное_количество_процессоров(ядер, потоков)+1;
    -s - уменьшает количество информации, выводимой make - немного ускоряет сборку.

Строка EMERGE_DEFAULT_OPTS="--jobs=2 --load-average=8" задает опции для менеджера пакетов:
    --jobs=2 - количество одновременно собираемых пакетов, ведь часто встречаются пакеты, которые собираются в один поток (вероятно, должен равняться количеству процессоров);
    --load-average=5 - число блокирующих процессов в очереди на исполнение (блокирующий процесс - процесс, ожидающий ресурсов (процессор, дисковая подсистема ввода/вывода, сеть) для продолжения работы; соответственно параметр - это максимальное значение при котором emerge будет запускать дополнительные процессы. Параметр не до конца познан - находится в процессе познания. Система может виснуть при 3 и нормально/удовлетворительно работать при 8.
   
Строка LINGUAS="en ru ru_RU" понятна и описывает доступные локализации. ru_RU нужет для smplayer (может еще для чего), иначе он не знает русского.

Строка USE="-cli -libnotify -gimp -ipod -bluetooth -wifi -cups mmx sse sse2 sse3 3dnow 3dnowext mmxext" - так называемые USE-флаги ("-" отключает флаг, без минуса - флаг включен). Они нужны для управления зависимостями и уменьшают/расширяют функциональность приложений:
    - флаги "-cli" и "-libnotify" - это попытка настроить шрифты, отдельная большая тема (следует заметить, что в Calculate со шрифтами все нормально, но неправильно отображаются некоторые pdf файлы - в основном сервис мануалы и даташиты на какие нибудь микрухи, хотя проще установить acroreader);
    - флаги "-gimp -ipod -bluetooth -wifi -cups" отключают то, что написано - я не пользуюсь GIMP, iPod, у меня нет bluetooth и wi-fi, нет принтера (по идее отвалится также экспорт в pdf, например в libreoffice);
    - флаги "mmx sse sse2 sse3 3dnow 3dnowext mmxext" - это наборы инструкций, наличествующие в моем процессоре.
USE-флагов много и все для чего-нибудь нужны - непаханое поле для настройки. Можно также указывать USE-флаги отдельно для пакета, но не здесь.

Строка VIDEO_CARDS="vesa nouveau fglrx radeon" доступные драйвера видеокарт. Скажем, если у вас встроенное видео intel, то вам не нужны драйвера для карт nvidia и AMD. Здесь:
    - vesa - универсальный драйвер для почти любой видеокарты - медленный но должен работать почти везде;
    - nouveau - свободный драйвер для видеокарт nvidia, разрабатывается сообщесвом, не поддерживает 3D (есть еще проприетарый драйвер - там работает все и вроде бы нормально/удовлетворительно) -  держу для встроенного в материнскую плату видео;
    - fglrx - проприетарный драйвер для карт AMD/ATI, работает нормально, но косяки присутствуют;
    - radeon - свободный драйвер для карт AMD/ATI, разрабатывается сообществом, поддержка 3D хреновая.
   
Для ускорения компиляции можно использовать программу ccache. Она прилично ускоряет обновление, установку программ и полную пересборку системы в случае совпадения исходного кода при повторной компиляции, что происходит в большинстве случаев, так как обычно даже в новых пакетах достаточно много не измененного исходного кода. Для этого добавлены следующие строки:
   
FEATURES="ccache"
CCACHE_DIR="/var/tmp/ccache"
CCACHE_SIZE="3G"


Для начала программу ccache нужно установить:
   
# emerge ccache

Строка CCACHE_SIZE="3G" устанавливает размер кэша программы - обычно достаточно 2 ГБ, по умолчанию установлено 1 ГБ.

Для просмотра статистики кэша компиляции можно воспользоваться командой:
   
# CCACHE_DIR="/var/tmp/ccache" ccache -s
Строка PORTAGE_NICENESS="15" указывает с каким приоритетом должен запускаться emerge - это т. н. фактор уступчивости, чем он выше тем ниже приоритет процесса (выше уступчивость). Диапазон параметра от -20 до 19. Обычно программы запускаются с фактром уступчивости равным нулю (такая себе золотая середина), но emerge в процессе компиляции пакетов может нехило подвешивать систему, поэтому было нагуглено значение 15.

В первом приближении с настройкой /etc/make.conf покончено. Теперь предстоит долгий этап тестирования и поиска "неверных" рекомендаций.

Комментариев нет:

Отправить комментарий