استكشاف أخطاء استخدام IOPS العالي لقاعدة بيانات Azure ل PostgreSQL - الخادم المرن وإصلاحها

ينطبق على: قاعدة بيانات Azure ل PostgreSQL - خادم مرن

توضح هذه المقالة كيفية تحديد السبب الجذري لاستخدام عمليات الإدخال والإخراج العالية (عمليات الإدخال/الإخراج في الثانية) بسرعة، وتوفر إجراءات علاجية للتحكم في استخدام IOPS عند استخدام قاعدة بيانات Azure لخادم PostgreSQL المرن.

في هذه المقالة، ستتعرف على كيفية:

  • حول أدلة استكشاف الأخطاء وإصلاحها لتحديد والحصول على توصيات للتخفيف من الأسباب الجذرية.
  • استخدم الأدوات لتحديد استخدام الإدخال/الإخراج العالي (I/O)، مثل مقاييس Azure ومخزن الاستعلامات pg_stat_statements.
  • تحديد الأسباب الجذرية، مثل الاستعلامات طويلة الأمد، وتوقيتات نقاط التحقق، وعملية الإخلاء التلقائي الخفية المعطلة، والاستخدام العالي للتخزين.
  • حل استخدام الإدخال/الإخراج العالي باستخدام شرح التحليل، وضبط معلمات الخادم المتعلقة بنقطة التحقق، وضبط البرنامج الخفي للإخلاء التلقائي.

أدلة استكشاف الأخطاء وإصلاحها

باستخدام أدلة استكشاف الأخطاء وإصلاحها للميزة المتوفرة على مدخل خادم Azure Database for PostgreSQL المرن، يمكن العثور على السبب الجذري المحتمل والتوصيات للتخفيف من سيناريو استخدام IOPS العالي. كيفية إعداد أدلة استكشاف الأخطاء وإصلاحها لاستخدامها يرجى اتباع إرشادات استكشاف أخطاء الإعداد وإصلاحها.

أدوات لتحديد الاستخدام العالي الإدخال/إخراج

ضع في اعتبارك الأدوات التالية لتحديد استخدام الإدخال/الإخراج العالي.

Azure Metrics

تعد مقاييس Azure نقطة بداية جيدة للتحقق من استخدام الإدخال/الإخراج لتاريخ وفترة محددين. توفر المقاييس معلومات حول الوقت الذي يكون فيه استخدام الإدخال/الإخراج مرتفعا. قارن بين الرسوم البيانية لكتابة IOPs وقراءة IOPs ومعدل نقل القراءة ومعدل نقل الكتابة لمعرفة الأوقات التي يتسبب فيها حمل العمل في ارتفاع استخدام الإدخال/الإخراج. للمراقبة الاستباقية، يمكنك تكوين التنبيهات على المقاييس. للحصول على إرشادات خطوة بخطوة، راجع Azure Metrics.

Query Store

تلتقط ميزة Query Store تلقائيا محفوظات الاستعلامات وإحصائيات وقت التشغيل، وتحتفظ بها لمراجعتك. يقوم بتقسيم البيانات حسب الوقت لرؤية أنماط الاستخدام الزمني. يتم تخزين البيانات لجميع المستخدمين وقواعد البيانات والاستعلامات في قاعدة بيانات تسمى azure_sys في قاعدة بيانات Azure لمثيل خادم PostgreSQL المرن. للحصول على إرشادات خطوة بخطوة، راجع مراقبة الأداء باستخدام Query Store.

استخدم العبارة التالية لعرض أفضل خمس عبارات SQL التي تستهلك الإدخال/الإخراج:

select * from query_store.qs_view qv where is_system_query is FALSE
order by blk_read_time + blk_write_time  desc limit 5;

ملحق pg_stat_statements

pg_stat_statements يساعد الملحق في تحديد الاستعلامات التي تستهلك الإدخال/الإخراج على الخادم.

استخدم العبارة التالية لعرض أفضل خمس عبارات SQL التي تستهلك الإدخال/الإخراج:

SELECT userid::regrole, dbid, query
FROM pg_stat_statements
ORDER BY blk_read_time + blk_write_time desc
LIMIT 5;

إشعار

عند استخدام مخزن الاستعلام أو pg_stat_statements للأعمدة blk_read_time blk_write_time المراد ملؤها، تحتاج إلى تمكين معلمة track_io_timingالخادم . لمزيد من المعلومات حول track_io_timing، راجع معلمات الخادم.

تحديد الأسباب الجذرية

إذا كانت مستويات استهلاك الإدخال/الإخراج عالية بشكل عام، فقد يكون ما يلي الأسباب الجذرية:

العمليات طويلة الأمد

يمكن أن تستهلك المعاملات طويلة الأمد الإدخال/الإخراج، ما قد يؤدي إلى استخدام الإدخال/الإخراج العالي.

يساعد الاستعلام التالي في تحديد الاتصالات التي يتم تشغيلها لأطول وقت:

SELECT pid, usename, datname, query, now() - xact_start as duration
FROM pg_stat_activity
WHERE pid <> pg_backend_pid() and state IN ('idle in transaction', 'active')
ORDER BY duration DESC;

توقيت نقطة التحقق

