دانيلا (⁦Dayfing⁩)
العودة إلى المقالات
2,528 كلمة12 د

كيف تختار NVMe SSD: PCIe 5.0 أم 4.0 وDRAM وTLC أم QLC وTBW

في معظم محطات العمل وحواسيب الألعاب، لا يحدد الإحساس الفعلي بقرص NVMe SSD رقمُ السرعة التسلسلية القصوى المطبوع على العلبة، بل زمنُ استجابة القراءة العشوائية بكتل 4K عند عمق قائمة انتظار منخفض، وسرعةُ الكتابة بعد امتلاء ذاكرة SLC المؤقتة، ووجودُ DRAM أو تصميمٍ جيد لـ HMB، والتبريد. لا يستحق PCIe 5.0 كلفته إلا حين ينقل الحمل ملفات كبيرة باستمرار ويكون القرص في فتحة x4 متصلة بالمعالج مباشرة. ويضيف الخادم متطلبين: قدرة تحمل للكتابة مُعبَّرًا عنها بوحدة DWPD، وحماية من انقطاع الطاقة. توضح الأقسام التالية كيف تتحقق من كل نقطة باستخدام fio وsmartctl وnvme-cli.

السرعة التسلسلية مقابل 4K العشوائية عند عمق قائمة انتظار منخفض

تُقاس السرعات التسلسلية بكتل كبيرة وقوائم انتظار عميقة، وهي تصف نسخ مقطع فيديو أو استعادة صورة قرص أو تحميل أوزان نموذج. أما ترجمة الشيفرة وتشغيل التطبيقات والاستعلام عن قاعدة بيانات أكبر من الذاكرة RAM فتولّد قراءات صغيرة، وعادةً ينتظر كل خيط انتهاء قراءة قبل أن يرسل التالية. عندها لا يرى القرص إلا قائمة انتظار من أمر واحد إلى بضعة أوامر.

عند عمق قائمة انتظار 1، يساوي عدد IOPS ثانيةً واحدة مقسومةً على متوسط زمن الاستجابة. فإذا استغرقت قراءة 4 KiB مدة 80 ميكروثانية، حصل الخيط الواحد على 12,500 IOPS، أي نحو 51 MB/s. خفض زمن الاستجابة إلى النصف يضاعف هذا الرقم، بينما لا تغيّر مضاعفة عرض نطاق PCIe شيئًا. لهذا قد يبدو قرصان بسرعتين تسلسليتين مختلفتين جدًا متماثلين على حاسوب مكتبي.

ابحث عن نتائج القراءة والكتابة العشوائية 4K عند QD1، وعن زمن الاستجابة p99 أو p99.9 تحت حمل مختلط، وقِس ما لا تنشره الشركات المصنعة بمهام fio الواردة أدناه. ويحتاج الخادم أيضًا إلى IOPS عند أعماق كبيرة، لأن كثرة العملاء تخلق توازيًا حقيقيًا. فكما في دليل البحث الهجين باستخدام pgvector، يحوّل فهرس HNSW الذي لا يتسع في الذاكرة كل استعلام إلى سلسلة من القراءات العشوائية المتتابعة، حيث يصبح زمن الاستجابة الطرفي أهم من GB/s.

جيل PCIe وعدد المسارات وتوصيل فتحات M.2

تعمل PCIe 3.0 و4.0 و5.0 بسرعات 8 و16 و32 GT/s لكل مسار مع ترميز 128b/130b. والحد الأقصى في كل اتجاه هو GT/s × 128/130 ÷ 8 GB/s لكل مسار، لذا تبلغ ذروة الوصلة x4 نحو 3.9 و7.9 و15.8 GB/s قبل احتساب عبء البروتوكول. يتفاوض القرص والفتحة على أعلى جيل وأكبر عرض يدعمانهما معًا: فالقرص PCIe 5.0 يعمل بسرعة 4.0 في فتحة PCIe 4.0، والقرص x4 في فتحة x2 يحصل على نصف المسارات.

