PRODمنصة BaaS الأوروبية السياديةافتح لوحة المعلومات →

الأداء · 11 دقيقة للقراءة

Postgres ضبط الإنتاج الذي يقلل زمن الوصول

Affane Daylami · Fondateur · 3 يونيو 2026

العودة إلى بلوق

تنقسم قائمة ضبط Postgres في الإنتاج إلى خمسة أقسام: الاتصالات والتجميع، والذاكرة، والفراغ التلقائي، والاستعلامات البطيئة والفهارس، ثم نقاط التفتيش وWAL. الباقي هو مجرد اختلاف في هذه النقاط الخمس اعتمادًا على حملك. المعلمات التي تظهر في أغلب الأحيان، Shared_buffers وwork_mem وeffact_cache_size، مفصلة أدناه مع نقاط البداية الخاصة بها.

تم إنشاء هذا النص الإنجليزي تلقائيًا من النص الأصلي الفرنسي ولم تتم مراجعته بعد.
تمت ترجمة هذه الصفحة تلقائيًا. النسخة الإنجليزية موثوقة.

postgresql.conf افتراضيًا ليس معطلاً، ومن الحكمة: أن يكون حجمه مناسبًا للتشغيل على جهاز بسيط دون التسبب في فشل التثبيت، وعدم التعامل مع حركة الإنتاج الخاصة بك. إن الانتقال من قيم التوافق هذه إلى قيم الإنتاج يتم قياسه ولا يمكن تخمينه. بالنسبة لبروتوكول القياس نفسه (الحمل الواقعي، p50/p95/p99، النتائج القابلة للتكرار)، راجع منهجية قياس الواجهة الخلفية . توضح هذه المقالة تفاصيل الإعدادات نفسها، بالترتيب الأكثر أهمية.

الأساسيات
  • خمسة مشاريع بالترتيب: الاتصالات/التجميع، الذاكرة، الفراغ التلقائي، الفهارس/الاستعلامات البطيئة، نقاط التفتيش/WAL.
  • يتطلب max_connections وshared_buffers إعادة تشغيل الخادم بالكامل؛ يتم تحميل معظم الإعدادات الأخرى بشكل ساخن.
  • لا تقم أبدًا بتعطيل الفراغ التلقائي في الإنتاج: فالخطر الحقيقي ليس البطء، بل هو التفاف معرف المعاملة.
  • يجب إدراج pg_stat_statements في shared_preload_libraries قبل أن يقوم CREATE EXTENSION البسيط بجمع أي شيء.
  • يقوم المستشار المدمج في Aurabase Studio بالفعل بتطبيق جزء من قائمة التحقق هذه تلقائيًا: الطلبات التي تدوم أكثر من 150 مللي ثانية، والمفاتيح الخارجية غير مفهرسة، وتجمع الاتصال يتجاوز تشبع 80%.
#
نقطة البداية

لماذا لا تكون الإعدادات الافتراضية لـ Postgres كافية أبدًا

postgresql.conf، في حالته الافتراضية، تم تصميمه بحيث لا يفشل التثبيت أبدًا، وليس لاستيعاب حركة المرور الخاصة بك. القيمة التاريخية لـ shared_buffers، 128 ميجابايت، تسمح لـ Postgres بالبدء على جهاز بسيط دون حجز أي موارد مهمة. max_connections بسعر 100 يناسب خادمًا مشتركًا صغيرًا. لم يتم اختيار أي منهما للتحميل الفعلي.

لذا فإن المشكلة لا تكمن في أن Postgres تم ضبطه بشكل سيئ افتراضيًا: بل في أنه لم يتم تعيينه لك مطلقًا. تستعرض الأقسام التالية الإعدادات بالترتيب الذي تحقق فيه أكبر فائدة، بدءًا من عنق الزجاجة الأكثر شيوعًا (الاتصالات) إلى الأبطأ في الظهور (WAL).

#
اتصالات

حجم max_connections والتجميع قبل كل شيء آخر

