پیکربندی گزینه‌های هسته لینوکس برای بهینه‌سازی PostgreSQL

پیکربندی گزینه‌های هسته لینوکس برای بهینه‌سازی PostgreSQL عملکرد بهینه PostgreSQL به پارامترهای سیستم عامل به درستی تعریف شده بستگی دارد. پیکربندی ضعیف تنظیمات هسته سیستم عامل می تواند منجر به عملکرد ضعیف سرور پایگاه داده شود. بنابراین، ضروری است که این تنظیمات با توجه به سرور پایگاه داده و حجم کاری آن پیکربندی شوند. در این پست، برخی از پارامترهای مهم هسته لینوکس را که می توانند بر عملکرد سرور پایگاه داده تاثیر بگذارند و نحوه پیکربندی آنها را مورد بحث قرار خواهیم داد.

SHMMAX / SHMALL

SHMMAX یک پارامتر هسته است که برای تعیین حداکثر اندازه یک بخش حافظه مشترک که یک فرآیند لینوکس می تواند اختصاص دهد استفاده می شود. قبل از نسخه 9.2، PostgreSQL از System V (SysV) استفاده می کرد که به تنظیمات SHMMAX نیاز دارد. پس از 9.2، PostgreSQL به حافظه مشترک POSIX تغییر مکان داد. بنابراین اکنون بایت های کمتری از حافظه مشترک System V مورد نیاز است.

قبل از نسخه 9.3، SHMMAX مهمترین پارامتر هسته بود. مقدار SHMMAX بر حسب بایت مشخص می شود.

به طور مشابه ، SHMALL یکی دیگر از پارامترهای هسته است که برای تعیین استفاده می شود
حجم صفحات حافظه مشترک در سراسر سیستم. برای مشاهده مقادیر فعلی SHMMAX، SHMALL یا SHMMIN، از دستور استفاده کنید ipcs.

SHM* جزئیات - لینوکس

$ 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 برای تخصیص حافظه مشترک این پارامتر یکی از مهم ترین پارامترهای هسته است. هر زمان که پیام های خطای زیر را دریافت کردید، به این معنی است که شما یک نسخه قدیمی از 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 در لینوکس و MacOS X کمی متفاوت است:

  • لینوکس: kernel.shmmax، kernel.shmall
  • MacOS X: kern.sysv.shmmax، kern.sysv.shmall

تیم Sysctl می توان برای تغییر موقت مقدار استفاده کرد. برای تنظیم مقادیر ثابت، یک ورودی به آن اضافه کنید /etc/sysctl.conf. جزئیات در زیر آمده است.

تغییر تنظیمات هسته در 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

تغییر پارامترهای هسته در لینوکس

# 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 اضافه کنید

صفحات عظیم

لینوکس به طور پیش فرض از صفحات حافظه 4 کیلوبایتی استفاده می کند، BSD از صفحات حافظه XNUMX کیلوبایتی استفاده می کند. صفحات فوق العادهو در ویندوز - صفحات بزرگ. صفحه قطعه ای از RAM است که به یک فرآیند اختصاص داده شده است. یک فرآیند بسته به نیاز حافظه می تواند چندین صفحه داشته باشد. هر چه یک فرآیند به حافظه بیشتری نیاز داشته باشد، صفحات بیشتری به آن اختصاص داده می شود. سیستم عامل یک جدول تخصیص صفحه برای فرآیندها نگهداری می کند. هر چه اندازه صفحه کوچکتر باشد، جدول بزرگتر باشد، یافتن صفحه در آن جدول صفحه بیشتر طول می کشد. بنابراین صفحات بزرگ اجازه می دهد تا مقادیر زیادی از حافظه با کاهش هزینه های اضافی استفاده شود. تعداد بازدیدهای صفحه کمتر، خطاهای صفحه کمتر، عملیات خواندن/نوشتن سریعتر در بافرهای بزرگتر. نتیجه بهبود عملکرد است.

PostgreSQL فقط از صفحات بزرگ در لینوکس پشتیبانی می کند. لینوکس به طور پیش فرض از صفحات حافظه 4 کیلوبایتی استفاده می کند، بنابراین در مواردی که عملیات حافظه بیش از حد وجود دارد، باید صفحات بزرگتر را تنظیم کنید. هنگام استفاده از صفحات بزرگ 2 مگابایتی و حداکثر 1 گیگابایتی، افزایش عملکرد مشاهده می شود. اندازه صفحه بزرگ را می توان در زمان بوت تنظیم کرد. با استفاده از دستور می توانید به راحتی پارامترهای صفحه بزرگ و استفاده از آنها را در دستگاه لینوکس خود بررسی کنید cat /proc/meminfo | grep -i عظیم.

دریافت اطلاعات در مورد صفحات بزرگ (فقط لینوکس)

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 تنظیم شده است. این به این معنی است که صفحات بزرگ غیرفعال هستند.

اسکریپتی برای تعیین تعداد صفحات بزرگ