في اللوحات المكتبية، تستخدم بعض فتحات M.2 مسارات المعالج بينما ترتبط أخرى بمجموعة الشرائح (chipset). ولمجموعة الشرائح وصلة واحدة إلى المعالج يتقاسمها USB وSATA والشبكة وكل فتحات مجموعة الشرائح الأخرى. كما تتشارك اللوحات المسارات، فقد يؤدي تركيب قرص في فتحة M.2 معينة إلى تعطيل منافذ SATA أو خفض فتحة بطاقة الرسوميات إلى x8. ويبيّن المخطط الكتلي أو جدول الفتحات في دليل اللوحة الأم طريقة التوصيل، فاقرأه قبل الشراء.

ضع قرص النظام والمشروع أو قاعدة البيانات الأكثر نشاطًا في فتحة متصلة بالمعالج، واستخدم فتحات مجموعة الشرائح للألعاب والأرشيف. ويستحق PCIe 5.0 كلفته لفيديو معدل البت العالي ونسخ مجموعات البيانات وتحميل ملفات النماذج الكبيرة، كما يشرح دليل العتاد لنماذج LLM المحلية. أما للألعاب والتطوير اليومي، فقرص PCIe 4.0 جيد بزمن استجابة منخفض عند QD1 هو الخيار الأفضل غالبًا.

تحقّق من الوصلة المتفاوض عليها

قارن الوصلة الحالية بالحد الأقصى في sysfs:

cd /sys/class/nvme/nvme0/device
cat current_link_speed current_link_width max_link_speed max_link_width

يعرض قرص PCIe 4.0 x4 في فتحة مناسبة القيمة 16.0 GT/s PCIe وعرضًا قدره 4. وتشير القيمة الأدنى إلى توصيل الفتحة، أو جيل مفروض في إعدادات البرنامج الثابت، أو بطاقة تمديد، أو تشارك المسارات.

وحدة التحكم وذاكرة DRAM المؤقتة وHMB

تربط وحدة التحكم العناوين المنطقية بصفحات NAND عبر طبقة ترجمة الفلاش (FTL). ويحتاج جدول مسطح بإدخال من 4 بايت لكل صفحة 4 KiB إلى 1/1024 من السعة، ومن هنا جاءت النسبة الشائعة التي تقارب 1 GB من DRAM لكل 1 TB من NAND. والقرص المزود بذاكرة DRAM يحتفظ بمعظم الجدول بجوار وحدة التحكم، فتبقى القراءات العشوائية على نطاق واسع من العناوين سريعة.

أما الأقراص الخالية من DRAM فتستخدم Host Memory Buffer (HMB) وتستعير جزءًا من ذاكرة النظام لحفظ جزء من الجدول. يطلب القرص الحجم في الحقل hmpre من بنية Identify Controller بوحدات قدرها 4 KiB، ويحدّه Linux بالمعامل nvme.max_host_mem_size_mb، وقيمته الافتراضية 128 MiB لكل وحدة تحكم. يناسب HMB أنماط الاستخدام المكتبي التي تمس جزءًا محدودًا من القرص، ويقل نفعه حين يمتد الإدخال والإخراج العشوائي على مئات الغيغابايتات، كما في قواعد البيانات وصور الأجهزة الافتراضية.

nvme id-ctrl /dev/nvme0 | grep -E '^(mn|fr|hmpre|hmmin|vwc|wctemp|cctemp) '
cat /sys/module/nvme/parameters/max_host_mem_size_mb

القيمة غير الصفرية للحقل hmpre في قرص بلا DRAM تؤكد دعم HMB. والمخزن المؤقت صغير، لكن إن كانت ذاكرة النظام محدودة أصلًا فسيساعدك دليل ذاكرة DDR5 على تحديد الحجم المناسب.

TLC وQLC وذاكرة SLC المؤقتة

تخزّن TLC ثلاثة بتات في الخلية وتخزّن QLC أربعة. وكلما زادت البتات في الخلية زادت سعة الرقاقة، لكن البرمجة تصبح أبطأ وتقل دورات البرمجة والمسح. وتخفي الأقراص الاستهلاكية بطء البرمجة بذاكرة SLC مؤقتة: تُكتب البيانات الواردة ببت واحد لكل خلية ثم تُنقل لاحقًا إلى TLC أو QLC.