المشروع الأول ليس الذاكرة، بل هو الاتصالات. يفتح كل اتصال Postgres عملية خادم مخصصة تستهلك ذاكرة الوصول العشوائي (RAM) ووقت وحدة المعالجة المركزية (CPU) للسياق، حتى لو كانت خاملة. تؤدي زيادة max_connections لتجنب أخطاء نوع "عدد كبير جدًا من الاتصالات" إلى تغيير المشكلة: بما يتجاوز عدد معين من الاتصالات النشطة المتزامنة، يؤدي تنافس وحدة المعالجة المركزية إلى تقليل زمن الوصول لجميع الطلبات، بما في ذلك الطلبات الأسرع.

يعكس النهج الصحيح الترتيب المعتاد: قم بقياس max_connections على التزامن الفعلي للخادم، ثم استوعب التزامن من جانب التطبيق باستخدام مُجمّع مثل PgBouncer في pool_mode=transaction. يقوم المجمع بمضاعفة مئات اتصالات العميل على عدد قليل من اتصالات الخادم النشطة بالفعل. تفاصيل مقالتنا المخصصة آلية وضع المعاملة وحدودها (البيانات المعدة، LISTEN/NOTIFY)، ومقارنة بين PgBouncer وSupavisor وPgCat لاختيار التنفيذ.

max_connections عبارة عن معلمة سياق "postmaster": يتطلب تغييرها إعادة تشغيل الخادم بالكامل، وليس إعادة تحميل بسيطة. في مثيلات Postgres المخصصة لـ Aurabase (خطط Pro وEnterprise، مجموعة CNPG واحدة لكل مشروع)، يتم تكوين هذا الإعداد لكل طبقة خطة بدلاً من تركه عند قيمته الافتراضية. إن إعادة التشغيل ليست عملية تافهة يمكن تكرارها في الإنتاج، وهو ما يبرر هذا الاختيار على مراحل وليس على قيمة ثابتة. صيغة اختيار القيمة الخاصة بك بحدودها هي موضوع مقال منفصل: size max_connections.

#
الذاكرة

Shared_buffers، وwork_mem، وeffact_cache_size: الإعدادات المهمة

أربعة إعدادات للذاكرة تزن أكثر من جميع الإعدادات الأخرى مجتمعة: shared_buffersو effective_cache_sizeو work_mem و maintenance_work_mem. تحدد الثلاثة الأولى مقدار البيانات التي يحتفظ بها Postgres في الذاكرة قبل العودة إلى القرص؛ والرابع يحدد سرعة إنشاء الفراغ أو الفهرس.

shared_buffers يقوم بتعيين ذاكرة التخزين المؤقت الداخلية المشتركة بين جميع الاتصالات. المعيار الموثق عادة بواسطة مشروع PostgreSQL هو حوالي 25% من ذاكرة الوصول العشوائي المتوفرة على خادم قاعدة بيانات مخصص. وبعد ذلك، تنخفض المكاسب وتتولى ذاكرة التخزين المؤقت على قرص نظام التشغيل المسؤولية. effective_cache_size لا يخصص أي شيء: إنه تقدير، يُعطى لمخطط الاستعلام، لإجمالي الذاكرة المتاحة لذاكرة التخزين المؤقت (Postgres ونظام التشغيل مجتمعين). يؤدي تصغير حجمه إلى دفع المجدول نحو عمليات الفحص التسلسلي بينما يتم تخزين الفهرس مؤقتًا إلى حد كبير؛ يتراوح المعيار الحالي بين 50 و 75٪ من ذاكرة الوصول العشوائي.

work_mem هو الفخ الأكثر شيوعًا. هذا ليس الحد العالمي. يمكن أن تستهلك كل عملية فرز أو تجزئة في استعلام حصتها الخاصة منها، ويمكن للاستعلام الذي يحتوي على صلات متعددة حجز حصته الخاصة عدة مرات. يمكن أن تؤدي القيمة السخية جدًا مع max_connections العالية إلى استنفاد ذاكرة الوصول العشوائي للخادم تحت التحميل المتزامن، حتى لو كان كل طلب يتم أخذه على حدة يبدو معقولاً. maintenance_work_mem، على العكس من ذلك، يمكن أن تظل أكثر سخاءً بشكل ملحوظ: فهي تنطبق فقط على عمليات الصيانة (VACUUM، CREATE INDEX)، والتي نادرًا ما تكون متزامنة مع بعضها البعض.

فقط shared_buffers يتطلب إعادة التشغيل. يتم إعادة تحميل الثلاثة الأخرى بشكل سريع، بما في ذلك جلسة معزولة: SET work_mem = '64MB'; لمدة طلب جشع واحد، دون التأثير على الإعداد العام.