يمكن أيضا رؤية الإدخال/إخراج عالي في السيناريوهات التي تحدث فيها نقطة تفتيش بشكل متكرر جدا. إحدى الطرق لتحديد ذلك هي عن طريق التحقق من ملف سجل الخادم المرن لقاعدة بيانات Azure ل PostgreSQL لنص السجل التالي: "LOG: نقاط التحقق تحدث بشكل متكرر جدا."

يمكنك أيضا التحقيق باستخدام نهج حيث يتم حفظ لقطات دورية من pg_stat_bgwriter مع طابع زمني. باستخدام اللقطات المحفوظة، يمكنك حساب متوسط الفاصل الزمني لنقطة التحقق وعدد نقاط التحقق المطلوبة وعدد نقاط التحقق التي تم تحديد موعدها.

عملية خفي للإخلاء التلقائي التخريبي

قم بتشغيل الاستعلام التالي لمراقبة الإخلاء التلقائي:

SELECT schemaname, relname, n_dead_tup, n_live_tup, autovacuum_count, last_vacuum, last_autovacuum, last_autoanalyze, autovacuum_count, autoanalyze_count FROM pg_stat_all_tables WHERE n_live_tup > 0;

يتم استخدام الاستعلام للتحقق من عدد المرات التي يتم فيها تفريغ الجداول في قاعدة البيانات.

  • last_autovacuum: التاريخ والوقت الذي تم فيه تشغيل آخر عملية إخلاء تلقائي على الجدول.
  • autovacuum_count: عدد المرات التي تم فيها تفريغ الجدول.
  • autoanalyze_count: عدد المرات التي تم فيها تحليل الجدول.

حل استخدام الإدخال/إخراج العالي

لحل استخدام الإدخال/الإخراج العالي، يمكنك استخدام أي من الطرق الثلاث التالية.

الأمر EXPLAIN ANALYZE

بعد تحديد الاستعلام الذي يستهلك الإدخال/الإخراج العالي، استخدم EXPLAIN ANALYZE لمزيد من التحقيق في الاستعلام وضبطه. لمزيد من المعلومات حول EXPLAIN ANALYZE الأمر، راجع خطة EXPLAIN.

إنهاء المعاملات طويلة الأمد

يمكنك التفكير في قتل معاملة طويلة الأمد كخيار.

لإنهاء معرف عملية جلسة العمل (PID)، تحتاج إلى الكشف عن PID باستخدام الاستعلام التالي:

SELECT pid, usename, datname, query, now() - xact_start as duration
FROM pg_stat_activity
WHERE pid <> pg_backend_pid() and state IN ('idle in transaction', 'active')
ORDER BY duration DESC;

يمكنك أيضا التصفية حسب خصائص أخرى، مثل usename (اسم المستخدم) أو datname (اسم قاعدة البيانات).

بعد الحصول على PID الخاص بجلسة العمل، يمكنك إنهائه باستخدام الاستعلام التالي:

SELECT pg_terminate_backend(pid);

ضبط معلمات الخادم

إذا لاحظت أن نقطة التحقق تحدث بشكل متكرر جدا، فقم بزيادة معلمة max_wal_size الخادم حتى يتم تحديد الوقت لمعظم نقاط التحقق، بدلا من طلبها. في النهاية، يجب أن يكون 90 بالمائة أو أكثر مستندا إلى الوقت، ويجب أن يكون الفاصل الزمني بين نقطتي التحقق قريبا من checkpoint_timeout القيمة التي تم تعيينها على الخادم.

  • max_wal_size: ساعات العمل القصوى هي الوقت المناسب للوصول max_wal_size إلى قيمة. للوصول إلى قيمة، قم بما يلي:

    1. قم بتشغيل الاستعلام التالي للحصول على WAL LSN الحالي، ثم لاحظ النتيجة:

      select pg_current_wal_lsn();
      
    2. checkpoint_timeout انتظر عدة ثوان. قم بتشغيل الاستعلام التالي للحصول على WAL LSN الحالي، ثم لاحظ النتيجة:

      select pg_current_wal_lsn();
      
    3. قم بتشغيل الاستعلام التالي، الذي يستخدم النتيجتين، للتحقق من الفرق، بالجيجابايت (GB):

      select round (pg_wal_lsn_diff ('LSN value when run second time', 'LSN value when run first time')/1024/1024/1024,2) WAL_CHANGE_GB;
      
  • checkpoint_completion_target: من الممارسات الجيدة تعيين القيمة إلى 0.9. على سبيل المثال، تشير قيمة 0.9 لمدة checkpoint_timeout 5 دقائق إلى أن الهدف لإكمال نقطة التحقق هو 270 ثانية (0.9*300 ثانية). توفر القيمة 0.9 تحميل إدخال/إخراج متسق إلى حد ما. قد تؤدي القيمة العدوانية إلى checkpoint_completion_target زيادة تحميل الإدخال/الإخراج على الخادم.

  • checkpoint_timeout: يمكنك زيادة checkpoint_timeout القيمة من القيمة الافتراضية التي تم تعيينها على الخادم. أثناء زيادة القيمة، خذ بعين الاعتبار أن زيادتها ستزيد أيضا من وقت استرداد الأعطال.

ضبط الإخلاء التلقائي لتقليل الاضطرابات

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

زيادة مساحة التخزين

تساعد زيادة التخزين عند إضافة المزيد من IOPS إلى الخادم. لمزيد من المعلومات حول التخزين وIOOPS المقترنة، راجع خيارات الحوسبة والتخزين.