هذه الذاكرة المؤقتة محدودة وغالبًا ديناميكية، أي أنها تتقلص كلما امتلأ القرص. وحين تستنفدها كتابة طويلة، تهبط السرعة إلى مستوى ما بعد الذاكرة المؤقتة، وهو يميل إلى أن يكون أدنى في QLC. وتسمي توصيات Ceph للعتاد هذه الظاهرة «الانحدار الحاد» (cliffing)، وتحذر من أن الأداء المستدام قد ينخفض كثيرًا بعد امتلاء ذاكرة مؤقتة محدودة.

ابحث في المراجعات أو أوراق المواصفات عن حجم الذاكرة المؤقتة عند نسبة امتلاء معينة وعن سرعة الكتابة بعدها. وإذا كنت تكتب عشرات الغيغابايتات دفعة واحدة كثيرًا، كما في استيراد الفيديو أو نسخ صور الأجهزة الافتراضية أو النسخ الاحتياطي، فاختر TLC واترك مساحة حرة. أما QLC فتناسب المكتبات التي تُقرأ في الغالب: الألعاب والوسائط وملفات النماذج.

قدرة التحمل: TBW وDWPD والضمان

TBW هو تصنيف قدرة التحمل في معيار JEDEC JESD218: عدد التيرابايتات العشرية التي يستطيع المضيف كتابتها وفق الحمل المحدد لفئة القرص، مع احتفاظ القرص بسعته واستيفائه متطلبات معدل الأخطاء ومعدل الأعطال والاحتفاظ بالبيانات دون طاقة. ويعبّر DWPD عن الميزانية نفسها بعدد مرات الكتابة الكاملة للقرص في كل يوم من فترة الضمان:

DWPD = TBW / (capacity_TB × 365 × warranty_years)
TBW  = DWPD × capacity_TB × 365 × warranty_years

قرص افتراضي سعته 2 TB بتصنيف 1,200 TBW وضمان خمس سنوات يعطي 1200 / (2 × 365 × 5)، أي نحو 0.33 DWPD. والحاسوب المكتبي الذي يكتب 50 GB يوميًا يستهلك نحو 91 TB في خمس سنوات. أما قاعدة البيانات التي تعيد كتابة القرص كله يوميًا فتحتاج إلى أكثر من ذلك، ويقترح Ceph أقراصًا بتصنيف 1 DWPD أو أكثر لمجمّعاته الثقيلة.

كتابات المضيف ليست كتابات NAND. فالكتابات العشوائية الصغيرة والقرص الممتلئ وغياب TRIM ترفع معامل تضخيم الكتابة (WAF). ويقدّر مثال تفصيلي في مواد JEDEC قدرة التحمل بالعلاقة TBW < (capacity × NAND P/E cycles) / (2 × WAF). لذلك اترك مساحة حرة وفعّل TRIM واشترِ سعة أكبر للأعمال كثيفة الكتابة.

تنتهي ضمانات استهلاكية كثيرة عند انقضاء المدة أو بلوغ TBW المعلن، أيهما أسبق. ويحدد JESD218 كذلك مدة الاحتفاظ بالبيانات دون طاقة لقرص بلغ قدرة تحمله المقدرة: سنة واحدة عند 30 °C لفئة العملاء، وثلاثة أشهر عند 40 °C لفئة المؤسسات. فالقرص SSD المفصول عن الطاقة ليس أرشيفًا، لذا اتبع دليل النسخ الاحتياطي 3-2-1.

الحرارة وخفض الأداء والمبددات الحرارية

تنشر كل وحدة تحكم عتبتين في Identify Controller. عند WCTEMP تواصل العمل لكنها تحتاج إلى تبريد أكثر أو حمل أقل، وعند CCTEMP قد تخفض أداءها بشدة أو تتوقف أو تفقد البيانات. وتعرّف NVM Express Base Specification 2.4 هذه الحرارات بالكلفن، وتوصي بعتبة تحذير قدرها 343 K، أي نحو 70 °C.

تحتاج أقراص PCIe 5.0 وأقراص PCIe 4.0 السريعة عمومًا إلى مبدد حراري تحت الحمل المستمر. استخدم مبددًا واحدًا، إما غطاء M.2 على اللوحة الأم مع وسادته الحرارية وإما مبدد القرص نفسه، وتأكد من مرور تيار هواء عبره. وفي الحواسيب المحمولة والصناديق الصغيرة، قد ينجز قرص أقل استهلاكًا للطاقة عملًا مستدامًا أكثر من قرص أسرع يخفض أداءه. ويعدّ سجل SMART الدقائق التي قضاها القرص عند كل عتبة أو فوقها، فإذا ازداد عداد التحذير أثناء العمل العادي فحسّن التبريد.