#
الصيانة

الفراغ التلقائي: اضبط العتبات، ولا تقم بإلغاء تنشيطها أبدًا

لا تقم مطلقًا بتعطيل الفراغ التلقائي في الإنتاج، حتى ولو مؤقتًا من أجل "تحرير الموارد" أثناء ذروة الحمل. يستخدم Postgres MVCC: كل تحديث وكل حذف يترك حدًا نهائيًا لا يمكن استرداده إلا بالفراغ. وبدون ذلك، تتضخم الجداول، وتتدهور الفهارس، وتتدهور خطط التنفيذ تدريجيًا، مع عدم ظهور أي أخطاء حتى فوات الأوان.

الخطر الحقيقي ليس البطء

إن أخطر خطر للمكنسة الكهربائية المعطلة أو ذات الحجم الصغير ليس الأداء، بل هو ملفوف لمعرف المعاملة. بعد الحد الأدنى، يقوم Postgres بتحويل قاعدة البيانات بأكملها إلى وضع القراءة فقط لتجنب تلف البيانات، حتى يتم تنفيذ VACUUM يدويًا. يعد هذا حادث إنتاج يمكن تجنبه تمامًا من خلال التكوين الصحيح.

القيمة الافتراضيةautovacuum_vacuum_scale_factor (20% من الصفوف الميتة قبل التشغيل) مناسبة لجدول صغير، وليس لجدول صفوف كثيف الكتابة يبلغ عدة ملايين. على طاولة مكونة من 10 ملايين صف، يمثل هذا الـ 20% 2 مليون صف ميت متراكم قبل التمريرة الأولى. قم بخفض جدول العتبة هذا حسب الجدول بدلاً من تغيير القيمة الإجمالية لقاعدة البيانات بأكملها.

psqlsql
-- قم بتخفيض العتبة على جدول مثقل بالكتابة، وليس بشكل عام
ALTER TABLE orders SET (
  autovacuum_vacuum_scale_factor = 0.05,
  autovacuum_vacuum_cost_limit = 2000
);

يتحقق المستشار المدمج في Aurabase Studio من هذا التكوين عند كل تحليل للمشروع، بنفس طريقة الجداول التي لا تحتوي على مفاتيح أساسية أو مفاتيح خارجية غير مفهرسة. وهذه إشارة صريحة وليست تدهورًا صامتًا تم اكتشافه بعد فوات الأوان.

#
الاستعلامات البطيئة

فهرس قبل إضافة ذاكرة الوصول العشوائي

غالبية مشاكل زمن الوصول في الإنتاج لا تأتي من وحدة المعالجة المركزية ولا من ذاكرة الوصول العشوائي: فهي تأتي من فهرس غائب أو تم اختياره بشكل سيئ. قبل لمس معلمة واحدة لـ postgresql.conf، يظل EXPLAIN (ANALYZE, BUFFERS) في الاستعلام المعني هو التشخيص الأكثر موثوقية. إنه يقلل من زمن استجابة طلب Postgres جيدًا قبل إضافة الموارد.

psqlsql
-- تشخيص استعلام بطيء قبل لمس التكوين
EXPLAIN (ANALYZE, BUFFERS)
SELECT o.id, o.total
FROM orders o
WHERE o.customer_id = '…'
ORDER BY o.created_at DESC
LIMIT 20;

يشير Seq Scan على جدول صفوف متعدد الملايين، حيث كان من المتوقع Index Scan، دائمًا إلى وجود مشكلة في الفهرس. تظهر ثلاثة أسباب في أغلب الأحيان: فهرس مفقود، أو نوع عمود غير متوافق مع الفهرس الموجود، أو إحصائيات قديمة بعد عملية استيراد ضخمة بدون ANALYZE. تؤدي إضافة ذاكرة الوصول العشوائي (RAM) أو زيادة work_mem في بعض الأحيان إلى إخفاء هذا العَرض على حجم صغير من البيانات؛ تظهر المشكلة مرة أخرى بمجرد نمو الجدول.

