DevOps and Infrastructure

باز کردن قفل عملکرد اوج: راهنمای جامع بهینه‌سازی عملکرد لینوکس

در دنیای DevOps و مدیریت زیرساخت، عبارت «کافی بودن» اغلب دشمنِ حالت بهینه است. با مقیاس‌پذیری سیستم‌ها، پیکربندی‌های پیش‌فرض ارائه‌شده توسط توزیع‌های لینوکس—که اگرچه پایدار و امن هستند—ممکن است برای نیازهای کاری خاص برنامه‌های مدرن با تراکم (Throughput) بالا تنظیم نشده باشند. چه موتورهای معامله با فرکانس بالا، پایگاه‌داده‌های مقیاس‌بزرگ، یا پلتفرم‌های ارکستراسیون کانتینر را اجرا می‌کنید، درک مکانیسم‌های زیربنایی کرنل لینوکس برای استخراج حداکثر عملکرد ضروری است.

این راهنما فراتر از ارتقای ساده سخت‌افزار می‌رود تا به بررسی تنظیمات سطح نرم‌افزار بپردازد. ما به حوزه‌های حیاتی مانند مدیریت حافظه، ورودی/خروجی (I/O) فایل سیستم، بهینه‌سازی لایه شبکه و زمان‌بندی فرآیندها عمیق می‌شویم و استراتژی‌های عملیاتی را برای بهبود پاسخگویی و تراکم سیستم به شما ارائه می‌دهیم.

درک زیرسیستم حافظه

مدیریت حافظه اغلب اولین گلوگاه در سیستم‌های لینوکس است. قاتل حافظه خارج از ظرفیت (OOM) کرنل و مدیریت تهاجمی آن از حافظه پنهان صفحه (Page Cache) گاهی اوقات می‌تواند منجر به عملکرد نامطلوب تحت بار کاری سنگین شود. ابزار اصلی برای تعامل با رفتار حافظه کرنل، /proc/sys/vm است.

یکی از تأثیرگذارترین پارامترهایی که باید در نظر گرفته شود vm.swappiness است. این پارامتر تمایل کرنل را برای انتقال فرآیندها از حافظه فیزیکی به دیسک Swap کنترل می‌کند. یک مقدار بالا (نزدیک به ۶۰، که پیش‌فرض است) تعویض (Swapping) را تشویق می‌کند که برای برنامه‌های حساس به عملکرد مضر است. برای بیشتر سرورهای پایگاه‌داده و برنامه، کاهش این مقدار به ۱ یا ۱۰ به طور قابل توجهی زمان‌های انتظار I/O ناشی از تعویض دیسک را کاهش می‌دهد.

# تغییر موقت swappiness به 1
sudo sysctl vm.swappiness=1

# اعمال تغییر به صورت پایدار پس از راه‌اندازی مجدد
echo "vm.swappiness=1" | sudo tee -a /etc/sysctl.conf

پارامتر حیاتی دیگری vm.dirty_ratio و vm.dirty_background_ratio هستند. این‌ها درصدی از حافظه سیستم را که می‌تواند صفحات کثیف (اصلاح‌شده اما هنوز نوشته‌نشده روی دیسک) را نگه دارد، تعریف می‌کنند. اگر این مقادیر خیلی بالا باشند، شما در معرض خطر یک جهش ناگهانی و عظیم در I/O قرار می‌گیرید زمانی که کرنل تصمیم می‌گیرد این صفحات را تخلیه کند که باعث افزایش تأخیر می‌شود. کاهش vm.dirty_background_ratio به ۵-۱۰ الگوی نوشتن هموارتر و پیوسته‌تری را تضمین می‌کند.

بهینه‌سازی عملکرد شبکه

برای میکروسرویس‌ها و دروازه‌های API، تأخیر شبکه و تراکم اتصالات حیاتی هستند. لایه TCP در لینوکس از طریق /proc/sys/net/ به شدت قابل پیکربندی است. یک مشکل رایج در محیط‌های با همزمانی بالا، تخلیه پورت‌های موقت (Ephemeral Ports) است. شما می‌توانید محدوده پورت‌های موجود را با استفاده از دستور زیر افزایش دهید:

# افزایش محدوده پورت موقت به 65535
sudo sysctl -w net.ipv4.ip_local_port_range="1024 65535"

