ضبط معلمات kernel Linux لتحسين PostgreSQL

يعتمد الأداء الأمثل لـ PostgreSQL على معلمات نظام التشغيل المعرفة بشكل صحيح. يمكن أن تؤدي معلمات kernel OS المضبوطة بشكل سيئ إلى انخفاض أداء خادم قاعدة البيانات. لذلك ، من الضروري تكوين هذه المعلمات وفقًا لخادم قاعدة البيانات وعبء العمل الخاص به. في هذا المنشور ، سنناقش بعض معلمات Linux kernel المهمة التي يمكن أن تؤثر على أداء خادم قاعدة البيانات وكيفية ضبطها.

SHMMAX / SHMALL


SHMMAX هي معلمة kernel تُستخدم لتحديد الحد الأقصى لحجم شريحة ذاكرة مشتركة واحدة يمكن لعملية Linux تخصيصها. قبل الإصدار 9.2 ، استخدم PostgreSQL نظام V (SysV) ، والذي يتطلب تكوين SHMMAX. بعد 9.2 ، تحولت بوستجرس إلى POSIX الذاكرة المشتركة. حتى الآن أقل بايت من الذاكرة المشتركة للنظام V مطلوبة.

قبل الإصدار 9.3 ، كان SHMMAX أهم معلمة kernel. يتم تحديد قيمة SHMMAX بالبايت.

وبالمثل ، SHMALL هي معلمة kernel أخرى تُستخدم لتحديدها
صفحات الذاكرة المشتركة على مستوى النظام. استخدم الأمر ipcs لعرض قيم SHMMAX أو SHMALL أو SHMMIN الحالية.

SHM * التفاصيل - Linux

$ ipcs -lm ------ Shared Memory Limits -------- max number of segments = 4096 max seg size (kbytes) = 1073741824 max total shared memory (kbytes) = 17179869184 min seg size (bytes) = 1 

SHM * تفاصيل - MacOS X

 $ ipcs -M IPC status from as of Thu Aug 16 22:20:35 PKT 2018 shminfo: shmmax: 16777216 (max shared memory segment size) shmmin: 1 (min shared memory segment size) shmmni: 32 (max number of shared memory identifiers) shmseg: 8 (max shared memory segments per process) shmall: 1024 (max amount of shared memory in pages) 

يستخدم PostgreSQL نظام V IPC لتخصيص الذاكرة المشتركة. هذه المعلمة هي واحدة من أهم معلمات kernel. كلما تلقيت رسائل الخطأ التالية ، فهذا يعني أن لديك إصدارًا أقدم من PostgreSQL وأن لديك قيمة SHMMAX منخفضة جدًا. من المتوقع أن يقوم المستخدمون بضبط وزيادة القيمة وفقًا للذاكرة المشتركة التي سيستخدمونها.

أخطاء التكوين المحتملة


إذا لم يتم تكوين SHMMAX بشكل صحيح ، فقد تتلقى خطأ عند محاولة تهيئة كتلة PostgreSQL باستخدام أمر initdb .

فشل initdb
DETAIL: Failed system call was shmget(key=1, size=2072576, 03600).

HINT: This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter.
You can either reduce the request size or reconfigure the kernel with larger SHMMAX. To reduce the request size (currently 2072576 bytes),
reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections.

If the request size is already small, it's possible that it is less than your kernel's SHMMIN parameter,
in which case raising the request size or reconfiguring SHMMIN is called for.

The PostgreSQL documentation contains more information about shared memory configuration. child process exited with exit code 1


وبالمثل ، قد تتلقى خطأ عند بدء تشغيل خادم PostgreSQL باستخدام الأمر pg_ctl .

فشل pg_ctl
DETAIL: Failed system call was shmget(key=5432001, size=14385152, 03600).

HINT: This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter.

