درباره حافظه فلش
در اینجا به مورد SSD میپردازیم که در آنها به توضیح مفاهیم تست SSD و چگونگی تفسیر نتایج تستها، پرداخته شده است. ارزیابی بهتر نتایج تست SSD به کاربر نهایی کمک خواهند کرد.
اندازهگیری و ارزیابی تست عملکرد دستگاههای SSD کار آسانی نیست و نیازمند تلاش و زمان زیاد برای تهیه نتایج دقیق میباشد. این مساله اهمیت بسزایی دارد، چراکه مقایسه عملکرد دستگاههای مختلف موجود در بازار در به دنبال این نتایج دقیق حاصل خواهد شد.
مقالهی پیش رو در راستای کمک به درک بهتر مجموعه محیطهای ذخیره سازی دیتا تاثیر به سزایی خواهد داشت؛ به خصوص ذخیره سازیِ All-Flash که در آن، سرور فقط از دیسکهای SSD استفاده میکند.
حافظه فلش چطور کار میکند؟ خلاصهای از SSD
دستگاههای SSD بسته به دیتایی که از قبل روی آنها نوشته شده است عملکردهای مختلفی دارند. یعنی ممکن است یک دستگاه SSD در زمان انجام یک تست خاص، عملکردهای مختلفی را به نمایش بگذارد، چون ممکن است قبل از انجام تست، در معرض Workloadهای مختلفی قرار گرفته باشد. میتوان گفت که SSDها بعد از نوشته شدن مقدار خاصی دیتا روی آنها، کندتر میشوند. معمولا این مساله زمانی اتفاق میافتد که بیشتر یا تمام فضای دیسک پر باشد. البته این لزوما به معنی پر کردن تمام فضای دیسک نیست، بلکه میتواند آن تعداد Write باشد که برای پر کردن تمام فضای دیسک نیاز است.
سرعت SSD در تمامی موارد، مدتی بعد از استفاده نسبت به حالت اولیه کاهش خواهد یافت.
قبل از این که به مباحث اولیه تست عملکرد SSD بپردازیم بهتر است روش کار SSD را توضیح دهیم. دانستن روش کار SSD ضروری است، چون با علم به این مساله است که میتوان فهمید که چرا بعد از مقداری نوشتن روی SSD عملکرد آن کاهش مییابد.
قسمت سازندۀ ابتدایی در حافظه فلش، سلول دیتا است که در واقع یک ترانزیستور است. حافظه فلش روش کاری شبیه DRAM دارد، اما دیتا در آن ماندگار است. این ماندگاری را توسط Gate Transistorهای شناور (Floating Gate) ایجاد میکنند. این ترانزیستور نیازمند تامین ولتاژ خود توسط یک خازن نمیباشد (کاری که در DRAM انجام میشود)، بلکه میتواند مقداری بار در خود ذخیره کند که بر روی Gate ترانزیستور وجود دارد (ورودی ترانزیستور). نحوه عملکرد این ترانزیستور به صورتی است که اعمال مقدار کمی ولتاژ (ولتاژ خواندن) بر روی Gate (در صورتی که بار ذخیره نشود) باعث میشود جریان خاصی شارش کند. وقتی بار در Gate ذخیره شود، ولتاژ پایین برای شارش جریان کافی نیست. بنابراین میتوان گفت این سلول یک حالت باینری داشته و وقتی بار در آن ذخیره نشده است 1 و وقتی بار در آن ذخیره شده است 0 را نشان میدهد.
به علاوه، Gate Transistorهای شناور وقتی ولتاژی بیش از مقدار خاصی (مقدار آستانه) به آنها اعمال میشود، قادر هستند جریان را هدایت کنند (ترانزیستور فعال میشود). این ولتاژ بیش از ولتاژی است که برای خواندن آن سلول استفاده میشود.
اساسا حافظه فلش (سلولهای ذخیره سازی داده) از همین Gate Transistorهای شناور ساخته شده است. این سلولها در صفحاتی قرار میگیرند و هر یک از این صفحات معمولا شامل دو هزار، چهار هزار، هشت هزار یا شانزده هزار سلول هستند. این صفحات Blockهایی را میسازند که 128 یا 256 صفحه دارند. Block یک شبکه است که هر صفحه به عنوان یک سطر بر روی آن قرار گرفته است. در حافظه های فلشِ NAND که معمولا از آنها استفاده میشود، صفحات در یک Block به صورت سری به هم متصل میشوند. خروجی یک صفحه (Drain در ترانزیستورها) به ورودی ترانزیستور در صفحه بعدی متصل است. در این چینش صفحات، دیتا در هر زمان فقط بر روی یک صفحه نوشته و خوانده میشود (اما Overwrite نمیشود که بعدا در این مورد توضیح خواهیم داد). برای خواندن، ولتاژ کمی به Gate صفحهای که باید خوانده شود و ولتاژ بالاتری به سلولهای صفحات دیگر اعمال میشود. از آنجا که این ولتاژ بالا، سلولها را روشن میکند، دیتایی که از آن صفحه خوانده میشود در این شبکه انتقال یافته و میتوان به آن دسترسی داشت. نوشتن دیتا با اعمال ولتاژ بالا به Gate سلولهای موجود در آن صفحه انجام میشود در حالی که خروجی تمام سلول های دیگر موجود در آن Block به ground متصل است. فقط ستون هایی که سلول های موجود در آنها باید شارژ شوند به ground متصل می شوند. به این صورت بار بر روی Gate شناور قرار گرفته و مقدار باینری صفر در آن ذخیره می شود.
صفحه کوچک ترین قسمت حافظه فلش است که خوانده و نوشته میشود. Overwrite یک صفحه به تنهایی امکان پذیر نیست، بلکه باید کل Block را Overwrite کرد.
پاک کردن سلولها نیاز به ولتاژ بالایی دارد. مقدار این ولتاژ آنقدر زیاد است که اگر بخواهیم فقط یک صفحه را پاک کنیم ممکن است صفحات مجاور نیز تحت تاثیر قرار گیرند. به بیان سادهتر، اقدام برای پاک کردن یک صفحه نیاز به اعمال ولتاژ بالا دارد که این مسئله ممکن است باعث تغییر در سطح ولتاژ سایر سلولها شده که به وضوح می تواند باعث Corrupt شدن دیتا شود و به هیچ وجه قابل قبول نیست. به این دلیل است که خواندن و نوشتن می تواند روی یک صفحه انجام شود، اما پاک کردن (یا Overwrite کردن) فقط در مقیاس Block قابل انجام است.
به طور خلاصه می توان گفت حافظه فلش دارای صفحاتی است که کل Block را میسازند. می توان دیتا را بر روی یک صفحه نوشت و خواند، اما نمی توان یک صفحه را به تنهایی Overwrite کرد، بلکه باید کل Block را Overwrite کرده و سپس دیتا را روی آن Block نوشت.
منتظر قسمتهای بعد باشید…
این قسمت را به این موضوع اختصاص میدهیم که وقتی صفحات SSD شما برای ذخیره کردن در حال اتمام است باید چه کنید؟ پس شما را دعوت میکنیم که بخوانید و یاد بگیرید!
Garbage Collection
تغییر دادن دادههایی که بر روی SSDها ذخیره شدهاند از تغییر این دادهها در صورتی که بر روی هارد درایو ذخیره هستند، سختتر است. در هارد درایو به سادگی میتوان دادهها را Overwrite کرد. اساسا وقتی میخواهیم دیتای یک صفحه را در SSD تغییر دهیم، دیتای آن صفحه تغییر نمیکند، چون باید ابتدا آن را پاک کنیم. این کار هم فقط با پاک کردن کل Block ممکن است. برای حل این مشکل، صفحهای که تغییر یافته است، بر روی صفحه دیگری که خالی است ذخیره میشود، و صفحهای که باید تغییر یابد، به عنوان “قدیمی” علامت گذاری میشود. تا زمانی که SSD صفحهای خالی دارد این روش نوشتن و علامت گذاری یک صفحه به عنوان قدیمی ممکن است. ولی زمانی خواهد رسید که این صفحات خالی تمام میشوند. برای اجتناب از این وضعیت، فرآیندی به نام Garbage Collection در SSD انجام میشود. این کار سختی است که توسط SSD controller انجام میشود که خود به تنهایی یک کامپیوتر با CPU و حافظه مستقل است. این Controller مدیریت کل دیتای ذخیره شده بر روی SSD را بر عهده دارد.
سیستم عامل از این که در بطن ماجرا چه میگذرد کاملا بی خبر است و فقط دستور میدهد که دیتایی بر روی یک قسمت logical خاص از دیسک نوشته شود. قرار دادن دیتا بر روی دیسک به صورت فیزیکی توسط SSD controller انجام میشود. تنها کاری که سیستم عاملهای مدرن انجام میدهند این است که یک دستور TRIM به SSD میفرستند که به آن بگویند بخشی از دیتا حذف شد. این کار، فرآیند Garbage Collection را قدری سادهتر میکند چون SSD بیشتر در جریان این مساله قرار میگیرد که کدام صفحهها دیگر معتبر نیستند. در طول فرآیند SSD Controller Block ،Garbage Collectionها را پاک میکند تا صفحهها را خالی کند. ولی نمیتوان هر Blockی را پاک کرد، چون برخی صفحات دیتای معتبری دارند که روی آنها ذخیره شده است. همچنین این امکان وجود ندارد که Blockهایی را که فقط صفحات قدیمی دارند یافته و آنها را پاک کنیم. چون ممکن است تعداد این Blockها تمام شود، مثلا در صورتی که هر Block روی دیسک حداقل یک صفحه معتبر داشته باشد.
کاری که SSD در طول فرآیند Carbage Collection انجام میدهد این است که تمام صفحات معتبر را از یک Block خاص به یک Block جدید بازنویسی میکند. Block بعدی که صفحات از روی آن کپی شدند میتواند پاک شده باشد. SSD معمولا Blockهایی را برای Garbage Collection انتخاب میکند که هیچ صفحه آزادی ندارند. می توان زمان معینی برای انجام Garbage Collection پیش بینی کرد چون این فرآیند بعضا فقط در زمان تغییر دیتا صورت میگیرد. در بعضی مواقع که از SSD استفاده نمیشود این فرآیند در پس زمینه انجام میشود. زمان انجام Carbage Collection به Controller بستگی دارد و این زمان را فقط سازنده Controller میداند. معمولا Enterprise SSDها Garbage Collection را فقط در زمان نوشتن انجام میدهند و Garbage Collection پس زمینه فقط برای SSDهای معمولی استفاده میشود. Enterprise SSDها از Garbage Collection پس زمینه پشتیبانی نمیکنند تا از نوشتنهای غیر ضروری جلوگیری کنند (وقتی Blockها کپی میشوند) که باعث افزایش طول عمر دیسک میشود. طراحی به این صورت انجام شد چون حافظه فلش تعداد نوشتن محدودی دارد و بعد از آن دیگر قابل استفاده نیست. Garbage Collection پس زمینه در یک محیط Enterprise اصلا مناسب نیست چون دستگاه وقتی برای انجام این کار ندارد. اما SSDهای معمولی چنین بار کاری بالایی ندارند و معمولا سازندگان تصمیم میگیرند Garbage Collection پس زمینه را در این نوع SSDها تعبیه کنند تا دستگاه با سرعت بیشتری کار کند.
فرآیند Garbage Collection در SSDها به اختصار توضیح داده شد چون تاثیر قابل ملاحظهای بر عملکرد دارد. وقتی SSD فرآیند Garbage Collection را در طول نوشتن انجام میدهد سرعت آن به طور قابل ملاحظهای کاهش مییابد مخصوصا زمانی که برای تکمیل نوشتن، Blockهای زیادی باید بازنویسی شوند. در بسیاری از موارد، دیسک باید دیتای بسیار زیادی نسبت به آنچه سیستم عامل برایش فرستاده است بنویسد چون Blockهای زیادی باید در طول Garbage Collection بازآرایی شوند.
عملکرد SSD را تست کنید
همان طور که گفته شد SSDها از نظر تاریخچه نوشتن، سطوح عملکرد مختلفی دارند.
SSD دارای صفحات خالی، سرعت بیشتری دارد چون نیازی به انجام Garbage Collection ندارد. اگر این تستها بر روی یک دستگاه کاملا جدید که تمام صفحات آن خالی هستند انجام شود نتایج عملکرد بسیار بهتر خواهند بود. همچنین این که الگوریتم Garbage Collection و مدیریت SSD Controller دقیقا به چه صورتی است، مسالهای است که فقط شرکت سازنده از آن خبر دارد. بنابراین به سختی میتوان بدون انجام تست پیش بینی کرد که یک SSD چگونه عملکردی دارد. همچنین این بدین معنی است که برای تست عملکرد SSD اینکه مقداری دیتا بر روی SSD بنویسیم و سپس آن را تست کنیم کافی نخواهد بود، چون ما هیچ وقت از حالت درونی SSD و این که مجموعا آن SSD چطور کار میکند آگاه نیستیم. در این صورت تمام تاریخچه نوشتن میتواند در عملکرد دستگاه موثر باشد. به این دلیل مهم است که در انجام این تستها تمام SSDها را در یک بار کاری یکسانی قرار دهیم.
Storage Networking Industry Association (SNIA) سازمانی است که استانداردهای مختلفی برای صنعت ذخیره سازی وضع میکند.
یکی از آنها Solid State Storage (SSS) Performance Test Specification (PTS) است. این مشخصات به ما میگوید که تست چطور باید انجام شود تا نتیجه ای دقیق و قابل اطمینان بدست آید. توضیحات گام به گام برای انجام تستهایی مثل تست خواندن و نوشتن تصادفی، خواندن و نوشتن ترتیبی و … ارائه شده است. در بسیاری از تستها به این مشخصات ارجاع داده میشود؛ مثل تستهایی که توسط سازمانهای پیشرو در فناوری اطلاعات انجام میشود مثل Tom’s Hardware. این مشخصات را در اینجا تکرار نمیکنیم، چون برای یک مقاله خیلی طولانی هستند و همچنین قدری پیچیده اند (البته خیلی هم پیچیده نیستند! بنابراین پیشنهاد میکنم نگاهی به آنها بیندازید). در اینجا مراحلی را که برای انجام تست عملکرد SSD باید انجام شود ذکر میکنیم. تمام این مراحل باید برای تمام تستها انجام شود تا آن تست قابل اطمینان و قابل مقایسه باشد.
تخلیه و Preconditioning
قبل از این که یک تست عملکرد انجام شود، SSD باید تخلیه شود. یعنی نزدیکترین وضعیت به حالتی که برای اولین بار از جعبه بیرون آورده شده است. در صورتی که اولین بار است که از SSD استفاده میکنید و دیتایی بر روی آن وجود ندارد نیازی به انجام این مرحله نیست. برای انجام این کار میتوان از نرم افزاری استفاده کرد که چنین دستوری به SSD میفرستد: ATA SECURITY ERASE (به عنوان مثال با استفاده از hdparm روی لینوکس)، SCSI FORMAT UNIT، یا این که از ابزار یا نرم افزار مخصوصی استفاده کنیم که توسط شرکت خاصی ساخته شده باشد.
وقتی SSD تخلیه شد، قبل از تست باید Preconditioning را انجام دهیم. Preconditioning عبارت است از اعمال بار کاری به دستگاه برای این که آن را از حالت استفاده نشده و تازه از جعبه بیرون آمده به حالتی تبدیل کنیم که به استفاده واقعی نزدیکتر است. این مرحله بیشترین زمان را از ما میگیرد چون نیاز است بار کاری چند بار به دستگاه اعمال شود. باید هر بار عملکرد دستگاه را ببینیم و توجه کنیم که هر بار چطور تغییر میکند. این کار را باید آنقدر تکرار کرد که نتایج بدست آمده از آن به پایداری نسبی رسیده و تغییر زیادی در نتایج تستهای مختلف که پشت سر هم انجام میشوند دیده نشود. SNIA الگوی خاصی برای رسیدن به این پایداری تعریف کرده است ولی در حالت کلی اگر این اختلافها خیلی قابل ملاحظه نباشند میتوان گفت نتیجه تست قابل قبول است. معمولا دیسک در یک تست عملکرد سریعتری داشته و در تست بعدی عملکرد کندتری دارد. اگر دستگاه چنین وضعی دارد و این الگو در حال تکرار است، یعنی دستگاه آماده انجام تست است. هر تست Preconditioning را باید بلافاصله بعد از دیگری انجام داد تا دستگاه در این میان فرصتی برای انجام Garbage Collection نداشته باشد که Preconditioning را تحت تاثیر قرار میدهد.
حالت پایدار
SSD بعد از انجام Preconditioning بر روی آن، به حالت پایدار میرسد. همان طور که در پاراگراف قبل گفته شد، دستگاه بعد از اعمال مکرر بار کاری مشخص بر روی آن، نتایج بسیار شبیه به هم در تستهای پشت سر هم دارد. در این مرحله SSD آماده انجام تست عملکرد واقعی است. این تست باید بلافاصله بعد از Preconditioning انجام شود تا دیسک فرصتی برای Garbage Collection نداشته باشد که روی تست تاثیر منفی میگذارد (مگر این که صد در صد مطمئن باشید که آن SSD در آن زمان Garbage Collection پس زمینه انجام نمیدهد). نتایج این مرحله از تست را میتوان به عنوان عملکرد واقعی SSD در نظر گرفت و با استفاده از آن میتوان این SSD را با SSD های دیگر مقایسه کرد.
امیدواریم مبانی تست عملکرد SSD را به طور کامل درک کرده باشید، بدون هیچ مشکلی نتایج این تستها را تفسیر کنید و قابلیت SSDها را ارزیابی کنید. از آنجا که مطالب زیادی در این مورد بیان شد، در اینجا خلاصهای از مطالب گفته شده را میآوریم:
- برای این که نتایج قابل اطمینان و قابل مقایسهای در تست عملکرد SSD بگیریم، نیاز به صرف زمان و تلاش زیادی در این مورد داریم. دیسک برای رسیدن به حالت پایدار باید Precondition شود که در این حالت میتوان آن را تست کرد.
- عملکرد یک دیسک کاملا نو که تازه تخلیه شده است همیشه بهتر است، چون نیازی به اجرای Garbage Collection ندارد.
- وقتی نیاز به انتخاب یک SSD با مقدار عملکرد خاصی داریم، باید بررسی شود که آیا این تست از راهنمای SNIA یا روشهای مناسب دیگری برای تست SNIA تبعیت میکند یا نه (که شامل Preconditioning میشود).
- اگر تست خاصی از Preconditioning مخصوصِ به خود استفاده میکند بهتر است مطمئن شوید که مجموعهای که نتایج تست را ارائه میدهد (مثلا یک مجله فناوری آنلاین یا شرکت فروشنده سخت افزار) مراحل مختلف تست را به طور کامل توضیح داده است. فقط دیسکهایی که مراحل تست آنها (از جمله Preconditioning) دقیقا یکسان بوده است این قابلیت را دارند که از نظر عملکرد باهم مقایسه شوند.
- اگر مجموعهای که نتایج تست را منتشر میکند، چیزی درباره شرایط و مراحل انجام تست نگفته است، بهتر است فرض کنید که این تست در حالتی انجام شده است که دستگاه کاملا نو است و تازه از جعبه بیرون آورده شده است. در این صورت باید انتظار داشت که عملکرد آن در حالت واقعی به مقدار قابل ملاحظهای افت خواهد کرد.
- باید توجه کنید که نتایج تست عملکرد بعضا ممکن است با گذر زمان به مقدار 90 درصد نسبت به تست اولیه کاهش یابد!
- ارزیابی تستهای عملکرد دستگاههای ذخیره سازی به خصوص در جایی اهمیت مییابد که Storage Applianceها نیاز به نوعی ذخیرۀ بلادرنگ (Real-Time) داشته باشند. این مساله شامل اندازه گیریها، ضبط ویدئو و صوت به صورت بلادرنگ میشود.
- اگر نیاز است که سیستم خاصی دارای حداقل خاصی از عملکرد باشد (چون در غیر این صورت به خوبی کار نخواهد کرد) بهتر است عملکردِ قدری بالاتر از آن را در نظر بگیرید.
یک مساله دیگر را هم باید متذکر شویم: بعضا ممکن است با نتایج تست عملکردی روبرو شوید که عملکرد دستگاه ذخیره سازی را نیز در بر داشته باشد و از دستگاه ذخیره سازی SSD استفاده میکند. این نتایج لزوما فقط وابسته به عملکرد SSD نیستند بلکه بستگی به سایر اجزای سیستم هم دارند مثل Networking ،CPU و نرم افزارهایی که در آن سیستم استفاده میشود.
برای از بین بردن محدودیتهای احتمالی در این تست میتوانید از SSDهای نو استفاده کنید، چون SSD نو خیلی سریعتر کار میکند. این روش تست برای نشان دادن حداکثر عملکرد یک دستگاه در یک Storage Appliance به کار میرود. در این تست باید تاثیر دستگاهی که تست بر روی آن انجام میشود نیز در نظر داشت و نباید کل نتیجه را به طور مستقل به آن دستگاه ذخیره سازی اسناد داد. مثلا اگر از یک Network Adapter تست عملکرد میگیریم، نتیجه تستهایی که بر روی دستگاههای ذخیرهسازی انجام شده است نیز باید در این تست که بر روی Network Adapter انجام شده است، در نظر گرفته شود.