الحماية من انقطاع الطاقة وأقراص المؤسسات

تؤكد أقراص العملاء الكتابة بمجرد وصول البيانات إلى مخزن مؤقت متطاير، وتعتمد على أن يرسل المضيف أمر flush قبل انقطاع الطاقة. ويحصي سجل SMART الانقطاعات المفاجئة في الحقل Unexpected Power Losses، الذي كان اسمه Unsafe Shutdowns في المراجعات السابقة من المواصفة، وتحذر المواصفة نفسها من احتمال تلف البيانات في الأقراص غير المحمية من فقدان الطاقة.

تستخدم أقراص المؤسسات المزودة بالحماية من انقطاع الطاقة (PLP) مكثفات تكفي طاقتها لكتابة البيانات والبيانات الوصفية المخزنة مؤقتًا إلى NAND بعد انقطاع التغذية. فتبقى الكتابات المؤكدة سليمة، وتكتمل أوامر flush دون انتظار NAND. لذلك تعمل البرمجيات التي تستدعي fsync باستمرار، مثل قواعد البيانات وسجلات الكتابة المسبقة وأجهزة ZFS intent log وCeph، بسرعة أكبر وسلوك أكثر قابلية للتنبؤ، ويوصي Ceph بأقراص مؤسسات مزودة بـ PLP.

nvme id-ctrl /dev/nvme0 | grep -E '^vwc '
cat /sys/block/nvme0n1/queue/write_cache

يوضح الحقل vwc ما إذا كانت وحدة التحكم تعلن عن ذاكرة كتابة مؤقتة متطايرة، وتعني القيمة write back في write_cache أن Linux يرسل أوامر flush إلى القرص. وتبقى ورقة المواصفات المرجع الحاسم بشأن PLP. لا تعطّل أبدًا أوامر flush أو حواجز نظام الملفات على قرص عملاء لتحسين أرقام الاختبار.

اختبار قرص جديد باستخدام fio

اختبر القرص قبل أن يحمل بيانات، واستخدم ملفات على نظام ملفاته، لأن الكتابة على جهاز خام مثل /dev/nvme0n1 تدمر محتواه. تستخدم المهام الإدخال والإخراج المباشر وio_uring، وعلى النوى القديمة استخدم --ioengine=libaio. ويُعِدّ fio ملف الاختبار أولًا، فتقع القراءات على بيانات مكتوبة فعلًا.

cd /mnt/newdrive

# قراءات عشوائية 4K عند عمق قائمة انتظار 1: ما يشعر به الحاسوب المكتبي
fio --name=qd1-randread --filename=fio.test --size=32G \
  --ioengine=io_uring --direct=1 --rw=randread --bs=4k \
  --iodepth=1 --time_based --runtime=60 --ramp_time=5 \
  --lat_percentiles=1 --percentile_list=50:99:99.9

# حمل 4K عشوائي مختلط مع توازٍ: أقرب إلى خادم مشغول
fio --name=qd32-randrw --filename=fio.test --size=32G \
  --ioengine=io_uring --direct=1 --rw=randrw --rwmixread=70 --bs=4k \
  --iodepth=32 --numjobs=4 --group_reporting --time_based --runtime=120

# كتابة تسلسلية تتجاوز ذاكرة SLC المؤقتة مع تسجيل عرض النطاق كل ثانية
fio --name=seqwrite-cliff --filename=fio-big.test --size=300G \
  --ioengine=io_uring --direct=1 --rw=write --bs=1M --iodepth=8 \
  --write_bw_log=cliff --log_avg_msec=1000

في مهمة QD1، اقرأ متوسط زمن الاستجابة وقيمة p99، لا عدد IOPS وحده. وفي المهمة المختلطة، قارن زمن الاستجابة p99.9 بين الأقراص المرشحة. واجعل حجم مهمة الانحدار أكبر من الذاكرة المؤقتة المتوقعة وأصغر من المساحة الحرة. تكتب المهمة الملف cliff_bw.1.log، بسطر لكل ثانية يتضمن الزمن بالميلي ثانية وعرض النطاق بوحدة KiB/s، ويُظهر الرسم البياني السرعة داخل الذاكرة المؤقتة ونقطة الانحدار وأي خفض حراري للأداء. احذف ملفات الاختبار بعد ذلك. وتشرح وثائق fio كل خيار مستخدم.

