نحوه پیکربندی TRIM دوره ای هارد های SSD در سرور های لینوکس
معرفی
به علت معماری هارد های SSD یا درایو های حالت جامد ، در صورت استفاده مداوم از قبل پیش بینی نشده از این هارد ها، آنها دچار کاهش کارایی خواهند شد. دستور TRIM یک فرمان است که سیستم عامل را از بلاک های آزاد هارد SSD که هم اکنون در حال استفاده نیستند، مطلع می کند. این دستور به سیستم داخلی هارد های SSD جهت مدیریت بهتر سطح پوشش دهی کمک می کند و آن را برای عملیات نوشتن بعدی آماده می کند. دستور TRIM در طول زمان تاثیر شگرفی در کارایی کلی هارد و افزایش طول عمر آن دارد.
باوجود اینکه امکان فعال سازی مداوم دستور TRIM در لینوکس وجود دارد اما در واقع به دلیل سربار اضافه ای که در علملیات فایل ایجاد می کند، تاثیر منفی در کارایی هارد خواهد داشت. در واقع جایگزین مناسبتر آن، پیکربندی دوره ای TRIM است. این روش سیستم عامل را طوری پیکر بندی می کند که به جای استفاده از کامپوننت لازم در عملیات منظم فایل، درایو را به طور زمان بندی شده TRIM کند. تقریبا در تمامی موارد، انجام این روش به همان اندازه TRIM مداوم تاثیر گذار است به علاوه اینکه کاهش کارایی را نیز بدنبال ندارد.
در این راهنما، ما به طور خلاصه در مورد اینکه SSD ها و TRIM چگونه کار می کنند بحث خواهیم کرد و سپس به شما نشان خواهیم داد که چگونه می توانید TRIM دوره ای را بر روی نسخه های متنوع لینوکس فعال سازید.
حافظه های SSD چگونه اطلاعات را ذخیره می کنند؟
برای درک بهتر مشکلاتی که TRIM آنها را حل کرده است ، بهتر است کمی در مورد اینکه حافظه های SSD چگونه اطلاعات را ذخیره و مدیریت می کنند بدانید.
واحد های داده
داده در حافظه های SSD در قالب واحد هایی با اندازه ثابت که با نام” صفحه” شناخته شده اند خوانده و نوشته می شود. به تعدادی از این صفحات با هم که واحد های بزرگتری را تشکیل می دهند ” بلاک” گفته می شود.
محدودیت های خواندن ، نوشتن و حذف کردن
حافظه های SSD ، می توانند به طور مجزا روی صفحات بنویسند و بخوانند. اگرچه، هنگام حذف کردن اطلاعات آنها تنها قادر به انجام عملیات حذف در سطح بلاک هستند. محدودیت دیگر آنها این است که تنها در صفحاتی که به طور کامل صفر هستند (یعنی مقدار تمام بیت های آن صفر است) قادر به نوشتن هستند. به زبان ساده ، وجود این محدودیت یعنی در هارد SSD ، بازنویسی اطلاعات روی اطلاعات قبلی به طور مستقیم غیر ممکن است .
جهت ایجاد تغییر در اطلاعات، SSD بدین شکل رفتار می کند، ابتدا اطلاعات را از مکان قدیمی می خواند، سپس در حافظه آن را تغییر می دهد و در مکان جدیدی می نویسد، نهایتا صفحات قدیمی را صفر می کند. SSD پس از انجام این عملیات، یک جدول داخلی را بروزرسانیمی کند، در این جدول موقعیت جدید منطقی اطلاعات ذخیره می شود بطوریکه سیستم عامل بتواند به موقعیت جدید فیزیکی آن دست پیدا کند. موقعیت قبلی اطلاعات نیز در جدول داخلی جداگانه ای به عنوان “stale” علامت گذاری می شود. بدین معنا که این مکان هم اکنون در حال استفاده نیست اما صفر هم نشده است.
بازیابی صفحات “Stale”
جهت بازیابی صفحات stale ، فرآیند های داخلی جمع آوری زباله در حافظه های SSD، باید تمام صفحات معتبر را از یک بلاک بخوانند، سپس آنها را در بلاک جدیدی بنویسند. دوباره، جداول داخلی آدرس دهی منطقی و فیزیکی بروزرسانیمی شوند. بلاک قدیمی که هم اکنون، شامل هیچ اطلاعات خاص و در حال استفاده ای نیست ، می تواند صفر شود و برای نوشتن های بعدی آماده گردد.
TRIM چه کاری انجام می دهد؟
فرآیند های داخلی جمع آوری زباله در حافظه های SSD، مسئول تمیز کردن بلاک ها و مدیریت سطح بندی پوشش هستند. اگرچه، سیستم های فایل، عمل “delete” را معمولا تنها با علامت زدن فضا به عنوان یک فضای آزاد و قابل استفاده در رکورد هایشان، انجام می دهند. یعنی اطلاعات را به طور فیزیکی از روی فضای ذخیره سازی حذف نمی کنند. اما ممکن است اطلاعات جدیدی که در نوشتن های بعدی پیش می آیند روی اطلاعات قبلی بنویسند.
پس به این نتیجه می رسیم که حافظه SSD معمولا تا زمانی که دستوری از سیستم فایل مبنی بر نوشتن در همان موقعیت منطقی قبلی دریافت نکنند، مطلع نمی شود که این صفحه دیگر در حال استفاده نیست. حافظه SSD نمی تواند فرآیند های جمع آوری زباله خود را اجرا کند، زیرا هیچوقت از زمان حذف اطلاعات باخبر نمی شود. درست زمانی که یک فضا قبلا رزرو شده بود هم اکنون باید برای داده های دیگر استفاده شود.
دستور TRIM اطلاعاتی را مبنی بر اینکه کدام بخش از داده ها هم اکنون استفاده نمی شود، از فایل سیستم به حافظه SSD منتقل می کند. این کار به دستگاه اجازه می دهد تا هنگامی که بیکار است وظایف جمع آوری زباله خود را اجرا کند. بدین ترتیب صفحات صفر برای نوشتن های بعدی آماده خواهند شد. حافظه SSD می تواند داده ها را زودتر از موعد بازچینی کند، صفحات “stale” را تمیز کند و در کل دستگاه را در وضعیت کاری خوبی نگه دارد.
اجرای دستور TRIM به ازای هر عملیات حذف هزینه بر است، و حتی می تواند تاثیر منفی در کارایی دستگاه داشته باشد. پیکر بندی TRIM دوره ای اطلاعات انبوهی در مورد صفحات بلا استفاده در یک زمانبندی منظم به جای هر عملیات در اختیار دستگاه می گذارد .
غیرفعال کردن TRIM مداوم
ممکن است شما همان زمانی که دستگاه های خود را مونت کردید TRIM مداوم را روی آن ها فعال کرده باشید. قبل ازینکه TRIM دوره ای را فعال کنیم بهتر است نگاهی به تنظیمات مونت کنونی خویش بیاندازیم.
TRIM مداوم همزمان با مونت کردن هارد یا بخش بندی آن با استفاده از گزینه discard فعال می شود.
در مرحله اول ، فایل سیستمی که هم اکنون هارد با گزینه discard در آن مونت شده است را پیدا کنید:
$ findmnt -O discard
Output TARGET SOURCE FSTYPE OPTIONS /mnt/data /dev/sda1 ext4 rw,relatime,discard,data=ordered /mnt/data2 /dev/sdb1 ext4 rw,relatime,discard,data=ordered
شما می توانید این سیستم فایل ها را بدون استفاده از گزینه discard با اضافه کردن -o remount,nodiscard در کنار کلمه mount ، مجددا مونت کنید:
sudo mount -o remount,nodiscard /mnt/data sudo mount -o remount,nodiscard /mnt/data2
اگر شما دستور findmnt را مجددا اجرا کنید، دیگر نباید نتیجه ای دریافت کنید:
$ findmnt -O discard
در مرحله دوم، فایل /etc/fstab را باز کنید و تنظیمات مونتی که هم اکنون برای سیستم فایل شما تعریف شده است را مشاهده کنید. این تعیین می کند که چگونه فایل سیستم ها در هر بوت مونت شده اند:
$ sudo nano /etc/fstab
در این فایل به دنبال گزینه Discard بگردید و در هر خطی آن را یافتید حذفش کنید:
/etc/fstab . . . # /dev/sda1 /mnt/data ext4 defaults,nofail,discard 0 0 /dev/sda1 /mnt/data ext4 defaults,nofail 0 0 # /dev/sdb1 /mnt/data2 ext4 defaults,nofail,discard 0 0 /dev/sdb1 /mnt/data2 ext4 defaults,nofail 0 0
وقتی تمام discard ها را حذف کردید فایل را ذخیره کرده و ببندید. هم اکنون سیستم فایل ها بدون گزینه discardمونت خواهد شد و در بوت های بعدی به همبن شکل مونت خواهد شد.وقت آن رسیده تا TRIM دوره ای را برای تمام سیستم های فایلی که آن را پشتیبانی می کنند تنظیم کنیم.
تنظیم TRIM دوره ای برای توزیع های systemd
تنظیم TRIM دوره ای برای توزیع های پیشرفته به جای روش رو به جلو با گرایشات Systemd ارائه می شود.
Ubuntu 16.04
Ubuntu 16.04 با یک اسکریپت که توسط cron به طور هفتگی اجرا می گردد عرضه می شود. این بدین معناست که فعال سازی روش systemd شرح داده شده در بخش زیر برای Ubuntu 16.04 ضروری است.
اگر می خواهید این اسکریپت را امتحان کنید با تایپ کردن خط زیر می توانید آن را مشاهده کنید:
$ cat /etc/cron.weekly/fstrim
Output #!/bin/sh # trim all mounted file systems which support it /sbin/fstrim --all || true
همانطور که مشاهده می کنید، این اسکریپت به ورژنی از fstrim با فلگ – -all نیاز دارد. بسیاری از ورژن های fstrim همراه با نسخه های قدیمی تر Ubuntu که شامل این گزینه نمی شود عرضه شده اند.
توزیع های systemd دیگر
برای توزیع های دیگر Systemd ،می توان TRIM دوره ای را با استفاده از فایل fstrim.timer فعال نمود، بطوریکه عملیات TRIM را یکبار در هفته روی تمام درایو های مونت شده و فعال اجرا خواهد کرد. همچنین نهایت استفاده را از گزینه fstrim – -all می برد.
در زمان نگارش این مطلب، این بهترین روش برای توزیع های زیر است:
Debian 8
CentOS 7
Fedora 24
Fedora 23
CoreOS
برای CentOS 7, Fedora 23, Fedora 24, CoreOS، واحد های fstrim.service و fstrim.timer به صورت پیش فرض در دسترس هستند. برای زمان بندی یک TRIM هفتگی از تمام درایور های فعال متصل، واحد .timer را فعال نمایید.
$ sudo systemctl enable fstrim.timer
Debian 8 ، fstrim.service و fstrim.timer را در سیستم فایل در دسترس دارد، اما بصورت پیشفرض در سیستم بارگزاری نمی شوند. نیاز است که ابتدا فایل های زیر را کپی کنید:
$ sudo cp /usr/share/doc/util-linux/examples/fstrim.service /etc/systemd/system $ sudo cp /usr/share/doc/util-linux/examples/fstrim.timer /etc/systemd/system
هم اکنون، می توانید timer را مثل دیگر توزیع ها فعال کنید:
$ sudo systemctl enable fstrim.timer
سرور شما اکنون باید تمام سیستم فایل های مونت شده که از این عملیات پشتیبانی می کنند را هفته ای یک بار TRIM کند.
تنظیم TRIM دوره ای برای توزیع های غیر Systemd
اتفاقا، اغلب توزیع هایی که در سیستم های اولیه به صورت غیر systemd ارائه شدند، با نسخه هایی از ابزار fstrim نیز که از فلگ – -all برخوردار نبود عرضه شدند. این موضوع اجرای ایمن و خودکار TRIM را بسیار سخت می ساخت.
استفاده از TRIM روی درایو هایی که از آن پشتیبانی نمی کنند یا بر روی دستگاه هایی که TRIM به درستی پیاده سازی نشده است، خطرناک است و ممکن است منجر به از دست رفتن اطلاعات شود. فلگ – -all می تواند بدون خطر این سناریو را مدیریت کند، اما تلاش برای تعیین دستی اینکه آیا درایو های متصل شده از TRIM پشتیبانی می کنند یا خیر کار خطرناکی است.
در Ubuntu 14.04، یک اسکریپت کوتاه به نام fstrim-all گنجانده شده است که برای انجام این کار تلاش می کند. یک اسکریپت هفتگی که توسط cron اجرا می شود،این کار را انجام می دهد. اگرچه، این اسکریپت همیشه از قابلیت TRIM در مورد تفسیر صحیح درایور های متصل، برخوردار نیست.
برای این توزیع و دیگر توزیع های با دستورات fstrim بدون فلگ – – all، بهترین راه حل می تواند، کامپایل یک نسخه آماری مرتبط از fstrim باشد که شامل فلگ است. این نسخه می تواند در کنار نسخه توزیع مدیریت شده، نصب شود و صراحتا تنها از طریق cron فراخوانی گردد.
این می تواند بهترین گزینه برای توزیع های زیر باشد:
Ubuntu 14.04
Ubuntu 12.04
Debian 7
CentOS 6
برای Ubuntu 14.04 احتمالا بهترین کار غیر فعال کردن اجرای اسکریپت fstrim-all است ، زیرا ممکن است نتواند وضعیت را به درستی تشخیص بدهد:
$ sudo chmod a-x /etc/cron.weekly/fstrim $ sudo mv /etc/cron.weekly/fstrim /etc/cron.weekly/fstrim.bak
در مورد بقیه نسخه ها بلافاصله می تو شروع به کار کنید.
نصب ابزار کامپایل
در مرحله اول، نرم افزار تولید مورد نیاز را نصب کنید.
در سیستم های Ubunto و Debian این کار با نوشتن خطوط زیر انجام می گردد:
$ sudo apt-get update $ sudo apt-get install build-essential
در مورد سیستم های CentOS شما می توانید مجموعه ای از ابزار مشابه را با نوشتن دستور زیر نصب کنید:
$ sudo yum groupinstall 'Development Tools'
شما در حال حاضر وابستگیهای مورد نیاز ساخت برای کامپایل یک نسخه جدید از fstrim را در اختیار دارید.
دانلود و استخراج فایل های مبدا
ابزار کمکی fstrim در قالب یک گروه به همراه ابزار های دیگر به نام util-linux منتشر می شود. برای پیدا کردن سورس کد مرتب شده بر اساس نسخه انتشار اینجا کلیک کنید.
روی جدیدترین نسخه از این بسته کلیک کنید. هم اکنون نسخه v2.28 به عنوان آخرین ورژن در دسترس است که حتما در آینده در پی توسعه ی ابزار، این نسخه متفاوت خواهد شد.
در پوشه بعدی، جدیدترین فایل نرم افزار با فرمت tar را بیابید. این فایل با کلمه util-linux- آغاز و با کلمه ی .tar.gz خاتمه میابد. هم اکنون، جدیدترین نسخه پایدار ، util-linux-2.28.1.tar.gz است. روی لینک مناسب کلیک راست و آدرس آن را در کلیپ بورد خود کپی کنید.
به سرور برگشته و مسیر پوشه tmp را تغییر دهید. از ابزار curl و wget استفاده کرده و از URL ای که کپی کردید استفاده کرده، فایل را دانلود کنید.
$ cd /tmp $ curl -LO https://www.kernel.org/pub/linux/utils/util-linux/v2.28/util-linux-2.28.1.tar.g
بعد از آن فایل برای ایجاد ساختار پوشه منبع را از حالت فشرده خارج کنید :
$ tar xzvf util-linux*
حال که هم سورس کد و هم ابزار تولید را داریم می توانیم نرم افزار را بسازیم.
پیکربندی و کامپایل یک fstrim ایستای مرتبط
کار را با وارد کردن ساختار پوشه استخراج شده شروع کنید:
$ cd /tmp/util-linux*
سپس باید نرم افزار را پیکربندی کنید، به دلیل اینکه ما تنها یک باینری fstrim مجزا نصب می کنیم، و از کتابخانه ها و ابزار کمکی جانبی که توسط سیستم مدیریت بسته ما اداره می شود، استفاده نمی کنیم، ما یک باینری static را کامپایل خواهیم کرد.
جهت انجام این کار، ابتدا باید ارتباط static را فعال و کتابخانه های مشترک را فعال سازیم.
نرم افزار را با نوشتن خواص زیر تنظیم کنید:
$ ./configure --enable-static --disable-shared
هنگامیکه نرم افزار پیکربندی شد، می توانید ابزار کمکی fstrim را با نوشتن کد زیر کامپایل کنید:
$ make fstrim
قرار دادن این کد در بالاترین سطح پوشه آرشیو استخراج شده ،ابزار کمکی را کامپایل می کند.
باینری را به یک پوشه که در مسیر شما نیست کپی کنید. به دلیل اینکه ما آن را تنها از طریق اسکریپت cron فراخوانی می کنیم ، باید مطمئن شویم که از طریق fstrim نصب شده ی سیستم برای استفاده های دیگر در رقابت قرار نمی گیرد.
بنابراین ما یک پوشه به نام /cron-bin ایجاد و باینری را داخل آن قرار می دهیم:
$ sudo mkdir /cron-bin $ sudo cp /tmp/util-linux*/fstrim /cron-bin
اکنون ما به ابزار کمکی fstrim کاربردی تری دسترسی داریم .
ایجاد یک cron هفتگی برای اجرای fstrim
حال، می توانیم اسکریپتی ایجاد کنیم که به طور هفتگی توسط cron اجرا گردد. این دقیقا همان اسکریپتی خواهد بود که در Ubuntu 16.04 گنجانده شده است، با این تفاوت که این اسکریپت به موقعیتی اشاره می کند که ما باینری کامپایل شده ی ایستای خود را در آن قرار دادیم.
با نوشتن دستور زیر فایل را ایجاد کنید:
$ sudo nano /etc/cron.weekly/fstrim
در داخل فایل خطوط زیر را قرار دهید. این فایل باینری fstrim جدید مارا با گزینه – – all اجرا خواهد کرد:
/etc/cron.weekly/fstrim #!/bin/sh # trim all mounted file systems which support it /cron-bin/fstrim --all || true
وقتی کارتان به اتمام رسید، فایل را ذخیره رده و ببندید.
با نوشتن این دستور اسکریپت را قابل اجرا کنید:
$ sudo chmod a+x /etc/cron.weekly/fstrim
Cron و anacron این اسکریپت را هفته ای یک بار اجرا کرده و سیستم های فایل را TRIM خواهند کرد.
نتیجه گیری
سرور لینوکس شما هم اکنون باید طوری پیکر بندی شده باشد که به طور دوره ای تمام سیستم های فایل پشتیانی شده را هفتگی TRIM کند. TRIM در بلند مدت هم کارایی و هم طول عمر حافظه های SSD شما را به حداکثر می رساند.
TRIM مداوم ممکن است ایده آل به نظر برسد، اما سربار بسیار قابل توجهی را به عملیات منظم سیستم فایل تحمیل می کند. TRIM دوره ای، به جای اینکه از یک کامپوننت برای هر عملیات استفاده کند، زمینه خوبی را با بیان اطلاعات کلیدی مورد نیاز برای تعمیر و نگهداری روزمره از درایو ،در یک کار برنامه ریزی شده ، ارائه می دهد.