در نوشتههای قبل افزایش سرعت با ممکشد را شرح دادیم. در این نوشته با یکی دیگر از راههای افزایش سرعت پایگاهداده در لینوکس آشنا میشویم.
بعضی از برنامهها و سرویسها بصورت متناوب و به کرات فایلها و دایرکتوریها را میخوانند (مانند سرویس MYSQL و سایر برنامههای مدیریت پایگاه داده). با توجه به اینکه خواندن و نوشتن روی هارد زمانبرترین عمل در سرور است، خواندن، بازنویسی و ویرایش فایلها در برنامههایی مانند پایگاه داده سرعت دسترسی به سایت یا برنامه را به شکل قابل توجهی کاهش خواهد داد.
فایلها و دایرکتوریها در فایل سیستم ext2 دارای خصوصیتی هستند که تاریخ خواندن فایل را نگه میدارد، و هر زمان تغییری در فایل یا دایرکتوری ایجاد شود این تاریخ به زمان جاری تغییر میکند، به این ویژگی atime میگویند. گرچه پروسه بهروزرسانی تاریخ خواندن فایل بسیار کوتاه و در کمتر از هزارم ثانیه است اما چنانچه تعداد دفعات دسترسی به فایلها بسیار بالا باشد (مانند پایگاههای داده) مجموع زمان اجرای این پروسههای کوچک باعث اتلاف منابع سختافزاری (RAM و CPU) افزایش بارِهارد و کاهش چشمگیر سرعت سایت و برنامهها در سرور میشود.
راهحل:
جهت رفع این مشکل باید قابلیت ثبت تاریخ خواندن فایل و دایرکتوری را غیر فعال کنیم.
برای غیر فعال کردن atime یک «فایل» از دستور chattr به شکل زیر استفاده میکنم.
chattr +A file
برای غیر فعال کردن atime یک «دایرکتوری» از دستور chattr به شکل زیر استفاده میکنم.
chattr -R +A /dir/
چنانچه نیاز باشد «تمام فایلها و دایرکتوریهای یک درایو خاص» از atime استفاده نکنند باید noatime را به شکل زیر به فایل /etc/fstab اضافه کنیم.
/dev/sda1 / ext2 defaults,noatime 1 2
به عنوان مثال با این خط atime در پارتیشن / غیر فعال میشود، در نتیجه سرعت دسترسی به این پارتیشن به شکل قابل قبولی افزایش مییابد.
پس از ویرایش فایل برای اعمال تغییرات پارتیشنها را دوباره Mount (مونت) میکنیم.
mount -a
نکات:
- با توجه به اینکه غیرفعال کردن atime در کل پارتیشن مطلوب نیست، بهتر است اطلاعات برنامههای که بیشترین تراکنش را با فایلها دارند (مانند mysql) در پارتیشن جداگانهای قرار گیرند، سپس آن پارتیشن با استفاده از پارامتر noatime، مونت شود. به عنوان مثال برای افزایش سرعت mysql میتوانیم پارتیشن /var را به صورت جداگانه مونت کنیم و با ویرایش فایل /etc/fstab پارامتر atime را غیر فعال کنیم.
/dev/sda2 /var ext4 defaults,noatime 0 0
- غیرفعال کردن atime ممکن است باعث کارکرد نامناسب بعضی برنامهها شود. به عنوان مثلا سرویسهای E-mail (پستالکترونیک) با کمک atime خوانده شدن یا خوانده نشدن ایمیل را تشخیص میدهند، بنابراین با غیرفعال کردن atime، پستالکترونیکها برای همیشه خوانده نشده باقی خواهد ماند. برای رفع این مشکل میتوان از پارامتر relatime استفاده کرد.
- پارامتر relatime عملکردی مشابه atime دارد و در صورتی تاریخ دسترسی را ویرایش میکند که تاریخ دسترسی از تاریخ بروزرسانی فایل جدیدتر باشد.
- برای بررسی فعال بودن atime روی یک پارتیشن از دستور زیر استفاده میکنیم.
cat /proc/mounts
وجود پارامترهای atime ،noatime و relatime در هر خط نشان دهندهی فعال بودن آن خصوصیت در پارتیشن است.
لینوس توروالدز -هماهنگ کننده هسته لینوکس- استفاده از relatime را نسبت به سایر روشها پیشنهاد کرده، همچنین اعلام کرده بر اساس برنامهریزیها در نسخههای بعدی هسته لینوکس، relatime به صورت پیشفرض در آن -در حال حاظر این امکان دربرنامههای سطح کاربر ماننده mount پیاده سازی شده است- پیاده سازی خواهد شد.
The “relatime” thing that David mentioned might well be very useful, but it’s probably even less used than “noatime” is. And sadly, I don’t really see that changing (unless we were to actually change the defaults inside the kernel).