بهینهسازی کارایی در Gentoo — فلگهای کامپایل، MAKEOPTS و ccache
آموزش کامل بهینهسازی Gentoo: COMMON_FLAGS با march=native و O2، MAKEOPTS، ccache، EMERGE_DEFAULT_OPTS، LTO، تنظیم swappiness و I/O scheduler.
Gentoo بهخوبی بهدلیل امکان بهینهسازی کد منبع برای سختافزار مشخص شناخته میشود. در این مستند با فلگهای کامپایل، MAKEOPTS، ccache، LTO و تنظیمات کرنل برای کارایی بهتر آشنا میشویم. مهم است بدانید که بهینهسازی بیشازحد میتواند باعث ناپایداری شود؛ از پروفایلها و فلگهای آزمایششده استفاده کنید.
فلگهای کامپایل در make.conf
فایل /etc/portage/make.conf محل تنظیم متغیرهای کامپایل است:
nano /etc/portage/make.conf# /etc/portage/make.conf
# فلگهای مشترک کامپایل
COMMON_FLAGS="-march=native -O2 -pipe"
# C و C++
CFLAGS="${COMMON_FLAGS}"
CXXFLAGS="${COMMON_FLAGS}"
# FC (Fortran)
FCFLAGS="${COMMON_FLAGS}"
FFLAGS="${COMMON_FLAGS}"
# تعداد کار کامپایل موازی
MAKEOPTS="-j$(nproc) -l$(nproc)"
# گزینههای پیشفرض emerge
EMERGE_DEFAULT_OPTS="--ask --keep-going --quiet-build=y"
# فعالکردن ccache
FEATURES="ccache parallel-install"
# مسیر ccache
CCACHE_DIR="/var/cache/ccache"توضیح فلگها
| فلگ | معنی | توصیه |
|---|---|---|
-march=native | تولید کد برای CPU دقیق شما (AVX، SSE4 و...) | پیشنهادی |
-O2 | سطح بهینهسازی استاندارد (سرعت + اندازه) | پیشنهادی |
-O3 | بهینهسازی بیشتر، گاهی خطرناک | احتیاط |
-Os | بهینهسازی برای اندازه | برای سرور embedded |
-pipe | استفاده از pipe بهجای فایل موقت (سریعتر) | پیشنهادی |
-fomit-frame-pointer | حذف frame pointer (سرعت بیشتر، دیباگ سختتر) | اختیاری |
-flto | Link-Time Optimization (سریعتر، کند کامپایل) | احتیاط |
-O3 خطرناک است
-O3 میتواند باعث شکست کامپایل برخی بستهها یا رفتار غیرعادی شود. حتی پروژههای بزرگ مانند Firefox و Chromium بهطور رسمی -O2 را توصیه میکنند. اگر اصرار دارید، آن را بهصورت per-package اعمال کنید:
# /etc/portage/env/O3.conf
CFLAGS="-march=native -O3 -pipe"
CXXFLAGS="${CFLAGS}"
# /etc/portage/package.env
media-video/ffmpeg O3.confMAKEOPTS و کامپایل موازی
MAKEOPTS کنترل میکند چند کار همزمان اجرا شود. پیشنهاد Gentoo -j<#CPU+1> بود اما در سیستمهای مدرن با RAM محدود، بهتر است از -l (load average) استفاده کنید:
# مشاهده تعداد CPU
nproc
# خروجی: 8
# تنظیم MAKEOPTS
MAKEOPTS="-j8 -l8"
# -j8: حداکثر ۸ کار موازی
# -l8: اگر load average سیستم به ۸ رسید، کار جدید ندهRAM و MAKEOPTS
هر کار کامپایل میتواند تا ۲ گیگابایت RAM مصرف کند. اگر سیستم ۸ گیگابایت RAM و ۸ CPU دارد، -j4 امنتر از -j8 است. فرمول تجربی: RAM_GB / 2 برای تعداد کارها. برای برقراری تعادل بین سرعت و فشار سیستم میتوانید از MAKEOPTS="-j$(nproc) -l$(nproc)" استفاده کنید.
ccache — کش کامپایل
ccache خروجی کامپایل را کش میکند؛ اگر فایل منبع تغییر نکند، از کش استفاده میشود. برای توسعهدهندگان که بارها همان بسته را کامپایل میکنند، بسیار مفید است:
# نصب
emerge --ask dev-util/ccache
# [ebuild N ] dev-util/ccache-4.10.2
# فعالسازی در make.conf
# FEATURES="ccache" (قبلاً اضافه شد)
# CCACHE_DIR="/var/cache/ccache"
# ساخت دایرکتوری و تنظیم حجم
mkdir -p /var/cache/ccache
ccache -M 50G # حجم کش ۵۰ گیگابایت
# Set cache size limit to 50.0 GB
# بررسی آمار
ccache --show-stats
# Summary:
# Cacheable calls: 12345
# Hits: 9876 (80.0%)
# Misses: 2469
# Errors: 0ccache برای همه بستهها مناسب نیست
برخی بستهها (مثل glibc، GCC، خود ccache) نباید با ccache کامپایل شوند. Portage بهطور خودکار این بستهها را از ccache مستثنی میکند (فایل /etc/portage/package.env/ccache). اگر بستهای بهطور عجیبی شکست میخورد، با FEATURES="-ccache" emerge PACKAGE آن را بدون کش امتحان کنید.
EMERGE_DEFAULT_OPTS
این متغیر گزینههای پیشفرض emerge را تنظیم میکند. نمونه مفید:
# /etc/portage/make.conf
EMERGE_DEFAULT_OPTS="--ask --keep-going --quiet-build=y --with-bdeps=y"| گزینه | کاربرد |
|---|---|
--ask (-a) | تأیید قبل از نصب |
--keep-going | در صورت شکست یک بسته، بقیه ادامه میدهند |
--quiet-build=y | خروجی کامپایل را فیلتر میکند |
--with-bdeps=y | وابستگیهای build را هم بهروز میکند |
--verbose (-v) | نمایش جزئیات |
--binpkg-respect-use=y | استفاده از بسته باینری فقط اگر USE flagها مطابق باشند |
بستههای باینری (binhost)
اگر میخواهید سرعت نصب را افزایش دهید، میتوانید از بستههای باینری آماده استفاده کنید. Gentoo این امکان را با getbinpkg فراهم میکند:
# /etc/portage/make.conf
FEATURES="getbinpkg"
PORTAGE_BINHOST="https://gentoo.osuosl.org/experimental/amd64/binpkg/default/linux/23.0/"# نصب باینری (اگر موجود باشد)
emerge --ask --getbinpkg firefox
# خروجی:
# Fetching binary package info...
# [binary N ] www-client/firefox-128.5.0 55.3 MBbinhost محلی
اگر چند ماشین Gentoo دارید، میتوانید روی یک ماشین قوی کامپایل کنید و بستههای باینری را از طریق HTTP برای بقیه ماشینها سرو کنید:
# روی سرور کامپایل
FEATURES="buildpkg" emerge -uDN @world
# بستهها در /usr/portage/packages ذخیره میشوند
# سرو با nginx یا python -m http.server
# روی کلاینت:
# PORTAGE_BINHOST="http://build-server:8080/"این روش برای سازمانهایی که دهها ماشین مشابه دارند، صرفهجویی بزرگی به همراه دارد.
LTO (Link-Time Optimization)
LTO بهینهسازی در زمان لینک است؛ میتواند ۵-۱۰٪ کارایی اضافه کند اما زمان کامپایل را بهشدت افزایش میدهد و با برخی بستهها مشکل دارد:
# فعالسازی LTO برای کل سیستم (احتیاط!)
# /etc/portage/make.conf
USE="lto"
# بازسازی
emerge -avuDN @worldبهتر است LTO را بهصورت per-package اعمال کنید:
# /etc/portage/env/lto.conf
CFLAGS="${CFLAGS} -flto"
CXXFLAGS="${CXXFLAGS} -flto"
LDFLAGS="${LDFLAGS} -flto"
# /etc/portage/package.env
media-video/ffmpeg lto.conf
media-libs/x264 lto.conf
sys-libs/zlib lto.confLTO میتواند سیستم را بشکند
LTO با برخی بستهها (بهخصوص GCC، glibc، Rust، LLVM) مشکل دارد. اگر سیستم ناپایدار شد، با USE="-lto" emerge -avuDN @world آن را غیرفعال کنید. اول در یک محیط آزمایشی تست کنید.
Profile-Guided Optimization (PGO)
PGO با اجرای نمونه پروفایل میگیرد و کد را بر اساس الگوی استفاده واقعی بهینه میکند. مرورگرها بیشترین بهره را از PGO میبرند. در Gentoo، Firefox و Chromium میتوانند با PGO کامپایل شوند:
# برای Firefox
echo "www-client/firefox pgo" >> /etc/portage/package.use/firefox
emerge --ask www-client/firefox
# زمان کامپایل بهشدت افزایش مییابد (چند ساعت)تنظیمات کرنل برای کارایی
swappiness
vm.swappiness کنترل میکند کرنل چقدر متمایل است بهجای cache، صفحه را swap کند:
# مشاهده مقدار فعلی
sysctl vm.swappiness
# vm.swappiness = 60 (پیشفرض)
# تنظیم موقت روی ۱۰ (برای دسکتاپ با RAM کافی)
sysctl -w vm.swappiness=10
# دائمی
echo "vm.swappiness=10" >> /etc/sysctl.d/99-performance.conf| مقدار | توصیه |
|---|---|
| ۰-۱۰ | دسکتاپ با RAM زیاد (حداقل swap) |
| ۱۰-۳۰ | سرور عمومی |
| ۳۰-۶۰ | سرور پایگاه داده |
| ۶۰-۱۰۰ | سیستم با RAM کم |
I/O scheduler
برای SSD، scheduler بهینه mq-deadline یا none است؛ برای HDD، bfq:
# مشاهده scheduler فعلی
cat /sys/block/sda/queue/scheduler
# [mq-deadline] kyber bfq none
# تنظیم موقت
echo "mq-deadline" > /sys/block/sda/queue/scheduler
# دائمی با udev rule
# /etc/udev/rules.d/60-io-scheduler.rules
# ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="mq-deadline"
# ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="bfq"
udevadm control --reload-rulesکنترل فرآیندها با nice و ionice
برای جلوگیری از اینکه یک کار سنگین سیستم را قفل کند:
# اجرای emerge با اولویت پایین CPU
nice -n 19 emerge -uDN @world
# اجرای با اولویت پایین I/O هم
nice -n 19 ionice -c 3 emerge -uDN @world
# یا با cpulimit (نصب: emerge sys-process/cpulimit)
cpulimit -p 1234 -l 50 # محدود به ۵۰٪ CPU| ابزار | کاربرد |
|---|---|
nice | اولویت CPU |
ionice | اولویت I/O |
cpulimit | محدودکردن درصد CPU |
cgroups | محدودکردن منابع گروه پردازشی |
taskset | تخصیص CPU مشخص |
جدول بهینهسازیها
| بهینهسازی | سود | خطر | توصیه |
|---|---|---|---|
-march=native | ۵-۱۰٪ کارایی | پایین | بله |
-O2 | استاندارد | بدون | بله |
-O3 | ۲-۵٪ | متوسط | per-package |
-pipe | سرعت کامپایل | بدون | بله |
MAKEOPTS -j | سرعت کامپایل | پایین (RAM) | بله |
| ccache | ۸۰٪ سرعت کامپایل | پایین | بله |
| binhost | نصب سریع | بدون | برای چند ماشین |
| LTO | ۵-۱۰٪ کارایی | بالا | per-package |
| PGO | ۵-۲۰٪ کارایی | متوسط | برای مرورگر |
| swappiness=10 | واکنشپذیری | بدون | بله |
| mq-deadline SSD | I/O کارایی | بدون | بله |
خطاهای رایج
۱. کامپایل با out of memory شکست میخورد
cc: internal compiler error: Killed (program cc1)دلیل: MAKEOPTS خیلی بالا تنظیم شده و RAM تمام شده. راهحل:
# کاهش -j
MAKEOPTS="-j4 -l4"
# یا اضافهکردن swap موقت
fallocate -l 8G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile۲. بسته با -O3 یا LTO شکست میخورد
دلیل: فلگهای تهاجمی با برخی کدها ناسازگارند. راهحل:
# غیرفعالکردن برای آن بسته خاص
# /etc/portage/env/no-opt.conf
CFLAGS="-march=native -O2 -pipe"
CXXFLAGS="${CFLAGS}"
LDFLAGS=""
# /etc/portage/package.env
sys-devel/gcc no-opt.conf
dev-lang/rust no-opt.conf۳. ccache پر شده و دیسک پر میکند
# بررسی حجم
du -sh /var/cache/ccache
# 50G /var/cache/ccache
# کاهش حجم کش
ccache -M 20G
# پاکسازی کامل
ccache -C
# Cleared cacheبهینهسازی بیشازحد
بهینهسازی افراطی (LTO + PGO + -O3 + march=native روی همه چیز) میتواند سیستم را ناپایدار کند و سود کمی بدهد. پروفایلهای پیشفرض Gentoo طی سالها آزمایش شدهاند و بهترین تعادل را دارند. اگر نمیدانید چه میکنید، از -march=native -O2 -pipe و ccache شروع کنید و بقیه را دستنخورده بگذارید.
خلاصه و مرحله بعد
بهینهسازی Gentoo شامل سه لایه است: فلگهای کامپایل (COMMON_FLAGS="-march=native -O2 -pipe")، سرعت کامپایل (MAKEOPTS و ccache) و تنظیمات کرنل (swappiness و I/O scheduler). برای سود بیشتر میتوانید از LTO و PGO استفاده کنید اما با احتیاط. بهترین توصیه: ساده نگهدارید و به پروفایلهای رسمی اعتماد کنید.
برای درک معماری Gentoo به آموزش معماری Gentoo و برای کنترل کامل USE flagها به آموزش USE Flags مراجعه کنید. برای مدیریت بستهها و گزینههای Portage، آموزش Portage را ببینید. اگر بستهای پس از بهینهسازی شکست خورد، آموزش عیبیابی کمک میکند.
این صفحه در تاریخ ۱ تیر ۱۴۰۵ بهروزرسانی شده است.