علاوه بر این، فعال‌سازی مقیاس‌پذیری پنجره TCP و تأییدهای انتخابی (SACK) برای شبکه‌های با پهنای باند بالا و تأخیر بالا (مانند آن‌هایی که چندین منطقه در دسترس را پوشش می‌دهند) ضروری است. این تنظیمات به لایه TCP اجازه می‌دهند تا پهنای باند موجود را بهتر استفاده کند و از از دست رفتن بسته‌ها با کارایی بیشتری بازیابی شود.

sudo sysctl -w net.ipv4.tcp_window_scaling=1
sudo sysctl -w net.ipv4.tcp_sack=1
sudo sysctl -w net.ipv4.tcp_timestamps=1

زمان‌بندی ورودی/خروجی فایل سیستم

زمان‌بند I/O تعیین می‌کند که درخواست‌های خواندن و نوشتن توسط لایه بلوک چگونه مدیریت شوند. زمان‌بند پیش‌فرض بسته به توزیع متفاوت است و اغلب برای درایوهای NVMe مدرن به mq-deadline یا bfs تغییر می‌کند، اما حیاتی است که تأیید کنید زمان‌بند صحیح فعال است. برای SSDها، زمان‌بندهای none یا mq-deadline معمولاً نسبت به زمان‌بندهای سنتی cfq یا deadline که برای دیسک‌های چرخشی طراحی شده‌اند، ترجیح داده می‌شوند، زیرا سربار جستجوی غیرضروری را کاهش می‌دهند.

شما می‌توانید زمان‌بند فعلی خود را با دستور زیر بررسی کنید:

cat /sys/block/sda/queue/scheduler

برای پایگاه‌داده‌هایی مانند PostgreSQL یا MySQL، اطمینان از اینکه فایل سیستم با گزینه‌های مناسبی مانند noatime نصب شده است، می‌تواند از به‌روزرسانی‌های غیرضروری متادیتا هر بار که فایلی خوانده می‌شود جلوگیری کند و thereby سربار I/O را کاهش دهد.

# مثال دستور mount با noatime
sudo mount -o remount,noatime /

زمان‌بندی فرآیند و CPU

لینوکس به طور پیش‌فرض از زمان‌بند کاملاً منصف (CFS) استفاده می‌کند. اگرچه برای محاسبات عمومی عالی است، اما بارهای کاری خاص ممکن است از اولویت‌های متفاوتی بهره‌مند شوند. با استفاده از دستورات niceness و ionice، می‌توانید سرویس‌های حیاتی را اولویت‌بندی کنید. برای مثال، ممکن است بخواهید اطمینان حاصل کنید که دیمون پایگاه‌داده شما همیشه در زمان‌های اوج، زمان CPU را دریافت می‌کند.

# تنظیم سطح nice به -5 (اولویت بالاتر) برای فرآیند پایگاه‌داده
sudo renice -n -5 -p [PID]

علاوه بر این، درک تنظیمات حاکم CPU (CPU Governor) حیاتی است. به طور پیش‌فرض، بسیاری از سیستم‌ها از حاکم ondemand یا powersave استفاده می‌کنند که فرکانس CPU را بر اساس بار کاری مقیاس می‌دهد. برای برنامه‌های حساس به تأخیر، تغییر به حاکم performance تضمین می‌کند که CPU با حداکثر فرکانس خود اجرا شود و تأخیر مقیاس‌پذیری فرکانس را حذف می‌کند.

# بررسی حاکم فعلی
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

# تنظیم به performance
sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor <<< performance

نتیجه‌گیری

بهینه‌سازی عملکرد لینوکس یک وظیفه یک‌باره نیست، بلکه فرآیندی مداوم از نظارت، آزمایش و تنظیم است. در حالی که پیکربندی‌های بحث‌شده در بالا یک پایه محکم برای محیط‌های با عملکرد بالا فراهم می‌کنند، همیشه به یاد داشته باشید که قبل و بعد از تغییرات، بار کاری خاص خود را بنچمارک کنید. ابزارهایی مانند sysstat، vmtouch و tcpdump برای شناسایی گلوگاه‌های خاص در استک شما بی‌نظیر هستند. با تسلط بر این کنترل‌های سطح کرنل، شما از یک مدیر سیستم غیرفعال به یک مهندس عملکرد فعال تبدیل می‌شوید و تضمین می‌کنید که زیرساخت شما می‌تواند از عهده نیازهای تحویل برنامه‌های مدرن برآید.

Share: