أولئك الذين يحاولون تجربة PostgreSQL 15 القادمة سيلاحظون عملية خلفية واحدة أقل:
postgres 1710 1 0 04:03 ? 00:00:00 /usr/pgsql-15/bin/postmaster -D /var/lib/pgsql/15/data/
postgres 1711 1710 0 04:03 ? 00:00:00 postgres: logger
postgres 1712 1710 0 04:03 ? 00:00:00 postgres: checkpointer
postgres 1713 1710 0 04:03 ? 00:00:00 postgres: background writer
postgres 1715 1710 0 04:03 ? 00:00:00 postgres: walwriter
postgres 1716 1710 0 04:03 ? 00:00:00 postgres: autovacuum launcher
postgres 1717 1710 0 04:03 ? 00:00:00 postgres: logical replication launcher
لنقارنها مع PostgreSQL 14:
postgres 1751 1 0 04:04 ? 00:00:00 /usr/pgsql-14/bin/postmaster -D /var/lib/pgsql/14/data/
postgres 1752 1751 0 04:04 ? 00:00:00 postgres: logger
postgres 1754 1751 0 04:04 ? 00:00:00 postgres: checkpointer
postgres 1755 1751 0 04:04 ? 00:00:00 postgres: background writer
postgres 1756 1751 0 04:04 ? 00:00:00 postgres: walwriter
postgres 1757 1751 0 04:04 ? 00:00:00 postgres: autovacuum launcher
postgres 1758 1751 0 04:04 ? 00:00:00 postgres: stats collector
postgres 1759 1751 0 04:04 ? 00:00:00 postgres: logical replication launcher
نعم ، لقد ولت عملية جامع الإحصائيات. لكن التخلص من هذه العملية أمر جيد ، فقد ذهب عنق الزجاجة والصداع إلى الأبد.
ما هي وظيفة جامع الإحصائيات؟
قد يتساءل المستخدمون المبتدئون عما هو عليه ولماذا هو مطلوب لـ PG 14 وما قبله. سيتم الخلط بين بعض المستخدمين على الأقل حول مجموعة الإحصائيات على مستوى الجدول (ANALYZE) المستخدمة لخطط الاستعلام. لكن هذا مختلف. تتعقب PostgreSQL كل نشاط كل عملية للحصول على إحصاءات تراكمية ، مثل عدد المرات التي تم فيها فحص جدول أو فهرس ، أو آخر مرة تم فيها تشغيل الفراغ أو الفراغ التلقائي على طاولة ، أو عدد مرات تشغيل الفراغ التلقائي على طاولة ، إلخ. تتوفر جميع البيانات التي تم جمعها بواسطة جامع الإحصائيات من خلال طرق عرض pg_stat_ * المختلفة.
سؤال
نظرًا لأن كل واجهة خلفية للجلسة هي عملية منفصلة في PostgreSQL ، فإن جمع الإحصائيات ونقلها ليس بالأمر الهين. ترسل كل خلفية معلومات حول الأنشطة التي يقومون بها إلى عملية واحدة "جامع الإحصائيات".
كان هذا الاتصال عبر مآخذ UDP. هناك الكثير من المشاكل في هذا النهج ، فهو ليس نموذجًا قابلًا للتطوير.
غالبًا ما يبلغ المستخدمون عن أنواع مختلفة من المشكلات ، مثل: الإحصائيات القديمة ، ومجمع الإحصائيات لا يعمل ، والفراغ التلقائي لا يعمل / يبدأ ، وما إلى ذلك.
كان من الصعب حقًا فهم الخطأ الذي حدث إذا واجه جامع الإحصائيات مشكلة في جهاز معين.
تأثير سلبي آخر لـ "جامع الإحصائيات" هو الإدخال / الإخراج الذي يسببه. إذا قمت بتمكين DEBUG level 2 ، فقد ترى الرسائل التي تستمر في الظهور في سجل PostgreSQL ، مثل:
2022-08-22 03:49:57.153 UTC [736] DEBUG: received inquiry for database 0
2022-08-22 03:49:57.153 UTC [736] DEBUG: writing stats file "pg_stat_tmp/global.stat"
2022-08-22 03:49:57.153 UTC [736] DEBUG: writing stats file "pg_stat_tmp/db_0.stat"
2022-08-22 03:49:57.168 UTC [1278] DEBUG: autovacuum: processing database "postgres"
2022-08-22 03:49:57.168 UTC [736] DEBUG: received inquiry for database 13881
2022-08-22 03:49:57.168 UTC [736] DEBUG: writing stats file "pg_stat_tmp/global.stat"
2022-08-22 03:49:57.168 UTC [736] DEBUG: writing stats file "pg_stat_tmp/db_13881.stat"
2022-08-22 03:49:57.169 UTC [736] DEBUG: writing stats file "pg_stat_tmp/db_0.stat"
هذا يمكن أن يسبب الكثير من الإدخال / الإخراج إلى نقطة التحميل حيث يوجد دليل البيانات. هذا هو المكان الذي تشير إليه قيمة المعلمة stats_temp_directory. في العديد من الأنظمة ستكون pg_stat_tmp في دليل البيانات.
على Ubuntu / Debian ، سيكون في / var / run / postgresql ، على سبيل المثال:
postgres=# show stats_temp_directory ;
stats_temp_directory
-----------------------------------------
/var/run/postgresql/14-main.pg_stat_tmp
(1 row)
الجديد في PostgreSQL 15
ابدأ في استخدام الذاكرة المشتركة الديناميكية لجمع الإحصائيات بدلاً من استخدام الملفات وأنظمة الملفات.
في السابق ، تلقى جامع الإحصائيات تحديثات إحصائية عبر UDP والإحصاءات المشتركة عن طريق كتابة الإحصائيات بشكل دوري في ملف مؤقت. يمكن أن تصل هذه الملفات إلى عشرات الميغابايت ويتم كتابتها حتى مرتين في الثانية. هذا يمنعنا من إضافة احصائيات مفيدة أخرى.
يتم الآن تخزين الإحصائيات في الذاكرة المشتركة. يتم تخزين الإحصائيات الخاصة بالعناصر المرقمة المتغيرة في جدول تجزئة dshash (مدعوم بذاكرة مشتركة ديناميكية). يتم تخزين الإحصائيات ذات الأرقام الثابتة في الذاكرة المشتركة العادية.
يحتوي ملف الرأس الخاص بـ pgstat.c على نظرة عامة على البنية.
لم تعد هناك حاجة إلى جامع الإحصائيات ، قم بإزالته.
تقوم النسخة المتماثلة الآن بإزالة إدخالات الإحصائيات للكائنات المحذوفة ، بدءًا من نسخة متماثلة مغلقة تمامًا لم تعد بحاجة إلى إعادة تعيين الإحصائيات.
على ما يبدو ، المعلمة stats_temp_directory مفقودة. لذلك ، لا نحتاج إلى دليل pg_stat_tmp ، الموجود في دليل البيانات (أو في أي مكان آخر) ، حيث يتم إنشاء جميع ملفات الإحصاء وقراءتها. ومع ذلك ، يتم الاحتفاظ بهذا الدليل لأن العديد من الامتدادات التي تعتمد عليه ، مثل pg_stat_statements ، ليست معطلة.
يظل الدليل فارغًا حتى يتم تحميل مكتبة الملحقات. على سبيل المثال ، إذا قمنا بتحميل مكتبة pg_stat_statements ، فسيظهر ملف في الدليل.
ls pg_stat_tmp/
pgss_query_texts.stat
بالطبع ، الإضافات ليست مجانية ، ولديها أيضًا تكاليف مقابلة.
في البنية الجديدة ، يتم تجميع معظم تحديثات الإحصائيات أولاً على أنها "معلقة" محليًا في كل عملية (تحتوي كل واجهة خلفية على جدول تجزئة محلي في الخلفية). تعني "معلقة" أنه تم تجميعها ولكن لم يتم الالتزام بها بعد في نظام الإحصائيات المشتركة. سيتم بعد ذلك مسحها في الذاكرة المشتركة بعد الالتزام أو انتهاء المهلة.
يحدث تناسق القراءة لأن الإحصائيات يتم تحديثها في نفس الوقت الذي يحاول فيه شخص ما القراءة. لذا ، تقدم PostgreSQL 15 معاملاً جديدًا: stats_fetch_consistency ، والذي يمكن أن يأخذ ثلاث قيم من لا شيء ، أو ذاكرة تخزين مؤقت أو لقطة:
· "لا شيء" هو الأكثر كفاءة. ومع ذلك ، لن يتم توفير تناسق القراءة. لكن بالنسبة لمعظم الاستخدام يجب أن يكون جيدًا.
تضمن "ذاكرة التخزين المؤقت" أن عمليات الوصول المتكررة تسفر عن نفس القيمة ، وهو أمر ضروري للحالات التي تتضمن على سبيل المثال عمليات الصلات الذاتية.
"اللقطة" مفيدة عند فحص الإحصائيات بشكل تفاعلي ، ولكنها أكثر تكلفة.
افتراضات على "ذاكرة التخزين المؤقت"
إذا كانت في الذاكرة المشتركة ، فكيف يمكن الاحتفاظ بها بعد إعادة التشغيل؟
قبل إيقاف التشغيل ، ستكتب عملية نقطة التفتيش هذه الإحصائيات إلى نظام الملفات ، والتي يمكن تحميلها مرة أخرى بعد إعادة التشغيل. عادة ، في حالة تعطلها ، يتم فقد الإحصائيات.
هل سيؤثر هذا التغيير على المراقبة / البرمجة النصية الخاصة بي؟
ستستمر طرق عرض المراقبة pg_stat_ * في العمل. ومع ذلك ، تأكد من الحصول على القيمة المناسبة لـ stats_fetch_consistency. كما ذكر أعلاه ، فإن دليل pg_stat_tmp محجوز للإمتدادات فقط.
آخر
كثير من الناس ، مثلي ، يستخدمون أحداث انتظار postgresql لفهم postgresql وأين تقضي الجلسات وقتهم. تحلل أدوات جمع البيانات وتحليلها ، مثل pg_gather ، المشكلات باستخدام أحداث الانتظار.
لمراقبة postgresql بشكل أفضل ، تم تقديم ثلاثة أحداث انتظار جديدة:
PgStatsDSA: انتظر إحصائيات الوصول الديناميكي لمخصص الذاكرة المشتركة
PgStatsHash: انتظر الوصول إلى جدول إحصائيات تجزئة الذاكرة المشتركة
PgStatsData: في انتظار الوصول إلى إحصائيات الذاكرة المشتركة
مع انتهاء كل النفقات العامة لمجمع الإحصائيات وصيانته ، فإن الأنظمة الفرعية الأخرى (مثل الفراغ التلقائي) لديها عمل أقل للقيام به.
بالإضافة إلى ذلك ، من المتوقع أن تؤدي أدوات المراقبة التي تستفسر عن الإحصائيات بشكل متكرر إلى تقليل حمل النظام بشكل كبير.