إعداد ذاكرة قاعدة البيانات حسب مستواك
قيم buffer محددة لـ PostgreSQL و MySQL لمستويات VDS-1…VDS-6، وقاعدة لتوزيع الذاكرة بين قاعدة البيانات والتطبيق والنظام.
آخر تحديث 23 أغسطس 2026
إعدادات قاعدة البيانات الافتراضية مصممة لتعمل في أي مكان، لا لتكون سريعة. على VDS-3 بذاكرة 8 GB، تستهلك PostgreSQL جاهزةً 128 MB للتخزين المؤقت — أي أنها تقرأ كل شيء تقريبًا من القرص، مع أنها قادرة على القراءة من الذاكرة.
قاعدة التوزيع
وزّع ذاكرة المستوى على هذا النحو تقريبًا:
- عمليات النظام والخدمات — 10–15%؛
- التطبيق (PHP-FPM، Node، gunicorn) — حسب عدد العمال؛
- قاعدة البيانات — ما تبقّى، بحد أقصى 60–70% من الذاكرة الكلية.
لا تمنح قاعدة البيانات كل الذاكرة أبدًا: سيدخل النظام في swap، ولن تنفعك NVMe — سيزداد زمن الاستجابة عشرات المرات.
المستخدم حاليًا:
free -h
ps -eo pmem,rss,comm --sort=-rss | head
تتوفر رسوم بيانية للذاكرة لمدة ساعة ويوم وأسبوع وشهر في «نظرة عامة» في لوحة التحكم /hosting/vds/m/<id> — وهي تُظهر الذروة الحقيقية، لا اللحظة الراهنة.
PostgreSQL
/etc/postgresql/17/main/postgresql.conf:
| المستوى | shared_buffers | effective_cache_size | work_mem | maintenance_work_mem | max_connections |
|---|---|---|---|---|---|
| VDS-1 (2 GB) | 384MB | 1GB | 8MB | 96MB | 40 |
| VDS-2 (4 GB) | 1GB | 2GB | 12MB | 256MB | 60 |
| VDS-3 (8 GB) | 2GB | 5GB | 16MB | 512MB | 100 |
| VDS-4 (16 GB) | 4GB | 10GB | 24MB | 1GB | 150 |
| VDS-5 (24 GB) | 6GB | 16GB | 32MB | 2GB | 200 |
| VDS-6 (32 GB) | 8GB | 22GB | 48MB | 2GB | 250 |
إضافةً إلى إعدادات NVMe العامة:
random_page_cost = 1.1
effective_io_concurrency = 200
يُخصَّص work_mem لكل عملية فرز، لا لكل اتصال: مئة استعلام متوازٍ بفرز معقّد ستضاعفه مئات المرات. لا تضبطه على قيمة عالية جدًا.
التطبيق: systemctl restart postgresql (تغيير shared_buffers يتطلب إعادة تشغيل تحديدًا).
MySQL وMariaDB
| المستوى | innodb_buffer_pool_size | innodb_log_file_size | max_connections |
|---|---|---|---|
| VDS-1 | 512M | 128M | 60 |
| VDS-2 | 1G | 256M | 100 |
| VDS-3 | 3G | 512M | 150 |
| VDS-4 | 8G | 1G | 200 |
| VDS-5 | 12G | 1G | 250 |
| VDS-6 | 18G | 2G | 300 |
innodb_flush_method = O_DIRECT
innodb_flush_log_at_trx_commit = 1
innodb_io_capacity = 2000
مجمّع المخزن المؤقت هو المعامل الرئيسي: إذا اتّسع لمجموعة البيانات العاملة، فلا يُقرأ القرص إلا نادرًا.
التحقق من الأثر
SELECT sum(blks_hit)*100/sum(blks_hit+blks_read) FROM pg_stat_database;
بالنسبة إلى MySQL، انظر إلى SHOW ENGINE INNODB STATUS ونسبة Innodb_buffer_pool_reads إلى Innodb_buffer_pool_read_requests. معدل إصابة التخزين المؤقت دون 95% يعني أن قاعدة البيانات لا تملك ذاكرة كافية.
الأخطاء الشائعة
| العَرَض | السبب |
|---|---|
| قاعدة البيانات لا تبدأ بعد التعديل | طُلبت ذاكرة أكثر مما هو متاح — راجع السجل |
| أُنهيت العملية بواسطة OOM | قاعدة البيانات والتطبيق والنظام معًا تتجاوز ذاكرة المستوى |
| صارت أبطأ بعد «التحسين» | work_mem مضبوط على قيمة عالية جدًا، والجهاز يستخدم swap |
| القرص يُقرأ باستمرار | المخازن المؤقتة صغيرة جدًا، ومجموعة البيانات العاملة لا تتسع |
إذا كنت لا تزال تصطدم بحائط بعد ضبط الذاكرة، فالمشكلة في حجم البيانات لا في الإعدادات. لا يمكنك سوى ترقية خطتك، مع دفع متناسب عن الأيام المتبقية من المدة المدفوعة؛ التخفيض غير متاح، لذا اختر المستوى التالي بعناية.