این اسکریپت ساده تعداد مورد نیاز صفحات بزرگ را برمی گرداند. زمانی که PostgreSQL در حال اجرا است، اسکریپت را روی سرور لینوکس خود اجرا کنید. مطمئن شوید که برای متغیر محیطی $PGDATA دایرکتوری داده PostgreSQL مشخص شده است.

دریافت تعداد صفحات بزرگ مورد نیاز

#!/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).

صفحات بزرگ بازبینی شده (فقط لینوکس)

$ 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

اکنون پارامتر large_pages را در $PGDATA/postgresql.conf روی "on" تنظیم کنید و سرور را مجددا راه اندازی کنید.

بار دیگر، اطلاعات مربوط به صفحات بزرگ (فقط لینوکس)

$ 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

بیایید ببینیم که آیا اکنون از صفحات بزرگتری نسبت به قبل استفاده می کنیم.

اطلاعات بیشتر در مورد صفحات بزرگ (فقط لینوکس)

$ 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 یکی دیگر از پارامترهای هسته است که می تواند بر عملکرد پایگاه داده تأثیر بگذارد. این گزینه برای کنترل رفتار swappiness (تغییر صفحات داخل و خارج از حافظه) در لینوکس استفاده می شود. این مقدار از 0 تا 100 متغیر است. تعیین می کند که چه مقدار حافظه صفحه یا صفحه بندی شود. صفر به معنای عدم تبادل و 100 به معنای مبادله تهاجمی است.

با تنظیم مقادیر کمتر می توانید عملکرد خوبی داشته باشید.

تنظیم این مقدار روی 0 در هسته های جدیدتر ممکن است باعث شود OOM Killer (فرایند پاکسازی حافظه لینوکس) روند را از بین ببرد. بنابراین اگر می‌خواهید تعویض را به حداقل برسانید، می‌توانید آن را روی ۱ تنظیم کنید. مقدار پیش‌فرض در لینوکس 1 است. مقدار بالاتر باعث می‌شود که MMU (واحد مدیریت حافظه) از فضای مبادله بیشتری نسبت به RAM استفاده کند، در حالی که مقدار کمتر، داده/کد بیشتری را در حافظه نگه می‌دارد.

مقدار کمتر شرط خوبی برای بهبود عملکرد در PostgreSQL است.

vm.overcommit_memory / vm.overcommit_ratio

برنامه ها حافظه را به دست می آورند و زمانی که دیگر به آن نیازی نیست آن را آزاد می کنند. اما در برخی موارد، برنامه حافظه بیش از حد دریافت می کند و آن را آزاد نمی کند. این ممکن است باعث یک قاتل OOM شود. در اینجا مقادیر پارامتر ممکن است vm.overcommit_memory با توضیحات برای هر کدام:

  1. بیش از حد اکتشافی (پیش فرض)؛ اکتشافی مبتنی بر هسته
  2. به هر حال اجازه overcommit را بدهید
  3. زیاده روی نکنید، از نسبت بیش از حد تعهد تجاوز نکنید.

لینک: https://www.kernel.org/doc/Documentation/vm/overcommit-accounting

vm.overcommit_ratio - درصد RAM موجود برای اضافه بار. مقدار 50 درصد در سیستمی با 2 گیگابایت رم می تواند تا 3 گیگابایت رم را اختصاص دهد.

مقدار 2 برای vm.overcommit_memory عملکرد بهتری را برای PostgreSQL فراهم می کند. این مقدار، استفاده از RAM فرآیند سرور را بدون هیچ گونه خطر قابل توجهی برای کشته شدن توسط فرآیند OOM killer به حداکثر می رساند. برنامه قادر به بارگذاری مجدد خواهد بود، اما فقط در محدوده های بیش از حد، که خطر کشتن 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 پیش فرض در اکثر سیستم های لینوکس است. شما می توانید عملکرد را برای عملیات فشرده با یک عامل کوچکتر بهبود بخشید، که به این معنی است که لینوکس صفحات کثیف را در پس زمینه پاک می کند.

شما باید مقدار را تنظیم کنید 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. این تضمین می‌کند که فرآیندهای پس‌زمینه زودتر شروع می‌شوند تا تا حد امکان از مسدود شدن برنامه جلوگیری شود. شما می توانید تفاوت بین این دو نسبت را بسته به بار ورودی/خروجی دیسک تنظیم کنید.

مجموع

می‌توانید تنظیمات دیگر را برای بهبود عملکرد تغییر دهید، اما پیشرفت‌ها حداقل خواهند بود و سود زیادی نخواهید دید. باید به خاطر داشته باشیم که همه گزینه ها برای همه انواع برنامه ها اعمال نمی شوند. وقتی برخی از تنظیمات را انجام می‌دهیم، برخی از برنامه‌ها بهتر کار می‌کنند و برخی نه. شما باید تعادل مناسبی بین پیکربندی این تنظیمات برای حجم کاری مورد انتظار و نوع برنامه خود بیابید، و همچنین باید رفتار سیستم عامل را هنگام تنظیم در نظر بگیرید. پیکربندی پارامترهای هسته به آسانی پیکربندی پارامترهای پایگاه داده نیست، ارائه توصیه‌ها دشوارتر است.

منبع: www.habr.com

اضافه کردن نظر