قراءة حالة القرص باستخدام smartctl وnvme-cli

تقرأ smartmontools وnvme-cli سجل SMART / Health Information نفسه:

smartctl -x /dev/nvme0
nvme smart-log /dev/nvme0

غيّر الإصدار nvme-cli 3.0، الصادر في سبتمبر 2026، أسماء الأوامر إلى صيغ مثل nvme log smart وnvme id ctrl. وتبقى الأسماء الموصولة بشرطة المستخدمة هنا متاحة كأسماء بديلة مهملة، وهي تعمل أيضًا مع nvme-cli 2.x.

  • Critical Warning: أي بت غير صفري يستدعي التصرف. وتغطي البتات الاحتياطي من الكتل ودرجة الحرارة والموثوقية وتحول الوسيط إلى القراءة فقط.
  • Available Spare: الاحتياطي المتبقي بالنسبة المئوية. واقترابه من Available Spare Threshold يعني أن القرص يُخرج كتلًا من الخدمة.
  • Percentage Used: تقدير الشركة المصنعة لقدرة التحمل المستهلكة. ويمكن أن يتجاوز 100، وهذا وحده لا يعني عطلًا.
  • Data Units Written: آلاف من وحدات حجمها 512 بايت. اضرب القيمة في 512,000 لتحصل على البايتات، فتساوي 10,000,000 وحدة نحو 5.12 TB. سجّلها شهريًا لتعرف قيمة DWPD الفعلية لديك.
  • Media and Data Integrity Errors: أخطاء لم تُصحَّح. وأي زيادة فيها تعني أن عليك التحقق من النسخ الاحتياطية فورًا.

الاختبارات الذاتية والبرنامج الثابت

smartctl -t short /dev/nvme0
smartctl -l selftest /dev/nvme0
nvme fw-log /dev/nvme0
fwupdmgr get-updates
fwupdmgr update

الاختبار الذاتي للجهاز اختياري في مواصفة NVMe، لذا ترفضه بعض الأقراص. اضبط smartd أو نظام المراقبة لديك لإطلاق تنبيهات على الحقول السابقة. ويؤثر البرنامج الثابت في الأداء وإدارة الطاقة ومعالجة الأخطاء، فاقرأ ملاحظات الإصدار وخذ نسخة احتياطية قبل أي تحديث. وتثبّت إضافة NVMe في fwupd تحديثات الشركات التي تنشرها عبر LVFS وتفعّلها عند إعادة التشغيل التالية. أما الشركات الأخرى فتحتاج إلى أداتها الخاصة، أو إلى nvme fw-download ثم nvme fw-commit مع صورتها. وفي المصفوفة المرآوية حدّث قرصًا واحدًا أولًا. وإذا اختفى قرص من الناقل في Linux فابحث أولًا عن إصلاح في البرنامج الثابت، ويعطّل معامل النواة nvme_core.default_ps_max_latency_us=0 الانتقالات الذاتية بين حالات الطاقة كخطوة تشخيصية.

محاذاة الأقسام وTRIM في Linux

يحاذي fdisk وparted الأقسام وفق طوبولوجيا الإدخال والإخراج التي يعلنها الجهاز، لذا أبقِ قيمهما الافتراضية وتحقق من النتيجة:

lsblk -t /dev/nvme0n1
parted /dev/nvme0n1 align-check optimal 1
nvme id-ns -H /dev/nvme0n1 | grep 'LBA Format'

يُبلغ أمر align-check في parted عما إذا كان القسم 1 محاذيًا محاذاة مثلى. ويعرض الأمر الأخير صيغ LBA المدعومة ويحدد الصيغة النشطة. تُشحن أقراص كثيرة بقطاعات من 512 بايت وتدعم أيضًا قطاعات من 4096 بايت. ويغيّر الأمر nvme format --lbaf=<n> الصيغة لكنه يمحو مساحة الأسماء، لذا قرّر قبل تخزين البيانات وبعد التأكد من أن محمّل الإقلاع وطبقة RAID والمشرف الافتراضي تتعامل مع أجهزة 4Kn.