لتحديد موقع هذه الطلبات دون البحث عنها واحدًا تلو الآخر، يقوم pg_stat_statements بتجميع إحصائيات التنفيذ لجميع طلبات الخادم. خطأ شائع: يجب أولاً إدراج الامتداد في shared_preload_libraries، وهو معلمة سياق "postmaster" التي تتطلب إعادة التشغيل. بدون هذه الخطوة، CREATE EXTENSION pg_stat_statements; ينجح بصمت ولكنه لا يجمع شيئًا.

postgresql.conf → psqlsql
# يتطلب إعادة تشغيل كاملة (المعلمة "postmaster")
shared_preload_libraries = 'pg_stat_statements'

-- بمجرد إعادة تشغيل الخادم، في كل قاعدة بيانات للمراجعة:
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;

SELECT query, calls, mean_exec_time, max_exec_time
FROM pg_stat_statements
ORDER BY mean_exec_time DESC
LIMIT 10;

هذا هو بالضبط الخطأ الذي ترجعه الواجهة الخلفية لـ Aurabase عند غياب هذا الامتداد: رسالة صريحة بدلاً من قائمة فارغة صامتة، والتي يمكن الخلط بينها وبين "لا يوجد استعلام بطيء". يذهب Studio Advisor إلى أبعد من ذلك: فهو يصنف تلقائيًا أي طلب بمتوسط ​​وقت يزيد عن 150 مللي ثانية كتحذير، وأكثر من 500 مللي ثانية كطلب حرج. تستند هذه الحدود إلى نفس إحصائيات pg_stat_statements.

#
الكتابة على القرص

نقاط التفتيش و WAL: تخفيف العبء بدلاً من تحمله

تجبر نقطة التفتيش Postgres على الكتابة إلى القرص جميع الصفحات التي تم تعديلها في الذاكرة منذ الصفحة السابقة. افتراضيًا، قد تركز هذه الكتابة على فترة زمنية قصيرة جدًا. والنتيجة هي ارتفاع ملحوظ في زمن استجابة القرص من جانب التطبيق، وهو نوع من التباطؤ الدوري الذي يصعب ربطه بطلب محدد.

يتحكم checkpoint_completion_target في انتشار هذه الكتابة خلال الفاصل الزمني بين نقطتي التحقق. هناك تفصيل مفقود من قوائم المراجعة القديمة: قام PostgreSQL 14، الذي تم إصداره في عام 2021، بتغيير قيمته الافتراضية من 0.5 إلى 0.9. في مثيل PostgreSQL 16، مثل مجموعات مستأجر Aurabase المخصصة، يكون هذا الإعداد صحيحًا بالفعل بشكل افتراضي؛ يعد ضبطه يدويًا أمرًا منطقيًا فقط في الإصدار الذي يسبق الإصدار 14. راجع المقارنة الخاصة بنا PostgreSQL 16 vs 17 vs 18 للتعرف على تغييرات الإصدار الأخرى التي تؤثر على الضبط.

تعمل max_wal_size في نفس الاتجاه: تؤدي القيمة المنخفضة جدًا إلى تشغيل نقاط تفتيش أكثر تكرارًا من المتوقع، حتى عندما لم يتم الوصول إلى checkpoint_timeout بعد. وتؤدي زيادته إلى تقليل تكرار نقاط التفتيش، على حساب وقت أطول للتعافي بعد التعطل نظرًا لوجود عدد أكبر من WALs لإعادة التشغيل. حل وسط يتم تحديده وفقًا لتسامحك مع عدم التوفر، وليس قيمة عالمية.

#
مستمر

إن المراقبة ليست خطوة، بل هي الحلقة التي تغلق قائمة المراجعة

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

هناك ثلاث إشارات تستحق المراقبة المستمرة. يحدد pg_stat_statements الطلبات التي تنخفض بمرور الوقت. يُبلغ pg_stat_activity عن الاستعلامات المحظورة أو التي يتم تشغيلها لفترة طويلة بشكل غير طبيعي، وتتوقع نسبة الاتصالات النشطة إلى max_connections التشبع قبل أن تنتج أخطاء من جانب التطبيق.

تغطي علامة التبويب "قابلية المراقبة" في Studio جزءًا من هذا الأساس لأي مشروع Aurabase، دون الحاجة إلى تثبيت أدوات خارجية. يسرد الطلبات البطيئة، ويسمح لك بإلغاء أو إنهاء طلب نشط بواسطة PID، ويعرض مؤشر تشبع المجمع الذي يذهب إلى تحذير فوق استخدام 80٪. في مثيل مستضاف ذاتيًا، يتم إنشاء نفس المراقبة يدويًا، مع تنشيط pg_stat_statements وتوصيل أداة مراقبة خارجية به.

