عملکرد عملی RAID
انتخاب سطح RAID یک تمرین در متعادلسازی عوامل بسیاری از جمله هزینه، قابلیت اطمینان، ظرفیت و البته عملکرد است. عملکرد RAID میتواند بهویژه با توجه به اینکه سطوح مختلف RAID از تکنیکهای متفاوتی استفاده میکنند و در برخی موارد کاملاً متفاوت از یکدیگر رفتار میکنند، دشوار باشد. در این مقاله میخواهم سطوح رایج RAID 0، 5، 6 و 10 را بررسی کنم تا ببینم عملکرد چگونه بین آنها متفاوت است.
برای اهداف این مقاله، RAID 1 به عنوان زیرمجموعهای از RAID 10 در نظر گرفته میشود. این اغلب روش مفیدی برای فکر کردن درباره RAID 1 است - به عنوان یک آرایه RAID 10 با تنها یک عضو جفت آینه. از آنجا که RAID 1 واقعاً یک RAID 10 جفتی تکی است و به همان صورت رفتار میکند، این به شکل شگفتانگیزی برای سادهسازی درک عملکرد RAID کار میکند زیرا به سادگی در منحنی عملکرد RAID 10 قرار میگیرد.
دو نوع عملکرد در تمام ذخیرهسازیها برای بررسی وجود دارد: خواندن و نوشتن. از نظر RAID، خواندن بسیار آسان است و نوشتن نسبتاً پیچیده است. عملکرد خواندن به طور موثر در تمام انواع RAID ثابت است. نوشتن، با این حال، ثابت نیست.
برای اینکه بحث درباره عملکرد آسانتر شود، باید چند اصطلاح تعریف کنیم زیرا با برخی معادلات کار خواهیم کرد. در بحثهایمان از N برای نمایش تعداد کل درایوها، که اغلب به آن اسپیندل گفته میشود، در آرایهمان و از X برای اشاره به عملکرد هر درایو به صورت جداگانه استفاده میکنیم. این به ما اجازه میدهد از نظر عملکرد نسبی به عنوان ضریبی از عملکرد درایو صحبت کنیم.
همچنین مهم است که به یاد داشته باشیم که ما فقط درباره عملکرد خود آرایه RAID صحبت میکنیم، نه یک زیرسیستم ذخیرهسازی کامل. آرتیفکتهایی مانند کشهای حافظه و کشهای حالت جامد کارهای شگفتانگیزی برای تغییر عملکرد کلی یک زیرسیستم ذخیرهسازی انجام میدهند، اما عملکرد اصلی آرایه RAID را اساساً تغییر نمیدهند.
RAID پیچیده است و بسیاری از عوامل بر عملکرد نهایی تأثیر میگذارند. یکی از آنها پیادهسازی خود سیستم RAID است. یک پیادهسازی ضعیف ممکن است تأخیر ایجاد کند یا ممکن است از اسپیندلهای موجود استفاده بهینه نکند. هیچ راه آسانی برای حساب کردن نقصهای خاص در پیادهسازیهای RAID وجود ندارد، پس باید فرض کنیم که همه در حد مشخصات کار میکنند.
برخی از انواع RAID همچنین مقادیر چشمگیری از سربار محاسباتی دارند در حالی که برخی دیگر ندارند. در درجه اول سطوح RAID پریتی برای مدیریت عملیات نوشتن نیاز به پردازش سنگین دارند. این تأخیر را معرفی میکند اما توان خروجی را محدود نمیکند. RAID سختافزاری از چیزی شبیه به یک CPU عمومی (اغلب یک پردازنده RISC مانند Power یا ARM) یا یک ASIC سفارشی برای مدیریت این موضوع استفاده میکند در حالی که RAID نرمافزاری این را به CPU خود سرور واگذار میکند.
عامل نهایی که میخواهم ذکر کنم نسبت خواندن به نوشتن عملیات ذخیرهسازی است. برخی از آرایههای RAID تقریباً صرفاً برای عملیات خواندن استفاده میشوند، برخی تقریباً صرفاً برای عملیات نوشتن اما بیشتر از ترکیبی از هر دو استفاده میکنند، احتمالاً چیزی مانند هشتاد درصد خواندن و بیست درصد نوشتن. من به این به عنوان ترکیب خواندن/نوشتن اشاره میکنم.
عملکرد ذخیرهسازی را عمدتاً در IOPS اندازهگیری میکنیم. IOPS مخفف عملیات ورودی/خروجی در ثانیه است. علاوه بر این از اصطلاحات RIOPS برای IOPS خواندن، WIOPS برای IOPS نوشتن و BIOPS برای IOPS ترکیبی استفاده میکنم. برای مثال، ترکیب ۵۰/۵۰ به سادگی (RIOPS * ۰.۵) + (WIOPS * ۰.۵) است. ترکیب رایجتر ۸۰/۲۰ برابر است با (RIOPS * ۰.۸) + (WIOPS * ۰.۲).
حالا که معیارها و درک پسزمینهای ایجاد کردهایم، به سطوح RAID خودمان میپردازیم و میبینیم که عملکرد چگونه در بین آنها متفاوت است.
برای همه سطوح RAID، عدد IOPS خواندن با استفاده از NX محاسبه میشود. این عدد «بهترین حالت» است اما عدد دنیای واقعی آنقدر نزدیک است که استفاده از این فرمول کاملاً عملی است. از آنجا که تعداد اسپیندلها (N) را میگیریم و آن را در عملکرد IOPS یک درایو مجزا (X) ضرب میکنیم. به یاد داشته باشید که درایوها اغلب عملکرد خواندن و نوشتن متفاوتی دارند، پس مطمئن شوید که از رتبهبندی IOPS خواندن درایو برای محاسبه IOPS خواندن و سرعت IOPS نوشتن برای محاسبه IOPS نوشتن استفاده کنید.
RAID 0
RAID 0 آسانترین سطح RAID برای درک است زیرا به طور موثر هیچ سرباری برای نگرانی وجود ندارد، هیچ منبعی برای تغذیه آن مصرف نمیشود و هم خواندن و هم نوشتن از تمام مزایای هر اسپیندل، همیشه بهره میبرند. بنابراین برای RAID 0 فرمول عملکرد نوشتن بسیار ساده است: NX. RAID 0 همیشه بیشترین عملکرد را دارد.
یک مثال یک آرایه RAID 0 با هشت اسپیندل خواهد بود. اگر یک درایو مجزا در آرایه ۱۲۵ IOPS ارائه دهد، محاسبه ما از N = 8 و X = 125 خواهد بود، پس 8 * 125 که ۱،۰۰۰ IOPS میدهد. از آنجا که هم RIOPS و هم WIOPS اینجا یکسان هستند، بسیار ساده است چون ۱K RIOPS، ۱K WIOPS و ۱K با هر ترکیبی از آنها به دست میآید.
RAID 10
RAID 10 دومین سطح RAID با محاسبه سادهتر است. چون RAID 10 یک استرایپ RAID 0 از مجموعههای آینهای است، هیچ سرباری از استرایپ نداریم اما هر آینه باید داده یکسانی را دو بار بنویسد تا آینهسازی ایجاد شود. این عملکرد نوشتن را نسبت به یک آرایه RAID 0 با همان تعداد درایو به نصف کاهش میدهد. این فرمول عملکرد نوشتن را به سادگی میدهد: NX/2 یا ۰.۵NX.
باید توجه داشت که در ظرفیت یکسان، به جای همان تعداد اسپیندل، RAID 10 عملکرد نوشتن یکسانی با RAID 0 دارد اما دو برابر عملکرد خواندن - به سادگی به این دلیل که برای مطابقت با همان ظرفیت به دو برابر اسپیندل نیاز دارد.
بنابراین یک آرایه RAID 10 با هشت اسپیندل N = 8 و X = 125 خواهد بود و محاسبه نتیجهگیری ما (8 * 125)/2 میشود که ۵۰۰ WIOPS یا 4X WIOPS است. یک ترکیب ۵۰/۵۰ ۷۵۰ IOPS ترکیبی خواهد داد (۱،۰۰۰ RIOPS و ۵۰۰ WIOPS.)
این فرمول به RAID 1، RAID 10، RAID 100 و RAID 01 به طور یکسان اعمال میشود.
گزینههای غیررایج مانند آینهسازی سهگانه در RAID 10 این جریمه نوشتن را تغییر میدهند. RAID 10 با آینهسازی سهگانه به عنوان مثال NX/3 خواهد بود.
RAID 5
در حالی که RAID 5 منسوخ شده و هرگز نباید در آرایههای جدید استفاده شود، آن را اینجا ذکر میکنم زیرا یک سطح RAID شناخته شده و رایج است و عملکرد آن باید درک شود. RAID 5 اساسیترین سطح RAID پریتی مدرن است. RAID 2، 3 و 4 دیگر در سیستمهای تولیدی یافت نمیشوند.
RAID پریتی نیاز نسبتاً پیچیدهای برای تأیید و بازنویسی پریتی با هر نوشتن که به دیسک میرود، اضافه میکند. این به این معنی است که یک آرایه RAID 5 باید داده را بخواند، پریتی را بخواند، داده را بنویسد و در نهایت پریتی را بنویسد. چهار عملیات برای هر یک موثر. این یک جریمه نوشتن چهار را بر RAID 5 اعمال میکند. بنابراین فرمول عملکرد نوشتن RAID 5 NX/4 است.
بنابراین با پیروی از مثال هشت اسپیندل که IOPS نوشتن یک اسپیندل مجزا ۱۲۵ است، محاسبه زیر را به دست میآوریم: (8 * 125)/4 یا 2X IOPS نوشتن که ۲۵۰ WIOPS میشود. در یک ترکیب ۵۰/۵۰ این ۶۲۵ IOPS ترکیبی خواهد بود.
RAID 6
RAID 6، پس از RAID 10، احتمالاً رایجترین و مفیدترین سطح RAID در حال استفاده امروز است. RAID 6، با این حال، بر پایه RAID 5 است و یک سطح پریتی دیگر دارد. این آن را به طور چشمگیری از RAID 5 ایمنتر میکند، که بسیار مهم است، اما یک جریمه نوشتن چشمگیر نیز اعمال میکند زیرا هر عملیات نوشتن نیاز دارد که دیسکها داده را بخوانند، پریتی اول را بخوانند، پریتی دوم را بخوانند، داده را بنویسند، پریتی اول را بنویسند و سپس در نهایت پریتی دوم را بنویسند. این یک جریمه نوشتن شش است. بنابراین فرمول ما NX/6 است.
با ادامه مثال ما (8 * 125)/6 که به تقریباً ۱۶۷ IOPS نوشتن یا ۱.۳۳X میشود. در مثال ترکیب ۵۰/۵۰ ما، این عملکرد ۵۸۳.۵ IOPS ترکیبی است.
RAID 7 (همچنین شناخته شده به عنوان RAID 5.3 یا RAID 7.3)
RAID 7 یک سطح RAID تا حدودی غیراستاندارد با پریتی سهگانه است که بر پایه پریتی تکی RAID 5 و پریتی دوگانه RAID 6 ساخته شده است. تنها پیادهسازی فعلی RAID 7، RAIDZ3 در ZFS است. چون RAID 7 شامل تمام سربار RAID 5 و RAID 6 به اضافه سربار اضافی مؤلفه پریتی سوم است، یک جریمه نوشتن شگفتانگیز هشت دارد. بنابراین فرمول ما برای یافتن عملکرد نوشتن RAID 7 NX/8 است.
در مثال ما این به این معنی است که (8 * 125)/8 به ۱۲۵ IOPS نوشتن یا 1X میشود. بنابراین با هشت درایو در آرایهمان فقط عملکرد نوشتن یک درایو مستقل را خواهیم داشت. این سربار قابل توجهی است. IOPS ترکیبی ۵۰/۵۰ ما فقط ۵۶۲.۵ خواهد بود.
RAID پیچیده
سطوح RAID پیچیده یا تودرتو مانند RAID 50، 60، 61، 16 و غیره میتوانند با استفاده از اطلاعات بالا و تجزیه RAID به اجزای آن و اعمال هر یک با استفاده از فرمولهای ارائه شده در بالا پیدا شوند. هیچ فرمول سادهای برای این سطوح وجود ندارد زیرا پیکربندیهای متفاوتی دارند.
RAID 60 با دوازده درایو، دو مجموعه از شش درایو، که هر درایو ۱۵۰ IOPS است با دو RAID 6 انجام میشود. این NX از RAID 0 خواهد بود که در آن N دو است (برای دو آرایه RAID 6) و X عملکرد نتیجهگیری هر RAID 6 است. هر مجموعه RAID 6 (6 * 150)/6 خواهد بود. بنابراین آرایه کامل 2((6 * 150)/6) خواهد بود. که ۳۰۰ IOPS نوشتن میدهد.
همان مثال بالا اما به عنوان RAID 61 پیکربندی شده، یک جفت آینهای از آرایههای RAID 6، همان عملکرد در هر آرایه RAID 6 خواهد بود، اما به فرمول RAID 1 اعمال میشود که NX/2 است (که در آن X عملکرد نتیجهگیری هر آرایه RAID است.) بنابراین فرمول نهایی 2((6 * 150)/6)/2 خواهد بود که به ۱۵۰ IOPS نوشتن از دوازده درایو میرسد.
عملکرد به عنوان ضریبی از ظرفیت
هنگامی که فرمولهای عملکرد RAID تولید میکنیم، آنها را از نظر تعداد اسپیندلها میاندیشیم که بسیار منطقی است. این برای تعیین عملکرد یک آرایه پیشنهادی یا حتی یک آرایه موجود بسیار مفید است.
این همیشه یک رویکرد خوب نیست، با این حال، زیرا معمولاً RAID را از نظر ظرفیت به جای عملکرد یا تعداد اسپیندل میبینیم. عجیب است، بنابراین، که باید سپس به دیدن عملکرد RAID به عنوان تابعی از تعداد اسپیندل تغییر دهیم.
اگر دیدگاه خود را تغییر دهیم و بر ظرفیت به عنوان عامل مشترک محور کنیم، در حالی که هنوز فرض میکنیم ظرفیت و عملکرد درایو مجزا (X) بین مقایسهگرها ثابت میماند، به یک چشمانداز کاملاً متفاوت از عملکرد میرسیم. به عنوان اول از R برای نشان دادن تعداد اسپیندل مورد نیاز برای رسیدن به ظرفیت مطلوب استفاده میکنیم. (R اینجا برای نشان دادن تعداد ظرفیت خام استفاده میشود، نه تعداد کل اسپیندلها.)
RAID 0 ساده میماند، عملکرد هنوز RX است زیرا درایوهای اضافی وجود ندارند. هم RIOPS و هم WIOPS به سادگی NX هستند.
RAID 10 RX WIOPS اما 2RX RIOPS دارد. این چشمگیر است. ناگهان هنگام مشاهده عملکرد به عنوان ضریبی از ظرفیت پایدار میبینیم که RAID 10 عملکرد خواندن دو برابر RAID 0 دارد!
RAID 5 کمی پیچیدهتر میشود. WIOPS به صورت ((R + 1) * X)/4 بیان میشود. RIOPS به صورت ((R +1) * X) بیان میشود.
RAID 6، همانطور که انتظار داریم، الگویی را که RAID 5 ترسیم میکند دنبال میکند. WIOPS برای RAID 6 ((R + 2) * X)/6 است. و RIOPS به صورت ((R + 2) * X) بیان میشود.
RAID 7 درست در خط قرار میگیرد. WIOPS RAID 7 ((R + 3) * X)/8 خواهد بود. و RIOPS ((R + 3) * X) است.
این دیدگاه شیوه تفکر ما درباره عملکرد را تغییر میدهد و هنگام نگاه صرف به عملکرد خواندن، RAID 0 به کندترین سطح RAID تبدیل میشود نه سریعترین و RAID 10 برای هر دو خواندن و نوشتن سریعترین میشود!
اگر یک مثال واقعی از ۱۰ درایو ۲ ترابایتی برای دستیابی به ۲۰ ترابایت ظرفیت قابل استفاده با هر درایو که ۱۰۰ IOPS عملکرد دارد و یک ترکیب ۵۰/۵۰ را در نظر بگیریم، نتیجه IOPS خواهد بود: RAID 0 با ۱،۰۰۰ IOPS ترکیبی، RAID 10 با ۱،۵۰۰ IOPS ترکیبی (۲،۰۰۰ RIOPS / ۱،۰۰۰ WIOPS)، RAID 5 با ۶۸۷.۵ IOPS ترکیبی (۱،۱۰۰ RIOPS / ۲۷۵ WIOPS)، RAID 6 با ۷۰۰ IOPS ترکیبی (۱،۲۰۰ RIOPS / ۲۰۰ WIOPS) و در نهایت RAID 7 با ۷۳۱.۲۵ IOPS ترکیبی (۱،۳۰۰ RIOPS / ۱۶۲.۵ WIOPS.) RAID 10 برنده چشمگیری اینجاست.
تأخیر و تأثیر سیستم با RAID نرمافزاری
همانطور که قبلاً گفتم، RAID 0 و RAID 10 به طور موثر هیچ سربار سیستمی برای در نظر گرفتن ندارند. عملیات آینهسازی به اساساً هیچ تلاش محاسباتی نیاز ندارد. RAID پریتی سربار محاسباتی دارد و این منجر به تأخیر در لایه ذخیرهسازی و مصرف منابع سیستم میشود. البته اگر از RAID سختافزاری استفاده میکنیم، آن منابع به آرایه RAID اختصاص داده شدهاند. اما اگر از RAID نرمافزاری استفاده میکنیم، اینها منابع سیستم عمومی (عمدتاً CPU) هستند که برای اهداف پردازش آرایه RAID مصرف میشوند.
هیچ راه سادهای برای بیان تأخیر و تأثیر سیستم برای سطوح مختلف RAID وجود ندارد جز به این شکل: RAID 0 و RAID 10 به طور موثر هیچ تأخیر یا تأثیری ندارند، RAID 5 تأخیر و تأثیر دارد، RAID 6 تقریباً دو برابر تأخیر و تأثیر محاسباتی RAID 5 دارد و RAID 7 تقریباً سه برابر تأخیر و تأثیر محاسباتی RAID 5 دارد.
در بسیاری از موارد این تأخیر و تأثیر سیستم آنقدر کوچک خواهد بود که با ابزارهای استاندارد سیستم قابل اندازهگیری نیستند و با قدرتمندتر شدن پردازندههای مدرن، تأخیر و تأثیر سیستم به کاهش ادامه خواهد داد.
مرجع: The IT Hollow - درک جریمه RAID
مقاله اصلی در وبلاگ StorageCraft - عملکرد RAID منتشر شده است.
