۵ روش برای افزایش سرعت بازسازی و Rebuild درایوهای نرم‌افزاری RAID

ایجاد، تایید و بازسازی RAID های نرم‌افزاری برای درایوهایی که سایز کوچکی دارند مشکلی ندارد، اما برای مواقعی که اطلاعات شما زیاد هستند و یا از دیسک‌های حجیم برای این کار استفاده می‌کنید، این عمل ممکن است تا روزها نیز ادامه داشته باشد، همیشه به یاد داشته باشید که شما می‌توانید سرعت انجام این کار برای درایوهای RAID 0/1/5/6 را افزایش دهید.
اخیرا یک NAS با ۵ هارد ۴ ترابایتی را در یک محیط RAID 6 برای یک مشتری پیاده‌سازی کردم، با زدن دستور cat /proc/mdstat وضعیت درایو md0 در حالت فعال و بازیابی اطلاعات بود، سرعت این بازیابی حدود ۴۰۰۰K/sec بود که حدود ۲۲ ساعت دیگر به پایان می‌رسید و من زمان کافی برای این کار نداشتم و نیازمند پایان یافتن آن به سریعتر حالت ممکن بودم.

روش اول:

فایل /proc/sys/dev/raid/speed_limit_min حاوی تنظیماتی است که مشخص می‌کند در زمان‌هایی که درایو فعالیتی در حال انجام دارد با چه سرعتی عملیات بازسازی را انجام دهد. سرعت بر مبنای کیلوبایت بر ثانیه و به ازای هر دستگاه محاسبه می‌شود و نه درایو RAID. مقدار پیش‌فرض ۱۰۰۰ است.
فایل /proc/sys/dev/raid/speed_limit_max حاوی تنظیماتی است که مشخحص می‌کند در زمانهایی که درایر فعالیتی ندارد با سرعت درج شده در این فایل عملیات بازسازی را انجام می‌دهد.

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

# sysctl dev.raid.speed_limit_min
# sysctl dev.raid.speed_limit_max

نمونه‌های خروجی:

dev.raid.speed_limit_min = 10000
dev.raid.speed_limit_max = 20000

نکته: این روش‌ها صرفا برای بازیابی درایوهای RAID نرم‌افزاری لینوکس و افزایش سرعت آن‌ها کاربرد دارد، هر چند تنظیمات این موارد مشکلی برای سیستم ایجاد نمی‌کند اما میزان فشار بر سرور و مصرف منابع CPU و RAM را به میزان چشمگیری افزایش می‌دهد.

برای افزایش سرعت:

echo value > /proc/sys/dev/raid/speed_limit_min

یا

sysctl -w dev.raid.speed_limit_min=value

در این مثال مقدار را ما بر روی ۵۰۰۰۰K/Sec قرار می‌دهیم:

# echo 50000 > /proc/sys/dev/raid/speed_limit_min

یا

# sysctl -w dev.raid.speed_limit_min=50000

اگر می‌خواهید تنظیمات پیش‌فرض را تغییر دهید، این دو مقدار را در فایل /etc/sysctl.conf وارد نمائید.

#################NOTE ################
## You are limited by CPU and memory too #
###########################################
dev.raid.speed_limit_min = 50000
## good for 4-5 disks based array ##
dev.raid.speed_limit_max = 2000000
## good for large 6-12 disks based array ###
dev.raid.speed_limit_max = 5000000

روش دوم:

تنظیمات readahead (پیش خوان در سکتورهای ۵۱۲ بایتی) را به ازای هر درایو افزایش دهید:

# blockdev --setra 65536 /dev/mdX
## Set read-ahead to 32 MiB ##
# blockdev --setra 65536 /dev/md0
# blockdev --setra 65536 /dev/md1

روش سوم:

مقدار stripe_cache_size را برای RAID5 یا RAID6 تنظیم کنید.
این تنظیم فقط برای RAID 5/6 امکان‌پذیر است و بهره‌وری این درایوها را بین ۳ تا ۶ برابر افزایش می‌دهد. مقدار مندرج بلاک‌های سایز کش را برای ذخیره اطلاعات و خواندن اطلاعات در حافظه رم ذخیره می‌کند، مقدار پیش‌فرض ۲۵۶ است و مقادیر ۱۷ تا ۳۲۷۶۸ قابل تنظیم است. هر چند افزایش این مقدار تاثیر بسزایی در سرعت این درایوها دارد اما میزان بسزایی از RAM سرور را اشغال می‎کند، تنظیم این مقدار به عدد بسیار زیاد باعث به وجود آمدن مشکل “out of memory” می‎شود.

فرمول محاسبه:

memory_consumed = system_page_size * nr_disks * stripe_cache_size

مقدار رم مصرف شده = حجم system page * تعداد دیسک * stripe_cache_size
برای تنظیم این مقدار بر روی ۱۶MiB برای درایو md0:

# echo 16384 > /sys/block/md0/md/stripe_cache_size

برای تنظیم این مقدار بر روی ۳۲MiB برای درایو md3:

# echo 32768 > /sys/block/md3/md/stripe_cache_size

روش چهارم:

غیر فعال کردن NCQ برای تمامی دیسک ها
دستور زیر NCQ را برای تمامی دیسک ها /dev/sda, /dev/sdb و .. غیر فعال میکند:

for i in sd[abcde]
do
echo 1 > /sys/block/$i/device/queue_depth
done

روش پنجم:

مقدار Bitmap زمان بازسازی دیسک ها را در صورت خراب شدن و یا در صورت جابجایی دییک ها بهینه می‌کنند.
با استفاده از دستور زیر آن را فعال کنید:

# mdadm --grow --bitmap=internal /dev/md0

پس از اتمام rebuild آن را با دستور زیر غیرفعال کنید:

# mdadm --grow --bitmap=none /dev/md0

نتیجه:

سرعت من از ۴k به ۵۱k افزایش یافت:

cat /proc/mdstat

نمونه خروجی:

 

Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] [multipath]
md5 : active raid1 sde2[2](S) sdd2[3](S) sdc2[4](S) sdb2[1] sda2[0]
۵۳۰۰۴۸ blocks [2/2] [UU]

md0 : active raid6 sde3[4] sdd3[3] sdc3[2] sdb3[1] sda3[0]
۵۸۵۵۸۳۶۸۰۰ blocks level 6, 64k chunk, algorithm 2 [5/5] [UUUUU]
[============>........] resync = 61.7% (1205475036/1951945600) finish=242.9min speed=51204K/sec

 

برای مشاهده real-time مانند یک حرفه ای با دستور زیر آن را بررسی کنید:

# watch -n1 cat /proc/mdstat

نمونه خروجی:

 

Rebuild-raid01

 

تصویر۱: وضعیت بهره‌وری و بهینه‌سازی درایو raid6 برای /dev/md2

دستور زیر گزارش درایو /dev/md2 را از نظر وضعیت و سلامتی به شما می‌دهد:

# mdadm --detail /dev/md2

Rebuild-raid02

تصویر دوم: دریافت اطلاعات در خصوص درایو md2 raid array

 

همچنین با دستور iostat نیز می‌توانید وضعیت فعلی دیسک‌ها را مشاهده کنید:

watch iostat -k 1 2
watch -n1 iostat -k 1 2

 

Rebuild-raid03

تصویر سوم: میزان مصرف منابع CPU و اطلاعات I/O برای درایو ها و پارتیشن‌ها