#
ملخص

ورقة الغش: القائمة المرجعية الكاملة

ثمانية إعدادات، بالترتيب الذي تحقق فيه أكبر فائدة، مع ما تحتاج إلى معرفته قبل أن تلمسها.

max_connectionsإعادة التشغيلالحجم على أساس المنافسة الحقيقية، وليس رقمًا تقريبيًا؛ استيعاب الباقي عبر المجمع في وضع المعاملة.
shared_buffersإعادة التشغيل≈ 25% من ذاكرة الوصول العشوائي مخصصة لـ Postgres.
effact_cache_sizeحار≈ 50 إلى 75% من ذاكرة الوصول العشوائي (ذاكرة التخزين المؤقت لنظام التشغيل Postgres + مجتمعة).
Work_memساخن/جلسةحذر افتراضيا؛ اختبار صعودا على أساس الاستعلام عن طريق الاستعلام مع SET.
Maintenance_work_memحارأكثر سخاءً منwork_mem؛ يسرع الفراغ وإنشاء الفهرس.
autovacuum_vacuum_scale_factorحوض استحمام ساخن، لكل طاولةأقل على الجداول الكبيرة المثقلة بالكتابة، وليس عالميًا أبدًا.
check_point_completion_targetحار0.9 افتراضيًا منذ PostgreSQL 14؛ للتحقق خاصة على إصدار سابق.
Shared_preload_librariesإعادة التشغيليجب أن تتضمن pg_stat_statements قبل أي تحليل استعلام بطيء.

تعتبر الحدود المذكورة هنا، مثل تشبع المجموعة 150 مللي ثانية و80% التي يراقبها Aurabase Studio Advisor، نقطة بداية تم التحقق من صحتها برمجيًا، وليست حقيقة عالمية. تظل التهمة الفعلية هي الحكم النهائي الوحيد. لتحديد حجم max_connections بدقة بدلاً من اتباع قاعدة عامة، توضح المقالة المخصصة تفاصيل الصيغة وحدودها.

#
الأسئلة المتداولة

الأسئلة الشائعة

ثلاثة أسئلة تطرح بشكل منهجي بمجرد تطبيق القائمة المرجعية لأول مرة.

هل يجب علي إعادة تشغيل Postgres بعد تغيير قيمة postgresql.conf؟+
ذلك يعتمد على الإعداد. max_connections وshared_buffers موجودان في سياق "مدير مكتب البريد": يلزم إعادة التشغيل بالكامل. work_memو effective_cache_sizeو maintenance_work_mem ويمكن إعادة شحن معظم عتبات الفراغ التلقائي باستخدام SELECT pg_reload_conf(); أو pg_ctl reloadدون انقطاع الخدمة.
هل يمكننا إلغاء تنشيط الفراغ التلقائي لتحسين الأداء؟+
لا، أبدا في الإنتاج. إن إيقاف تشغيله لا يؤدي إلى اختفاء أعمال التنظيف: بل يتراكم. بدون تدخل، ينتهي الأمر بفرض فراغ يدوي، أو ما هو أسوأ من ذلك، تشغيل ملف تعريف المعاملة الذي يجعل قاعدة البيانات للقراءة فقط. اضبط جدول العتبات حسب الجدول بدلاً من قطع الآلية.
كم مرة يجب عليك مراجعة قائمة المراجعة هذه؟+
عند كل تغيير كبير في الحجم أو التحميل، وليس فقط عند النشر الأولي. النمط الذي يتضاعف في الحجم أو حركة المرور مضروبة في ثلاثة يجعل نقاط البداية المذكورة أعلاه قديمة. توضح منهجيتنا المعيارية الخلفية كيفية إنشاء بروتوكول قياس يتكرر بمرور الوقت بدلاً من إجراء تدقيق معزول.

هل أنت جاهز للنشر؟

الواجهة الخلفية الخاصة بك في خمس دقائق.

لا حاجة لبطاقة ائتمان · 500 ميجابايت مجانًا · 50000 MAU