چرا NVMe من از SSD کندتر است؟

چرا NVMe من از SSD کندتر است؟
در این مقاله به برخی از تفاوت های ظریف زیرسیستم I/O و تاثیر آنها بر عملکرد نگاه خواهیم کرد.

چند هفته پیش با این سوال مواجه شدم که چرا NVMe روی یک سرور از SATA روی سرور دیگر کندتر است. من به ویژگی های سرورها نگاه کردم و متوجه شدم که این یک سوال ترفند است: NVMe از بخش کاربر بود و SSD از بخش سرور.

بدیهی است که مقایسه محصولات از بخش های مختلف در محیط های مختلف صحیح نیست، اما این یک پاسخ فنی جامع نیست. ما اصول را مطالعه می کنیم، آزمایش هایی را انجام می دهیم و به سوال مطرح شده پاسخ می دهیم.

fsync چیست و کجا استفاده می شود

برای سرعت بخشیدن به کار با درایوها، داده ها بافر می شوند، یعنی در حافظه فرار ذخیره می شوند تا زمانی که فرصت مناسبی برای ذخیره محتویات بافر در درایو ایجاد شود. معیارهای فرصت توسط سیستم عامل و ویژگی های درایو تعیین می شود. در صورت قطع برق، تمام داده های بافر از بین می رود.

تعدادی کار وجود دارد که در آنها باید مطمئن شوید که تغییرات فایل در درایو نوشته شده است و در یک بافر میانی قرار نگیرید. این اطمینان را می توان با استفاده از فراخوانی سیستم fsync سازگار با POSIX به دست آورد. فراخوانی fsync یک نوشتن از بافر به درایو را مجبور می کند.

بیایید اثر بافرها را با یک مثال مصنوعی در قالب یک برنامه کوتاه C نشان دهیم.

#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>

int main(void) {
    /* Открываем файл answer.txt на запись, если его нет -- создаём */
    int fd = open("answer.txt", O_WRONLY | O_CREAT);
    /* Записываем первый набор данных */
    write(fd, "Answer to the Ultimate Question of Life, The Universe, and Everything: ", 71);
    /* Делаем вид, что проводим вычисления в течение 10 секунд */
    sleep(10);
    /* Записываем результат вычислений */
    write(fd, "42n", 3); 

    return 0;
}

کامنت ها توالی اقدامات در برنامه را به خوبی توضیح می دهند. متن "پاسخ به سوال اصلی زندگی، کیهان و همه اینها" توسط سیستم عامل بافر می شود و اگر در حین "محاسبات" با فشردن دکمه Reset سرور را ریستارت کنید، فایل خالی می شود. در مثال ما، از دست دادن متن مشکلی نیست، بنابراین fsync مورد نیاز نیست. پایگاه های داده این خوش بینی را ندارند.

پایگاه‌های داده برنامه‌های پیچیده‌ای هستند که همزمان با بسیاری از فایل‌ها کار می‌کنند، بنابراین آنها می‌خواهند مطمئن باشند که داده‌هایی که می‌نویسند در درایو ذخیره می‌شوند، زیرا سازگاری داده‌ها در پایگاه داده به این بستگی دارد. پایگاه های داده به گونه ای طراحی شده اند که تمام تراکنش های انجام شده را ثبت کرده و در هر زمان برای قطع برق آماده باشند. این رفتار شما را مجبور می کند که دائماً از fsync در مقادیر زیاد استفاده کنید.

چه چیزی بر استفاده مکرر از fsync تأثیر می گذارد

با I/O معمولی، سیستم عامل سعی می کند ارتباطات دیسک را بهینه کند، زیرا درایوهای خارجی کندترین در سلسله مراتب حافظه هستند. بنابراین، سیستم عامل سعی می کند تا حد امکان داده ها را در یک دسترسی به درایو بنویسد.

بیایید تاثیر استفاده از fsync را با یک مثال خاص نشان دهیم. ما SSD های زیر را به عنوان سوژه های آزمایشی داریم:

  • Intel® DC SSD S4500 480 گیگابایت، متصل از طریق SATA 3.2، 6 گیگابیت بر ثانیه؛
  • Samsung 970 EVO Plus 500GB، متصل از طریق PCIe 3.0 x4، ~31 گیگابیت بر ثانیه.

آزمایش‌ها بر روی یک Intel® Xeon® W-2255 که دارای Ubuntu 20.04 است انجام می‌شود. برای تست دیسک ها از sysbench 1.0.18 استفاده می شود. دیسک ها دارای یک پارتیشن تک فرمت شده به صورت ext4 هستند. آماده سازی برای آزمون ایجاد فایل های 100 گیگابایتی است:

sysbench --test=fileio --file-total-size=100G prepare

تست های دویدن:

# Без fsync
sysbench --num-threads=16 --test=fileio --file-test-mode=rndrw --file-fsync-freq=0 run

# С fsync после каждой записи
sysbench --num-threads=16 --test=fileio --file-test-mode=rndrw --file-fsync-freq=1 run

نتایج آزمون در جدول ارائه شده است.

تست
Intel® S4500
سامسونگ 970 EVO+

خواندن بدون fsync، MiB/s
5734.89
9028.86

بدون fsync، MiB/s بنویسید
3823.26
6019.24

خواندن با fsync، MiB/s
37.76
3.27

ضبط با fsync، MiB/s
25.17
2.18