يخبر TRIM القرص بالكتل الحرة، فلا تنسخ عملية جمع البيانات المهملة صفحات قديمة، وينخفض تضخيم الكتابة، وتبقى سرعة ما بعد الذاكرة المؤقتة مستقرة. والأفضل استخدام TRIM دوري:

sudo systemctl enable --now fstrim.timer
sudo fstrim -av
lsblk --discard

يعدّ دليل fstrim تشغيل TRIM أسبوعيًا كافيًا لمعظم الحواسيب المكتبية والخوادم، ويحذر من أن TRIM المتكرر أو خيار التركيب discard قد يقصّر عمر أقراص SSD الرديئة. ومنذ النواة 6.2 يفعّل Btrfs الخيار discard=async تلقائيًا على الأجهزة الداعمة. وتعني القيم غير الصفرية في العمودين DISC-GRAN وDISC-MAX من مخرجات lsblk --discard أن طلبات discard تصل إلى الجهاز. ويتجاهل dm-crypt طلبات discard افتراضيًا لأنها قد تكشف الكتل المستخدمة. فعّلها بخيار discard في crypttab أو بالخيار --allow-discards فقط إذا كان هذا التسرب مقبولًا. واترك أيضًا مساحة حرة، لأن ذاكرة SLC المؤقتة وجمع البيانات المهملة يحتاجان إلى كتل حرة.

مطابقة القرص مع الجهاز

المتطلب حاسوب ألعاب محطة عمل للتطوير أو صناعة المحتوى خادم قواعد بيانات أو أجهزة افتراضية تخزين كبير للقراءة غالبًا
الواجهة PCIe 4.0، و5.0 اختياري PCIe 4.0، أو 5.0 في فتحة المعالج U.2 أو E1.S أو E3.S أو M.2 22110 PCIe 4.0 أو 3.0، وفتحة مجموعة الشرائح تكفي
4K العشوائية عند QD1 أولوية عالية أولوية عالية عالية، مع IOPS بعمق كبير وp99.9 أولوية منخفضة
DRAM أو HMB HMB مقبول DRAM أفضل DRAM HMB مقبول
NAND TLC، وQLC لمكتبة الألعاب TLC TLC للمؤسسات QLC مقبول
الكتابة بعد الذاكرة المؤقتة أولوية منخفضة أولوية عالية قيمة الحالة المستقرة منخفضة ما لم يكن الاستيراد كبيرًا
قدرة التحمل 0.3 DWPD كافٍ احسبها من كتاباتك 1 DWPD أو أكثر أولوية منخفضة
الحماية من انقطاع الطاقة غير لازمة مفيدة لقواعد البيانات المحلية إلزامية غير لازمة
التبريد مبدد اللوحة الأم مبدد وتدفق هواء تهوية هيكل الخادم مبدد اللوحة الأم

قائمة التحقق قبل الشراء وبعده

  1. صِف الحمل: حجم الكتابة اليومي، وأكبر كتابة منفردة، ونمط الوصول، والبرمجيات كثيفة استدعاء fsync.
  2. تحقق من دليل اللوحة الأم أي فتحات M.2 متصلة بالمعالج وما الذي تعطّله.
  3. اختر TLC مع DRAM للأحمال العشوائية أو الكتابية الثقيلة، واترك HMB أو QLC للأدوار التي تغلب عليها القراءة.
  4. احسب DWPD من TBW واقرأ شروط الضمان.
  5. في الخوادم، اشترط PLP وتصنيف DWPD ومسارًا واضحًا لتحديث البرنامج الثابت.
  6. ركّب مبددًا حراريًا واحدًا مع تدفق هواء، وافحص عدادات الحرارة بعد أسبوع.
  7. بعد التركيب، تحقق من سرعة الوصلة وعرضها وسجّل إصدار البرنامج الثابت.
  8. شغّل مهام fio الثلاث واحتفظ بالنتائج مرجعًا أساسيًا.
  9. فعّل fstrim.timer وتحقق من المحاذاة وحدد صيغة LBA قبل تخزين البيانات.
  10. راقب Critical Warning وأخطاء الوسيط وAvailable Spare وPercentage Used، واحتفظ بنسخ احتياطية على وسائط أخرى.

مقالات أخرى