You can either reduce the request size or reconfigure the kernel with larger SHMMAX.; To reduce the request size (currently 14385152 bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections.

If the request size is already small, it's possible that it is less than your kernel's SHMMIN parameter,
in which case raising the request size or reconfiguring SHMMIN is called for.

The PostgreSQL documentation contains more information about shared memory configuration.


فهم الاختلافات في التعاريف


يختلف تعريف معلمات SHMMAX / SHMALL قليلاً في نظامي Linux و MacOS X:

  • Linux: kernel.shmmax، kernel.shmall
  • MacOS X: kern.sysv.shmmax، kern.sysv.shmall

يمكن استخدام الأمر sysctl لتغيير القيمة مؤقتًا. لتعيين قيم ثابتة ، أضف إدخالًا في /etc/sysctl.conf . وترد التفاصيل أدناه.

تغيير إعدادات kernel على MacOS X

 # Get the value of SHMMAX sudo sysctl kern.sysv.shmmax kern.sysv.shmmax: 4096 # Get the value of SHMALL sudo sysctl kern.sysv.shmall kern.sysv.shmall: 4096 # Set the value of SHMMAX sudo sysctl -w kern.sysv.shmmax=16777216 kern.sysv.shmmax: 4096 -> 16777216 # Set the value of SHMALL sudo sysctl -w kern.sysv.shmall=16777216 kern.sysv.shmall: 4096 -> 16777216 

تغيير معلمات Linux kernel

 # Get the value of SHMMAX sudo sysctl kernel.shmmax kernel.shmmax: 4096 # Get the value of SHMALL sudo sysctl kernel.shmall kernel.shmall: 4096 # Set the value of SHMMAX sudo sysctl -w kernel.shmmax=16777216 kernel.shmmax: 4096 -> 16777216 # Set the value of SHMALL sudo sysctl -w kernel.shmall=16777216 kernel.shmall: 4096 -> 16777216 

تذكر : لجعل التغييرات دائمة ، أضف هذه القيم إلى /etc/sysctl.conf

صفحات كبيرة (صفحات ضخمة)


يتم استخدام Linux افتراضيًا صفحات 4K ، ويستخدم BSD الصفحات الفائقة ، ويستخدم Windows الصفحات الكبيرة . الصفحة هي جزء من ذاكرة الوصول العشوائي المخصصة لعملية. يمكن أن تحتوي العملية على عدة صفحات ، حسب متطلبات الذاكرة. كلما زادت الذاكرة التي تحتاجها العملية ، زاد عدد الصفحات المخصصة لها. يدعم نظام التشغيل جدول تخصيص صفحات للعمليات. كلما كان حجم الصفحة أصغر ، كلما كان الجدول أكبر ، كلما طال الوقت للعثور على صفحة في جدول الصفحة هذا. لذلك ، تسمح لك الصفحات الكبيرة باستخدام مقدار كبير من الذاكرة مع انخفاض الحمل ؛ عدد مرات عرض الصفحة ، عدد أقل من أخطاء الصفحة ، عمليات قراءة / كتابة أسرع عبر المخازن المؤقتة الكبيرة. والنتيجة هي تحسين الأداء.

PostgreSQL يدعم الصفحات الكبيرة فقط على نظام Linux. افتراضيًا ، يستخدم Linux صفحات ذاكرة 4 كيلوبايت ، لذلك إذا كان لديك الكثير من عمليات الذاكرة ، فيجب عليك تثبيت صفحات أكبر. هناك زيادة في الأداء عند استخدام الصفحات الكبيرة بسعة 2 ميجابايت وحتى 1 جيجا بايت. يمكن ضبط حجم الصفحة الكبير في وقت التمهيد. يمكنك بسهولة التحقق من معلمات الصفحة الكبيرة واستخدامها على كمبيوتر Linux الخاص بك باستخدام الأمر cat / proc / meminfo | grep - أنا ضخمة .

الحصول على معلومات حول الصفحات الكبيرة (Linux فقط)

 Note: This is only for Linux, for other OS this operation is ignored$ cat /proc/meminfo | grep -i huge AnonHugePages:        0 kB ShmemHugePages:       0 kB HugePages_Total:      0 HugePages_Free:       0 HugePages_Rsvd:       0 HugePages_Surp:       0 Hugepagesize:      2048 kB 

في هذا المثال ، على الرغم من ضبط حجم الصفحة الكبيرة على 2048 (2 ميغابايت) ، فإن إجمالي عدد الصفحات الكبيرة هو 0. وهذا يعني أن الصفحات الكبيرة معطلة.

البرنامج النصي لتحديد عدد الصفحات الكبيرة


يعرض هذا البرنامج النصي البسيط العدد المطلوب من الصفحات الكبيرة. قم بتشغيل البرنامج النصي على خادم Linux أثناء تشغيل PostgreSQL. تحقق من تعيين دليل بيانات PostgreSQL لمتغير بيئة $ PGDATA .

الحصول على عدد الصفحات الكبيرة المطلوبة

 #!/bin/bash pid=`head -1 $PGDATA/postmaster.pid` echo "Pid:           $pid" peak=`grep ^VmPeak /proc/$pid/status | awk '{ print $2 }'` echo "VmPeak:          $peak kB" hps=`grep ^Hugepagesize /proc/meminfo | awk '{ print $2 }'` echo "Hugepagesize:  $hps kB" hp=$((peak/hps)) echo Set Huge Pages:    $hp 

إخراج البرنامج النصي كما يلي:

إخراج البرنامج النصي

 Pid:           12737 VmPeak:        180932 kB Hugepagesize:  2048 kB Set Huge Pages: 88 

القيمة الموصى بها للصفحات الكبيرة هي 88 ، لذلك يجب تعيينها على 88.

تثبيت الصفحات الكبيرة

 sysctl -w vm.nr_hugepages=88 

تحقق من الصفحات الكبيرة الآن ، سترى أنه لا يتم استخدام الصفحات الكبيرة (HugePages_Free = HugePages_Total).

معلومات حول الصفحات الكبيرة مرة أخرى (Linux فقط)

 $ cat /proc/meminfo | grep -i huge AnonHugePages:        0 kB ShmemHugePages:       0 kB HugePages_Total:     88 HugePages_Free:      88 HugePages_Rsvd:       0 HugePages_Surp:       0 Hugepagesize:      2048 kB 

الآن قم بتعيين huge_pages "on" على $ PGDATA / postgresql.conf وأعد تشغيل الخادم.

ومرة أخرى ، معلومات حول الصفحات الكبيرة (Linux فقط)

 $ cat /proc/meminfo | grep -i huge AnonHugePages:        0 kB ShmemHugePages:       0 kB HugePages_Total:     88 HugePages_Free:      81 HugePages_Rsvd:       64 HugePages_Surp:       0 Hugepagesize:      2048 kB 

الآن يمكنك أن ترى أنه يتم استخدام عدد قليل جدًا من الصفحات الكبيرة. دعنا الآن نحاول إضافة بعض البيانات إلى قاعدة البيانات.

بعض عمليات قاعدة البيانات لإعادة تدوير الصفحات الكبيرة

 postgres=# CREATE TABLE foo(a INTEGER); CREATE TABLE postgres=# INSERT INTO foo VALUES(generate_Series(1,10000000)); INSERT 0 10000000 

دعونا نرى ما إذا كنا نستخدم المزيد من الصفحات الكبيرة الآن من قبل.

مرة أخرى المعلومات على الصفحات الكبيرة (Linux فقط)

 $ cat /proc/meminfo | grep -i huge AnonHugePages:        0 kB ShmemHugePages:       0 kB HugePages_Total:     88 HugePages_Free:      18 HugePages_Rsvd:       1 HugePages_Surp:       0 Hugepagesize:      2048 kB 

الآن يمكنك أن ترى أن معظم الصفحات الكبيرة قيد الاستخدام.

ملاحظة: القيمة التقريبية لـ HugePages المستخدمة هنا منخفضة جدًا ، وهي ليست قيمة طبيعية للجهاز في بيئة الغذاء. يرجى تقييم العدد المطلوب من الصفحات لنظامك وتعيينها وفقًا للحمل والموارد.

vm.swappiness


vm.swappiness هي معلمة kernel أخرى يمكن أن تؤثر على أداء قاعدة البيانات. تُستخدم هذه المعلمة للتحكم في سلوك التبادلية (تبديل الصفحات من وإلى الذاكرة) على Linux. تتراوح القيمة من 0 إلى 100. وهي تحدد مقدار الذاكرة التي سيتم إلغاء تحميلها أو إلغاء تحميلها. الصفر يعني تعطيل التبادل ، و 100 تعني التبادل العدواني.

يمكنك الحصول على أداء جيد من خلال تحديد قيم أقل.

قد يؤدي تعيين القيمة إلى 0 في أحدث النوى إلى OOM Killer (عملية تنظيف ذاكرة Linux) لقتل العملية. وبالتالي ، يمكنك ضبط القيمة بأمان على 1 إذا كنت تريد تقليل التبادل. القيمة الافتراضية على Linux هي 60. القيمة الأعلى تجعل MMU (وحدة إدارة الذاكرة) تستخدم مساحة ترحيل صفحات أكبر من ذاكرة الوصول العشوائي ، في حين أن القيمة الأقل توفر المزيد من البيانات / التعليمات البرمجية في الذاكرة.

القيمة الأقل هي رهان جيد على تحسين الأداء في PostgreSQL.

vm.overcommit_memory / vm.overcommit_ratio


تلقي التطبيقات الذاكرة وتحريرها عندما لم تعد هناك حاجة إليها. لكن في بعض الحالات ، يحصل التطبيق على الكثير من الذاكرة ولا يحرره. هذا يمكن أن يسبب قاتل OOM. فيما يلي القيم المحتملة للمعلمة vm.overcommit_memory مع وصف لكل منها:

  1. إرهاق الإرهاق (الافتراضي) ؛ مرتكز على أساس النواة
  2. السماح بالإفراط على أي حال
  3. لا تبالغي ، لا تتجاوز نسبة الإرهاق.

الرابط: https://www.kernel.org/doc/Documentation/vm/overcommit-accounting

vm.overcommit_ratio - نسبة ذاكرة الوصول العشوائي المتاحة للحمولة الزائدة. يمكن لقيمة 50٪ في نظام به ذاكرة وصول عشوائي سعتها 2 جيجابايت تخصيص ما يصل إلى 3 جيجابايت من ذاكرة الوصول العشوائي.

توفر قيمة 2 لـ vm.overcommit_memory أداء أفضل لـ PostgreSQL. تزيد هذه القيمة من استخدام ذاكرة الوصول العشوائي (RAM) من خلال عملية الخادم دون أي خطر كبير من التعرض للقتل من خلال عملية القاتل OOM. سيتمكن التطبيق من إعادة التشغيل ، ولكن فقط في حدود الإنفاق الزائد ، مما يقلل من خطر قيام قاتل OOM بقتل العملية. لذلك ، فإن القيمة 2 تعطي أداء أفضل من القيمة الافتراضية وهي 0. ومع ذلك ، يمكن تحسين الموثوقية من خلال ضمان عدم زيادة تحميل الذاكرة خارج النطاق المقبول. هذا يلغي خطر قتل العملية على يد قاتل OOM.

على أنظمة غير الترحيل ، قد تحدث مشكلة مع vm.overcommit_memory تساوي 2.

https://www.postgresql.org/docs/current/static/kernel-resources.html#LINUX-MEMORY-OVERCOMMIT

vm.dirty_background_ratio / vm.dirty_background_bytes


vm.dirty_background_ratio هي النسبة المئوية للذاكرة المملوءة بصفحات متسخة تحتاج إلى كتابتها إلى القرص. إعادة تعيين إلى القرص في الخلفية. تتراوح قيمة هذه المعلمة من 0 إلى 100 ؛ ومع ذلك ، قد تكون القيمة أقل من 5 غير فعالة ، وبعض الحبات لا تدعمها. 10 هي القيمة الافتراضية في معظم أنظمة Linux. يمكنك تحسين الأداء لعمليات التسجيل المكثفة بمعدل أقل ، مما يعني أن Linux سيقوم بإلقاء صفحات متسخة في الخلفية.

تحتاج إلى تعيين قيمة vm.dirty_background_bytes وفقًا لسرعة القرص.

لا توجد قيم "جيدة" لهاتين المعلمتين ، حيث أن كلاهما يعتمدان على الأجهزة. ومع ذلك ، يؤدي تعيين vm.dirty_background_ratio إلى 5 و vm.dirty_background_bytes بمعدل 25٪ من سرعة القرص إلى زيادة الأداء إلى 25٪ تقريبًا في معظم الحالات.

vm.dirty_ratio / dirty_bytes


هذا هو نفس vm.dirty_background_ratio / dirty_background_bytes ، باستثناء أنه يتم تنفيذ إعادة التعيين في جلسة عمل ، مع حظر التطبيق. لذلك ، يجب أن يكون vm.dirty_ratio أعلى من vm.dirty_background_ratio . هذا يضمن أن عمليات الخلفية ستبدأ في وقت مبكر من أجل تجنب حظر التطبيق قدر الإمكان. يمكنك ضبط الفرق بين هاتين النسبتين اعتمادًا على القرص I / O الحمل.

يؤدي


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

Source: https://habr.com/ru/post/ar458860/


All Articles