به راحتی می توان فهمید که NVMe از بخش مشتری، زمانی که خود سیستم عامل تصمیم می گیرد چگونه با دیسک ها کار کند، با اطمینان رهبری می کند، و زمانی که از fsync استفاده می شود، ضرر می کند. این دو سوال را ایجاد می کند:

  1. چرا سرعت خواندن از پهنای باند فیزیکی لینک در تست بدون fsync بیشتر است؟
  2. چرا SSD بخش سرور در رسیدگی به تعداد زیادی درخواست fsync بهتر است؟

پاسخ به سوال اول ساده است: sysbench فایل های صفر پر شده تولید می کند. بنابراین، آزمایش بیش از 100 گیگابایت صفر انجام شد. از آنجایی که داده ها بسیار یکنواخت و قابل پیش بینی هستند، بهینه سازی های مختلف سیستم عامل وارد عمل می شوند و به میزان قابل توجهی سرعت اجرا را افزایش می دهند.

اگر تمام نتایج sysbench را زیر سوال می برید، می توانید از fio استفاده کنید.

# Без fsync
fio --name=test1 --blocksize=16k --rw=randrw --iodepth=16 --runtime=60 --rwmixread=60 --fsync=0 --filename=/dev/sdb

# С fsync после каждой записи
fio --name=test1 --blocksize=16k --rw=randrw --iodepth=16 --runtime=60 --rwmixread=60 --fsync=1 --filename=/dev/sdb

تست
Intel® S4500
سامسونگ 970 EVO+

خواندن بدون fsync، MiB/s
45.5
178

بدون fsync، MiB/s بنویسید
30.4
119

خواندن با fsync، MiB/s
32.6
20.9

ضبط با fsync، MiB/s
21.7
13.9

روند کاهش عملکرد در NVMe هنگام استفاده از fsync به وضوح قابل مشاهده است. می توانید به سراغ سوال دوم بروید.

بهینه سازی یا بلوف

قبلاً گفتیم که داده ها در یک بافر ذخیره می شوند، اما مشخص نکردیم که در کدام بافر، زیرا مهم نبود. حتی در حال حاضر ما به پیچیدگی های سیستم عامل ها نمی پردازیم و دو نوع کلی بافر را مشخص نمی کنیم:

  • برنامه؛
  • سخت افزار

بافر نرم افزار به بافرهایی که در سیستم عامل هستند و بافر سخت افزاری به حافظه فرار کنترل کننده دیسک اشاره دارد. فراخوانی سیستم fsync فرمانی را به درایو ارسال می کند تا داده ها را از بافر خود به حافظه اصلی بنویسد، اما هیچ راهی برای کنترل اجرای صحیح دستور ندارد.

از آنجایی که SSD عملکرد بهتری دارد، دو فرض را می توان مطرح کرد:

  • دیسک برای بارگذاری یک طرح مشابه طراحی شده است.
  • دیسک "بلوف" می شود و دستور را نادیده می گیرد.

اگر آزمایشی را با قطع برق انجام دهید، رفتار غیرصادقانه درایو قابل مشاهده است. می توانید این را با یک اسکریپت بررسی کنید. diskchecker.pl، بود ایجاد شده در سال 2005.

این اسکریپت به دو ماشین فیزیکی نیاز دارد - "سرور" و "مشتری". کلاینت مقدار کمی از داده ها را در درایو تحت آزمایش می نویسد، fsync را فراخوانی می کند و اطلاعات مربوط به آنچه نوشته شده را به سرور ارسال می کند.

# Запускается на сервере
./diskchecker.pl -l [port]

# Запускается на клиенте
./diskchecker.pl -s <server[:port]> create <file> <size_in_MB>

پس از اجرای اسکریپت، لازم است که "کلینت" را خاموش کنید و چند دقیقه برق را برگردانید. مهم است که سوژه مورد آزمایش را از برق جدا کنید و فقط یک خاموشی سخت انجام ندهید. پس از مدتی، سرور می تواند متصل شود و در سیستم عامل بارگذاری شود. پس از راه اندازی سیستم عامل، باید دوباره شروع کنید diskchecker.pl، اما با استدلال بررسی.

./diskchecker.pl -s <server[:port]> verify <file>

در پایان بررسی، تعداد خطاها را مشاهده خواهید کرد. اگر آنها 0 باشند، دیسک تست را پشت سر گذاشت. برای حذف ترکیبی از شرایطی که برای دیسک موفقیت آمیز است، آزمایش را می توان چندین بار تکرار کرد.

S4500 ما هیچ خطای اتلاف برق نشان نداد، به این معنی که برای بارگیری با تعداد زیادی تماس fsync آماده است.

نتیجه

هنگام انتخاب دیسک ها یا کل تنظیمات آماده، باید مشخصات کارهایی را که باید حل شوند در نظر داشته باشید. در نگاه اول، واضح به نظر می رسد که NVMe، یعنی یک SSD با رابط PCIe، سریعتر از یک SATA SSD "کلاسیک" است. با این حال، همانطور که امروز فهمیدیم، در شرایط خاص و با وظایف خاص ممکن است چنین نباشد.

چگونه اجزای سرور را هنگام اجاره از یک ارائه دهنده IaaS آزمایش می کنید؟
در نظرات منتظر شما هستیم.

چرا NVMe من از SSD کندتر است؟

منبع: www.habr.com

اضافه کردن نظر