</>

لینوکس‌پارسی

مرجع فارسی آموزش لینوکس

Gentoo • Arch • Debian • Ubuntu • Kali • Parrot
پرش به محتوای اصلی

Command Palette

Search for a command to run...

بهینه‌سازی کارایی در 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 (سرعت بیشتر، دیباگ سخت‌تر)اختیاری
-fltoLink-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.conf

MAKEOPTS و کامپایل موازی#

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:             0

ccache برای همه بسته‌ها مناسب نیست

برخی بسته‌ها (مثل 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 MB

binhost محلی

اگر چند ماشین Gentoo دارید، می‌توانید روی یک ماشین قوی کامپایل کنید و بسته‌های باینری را از طریق HTTP برای بقیه ماشین‌ها سرو کنید:

# روی سرور کامپایل
FEATURES="buildpkg" emerge -uDN @world
 
# بسته‌ها در /usr/portage/packages ذخیره می‌شوند
# سرو با nginx یا python -m http.server
# روی کلاینت:
# PORTAGE_BINHOST="http://build-server:8080/"

این روش برای سازمان‌هایی که ده‌ها ماشین مشابه دارند، صرفه‌جویی بزرگی به همراه دارد.

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.conf

LTO می‌تواند سیستم را بشکند

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 SSDI/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 را ببینید. اگر بسته‌ای پس از بهینه‌سازی شکست خورد، آموزش عیب‌یابی کمک می‌کند.

اشتراک‌گذاری:

این صفحه در تاریخ ۱ تیر ۱۴۰۵ به‌روزرسانی شده است.