PostgreSQLni optimallashtirish uchun Linux yadro parametrlarini sozlash

PostgreSQLni optimallashtirish uchun Linux yadro parametrlarini sozlash Optimal PostgreSQL ishlashi to'g'ri belgilangan operatsion tizim parametrlariga bog'liq. Noto'g'ri sozlangan OS yadrosi sozlamalari ma'lumotlar bazasi serverining yomon ishlashiga olib kelishi mumkin. Shuning uchun, ushbu sozlamalar ma'lumotlar bazasi serveri va uning ish yukiga qarab sozlanishi juda muhimdir. Ushbu postda biz ma'lumotlar bazasi serverining ishlashiga ta'sir qilishi mumkin bo'lgan ba'zi muhim Linux yadrosi parametrlarini va ularni qanday sozlashni muhokama qilamiz.

SHMMAX / SHMALL

SHMMAX Linux jarayoni ajrata oladigan yagona umumiy xotira segmentining maksimal hajmini aniqlash uchun ishlatiladigan yadro parametridir. 9.2 versiyasidan oldin PostgreSQL SHMMAX sozlamalarini talab qiladigan System V (SysV) dan foydalangan. 9.2 dan so'ng PostgreSQL POSIX umumiy xotirasiga o'tdi. Shunday qilib, endi tizim V umumiy xotirasining kamroq baytlari talab qilinadi.

9.3 versiyasidan oldin SHMMAX eng muhim yadro parametri edi. SHMMAX qiymati baytlarda ko'rsatilgan.

Xuddi shunday, SHMALL aniqlash uchun foydalaniladigan yana bir yadro parametridir
umumiy xotira sahifalarining tizim bo'ylab hajmi. Joriy SHMMAX, SHMALL yoki SHMMIN qiymatlarini ko'rish uchun buyruqdan foydalaning ipcs.

SHM* Tafsilotlari - 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* Tafsilotlari - 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-dan foydalanadi Tizim V IPC umumiy xotirani ajratish uchun. Ushbu parametr yadroning eng muhim parametrlaridan biridir. Har safar quyidagi xato xabarlarini olganingizda, bu sizda PostgreSQLning eski versiyasi borligini va SHMMAX qiymati juda past ekanligini bildiradi. Foydalanuvchilar foydalanmoqchi bo'lgan umumiy xotiraga qarab qiymatni sozlashi va oshirishi kutilmoqda.

Mumkin noto'g'ri konfiguratsiya xatolari

Agar SHMMAX toʻgʻri sozlanmagan boʻlsa, buyruq yordamida PostgreSQL klasterini ishga tushirishga urinayotganda xatolik yuz berishi mumkin. initdb.

initdb xatosi
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

Xuddi shunday buyruq yordamida PostgreSQL serverini ishga tushirishda xatolik yuz berishi mumkin pg_ctl.

pg_ctl Muvaffaqiyatsizlik
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.

Ta'riflardagi farqlarni tushunish

SHMMAX/SHMALL parametrlarini aniqlash Linux va MacOS X da biroz farq qiladi:

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

komanda sysctl qiymatni vaqtincha o'zgartirish uchun ishlatilishi mumkin. Doimiy qiymatlarni o'rnatish uchun yozuvni qo'shing /etc/sysctl.conf. Tafsilotlar quyida keltirilgan.

MacOS X da yadro sozlamalarini o'zgartirish

# 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

Linuxda yadro parametrlarini o'zgartirish

# 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

Unutmang: O'zgarishlarni doimiy qilish uchun ushbu qiymatlarni /etc/sysctl.conf ga qo'shing

Katta sahifalar

Linux sukut bo'yicha 4 KB xotira sahifalaridan foydalanadi, BSD XNUMX KB xotira sahifalaridan foydalanadi. Super sahifalar, va Windowsda - Katta sahifalar. Sahifa - bu jarayon uchun ajratilgan RAM qismi. Jarayon xotira talablariga qarab bir nechta sahifaga ega bo'lishi mumkin. Jarayon qancha ko'p xotirani talab qilsa, shuncha ko'p sahifalar ajratiladi. OT jarayonlar uchun sahifalarni ajratish jadvalini yuritadi. Sahifaning o'lchami qanchalik kichik bo'lsa, jadval qanchalik katta bo'lsa, ushbu sahifa jadvalidagi sahifani topish uchun qancha vaqt kerak bo'ladi. Shuning uchun katta sahifalar katta hajmdagi xotiradan foydalanishga imkon beradi; kamroq sahifani ko'rish, kamroq sahifa xatolari, kattaroq buferlarda tezroq o'qish/yozish operatsiyalari. Natija yaxshilangan ishlashdir.

PostgreSQL faqat Linuxda katta sahifalarni qo'llab-quvvatlaydi. Odatiy bo'lib, Linux 4 KB xotira sahifalaridan foydalanadi, shuning uchun juda ko'p xotira operatsiyalari mavjud bo'lgan hollarda kattaroq sahifalarni o'rnatish kerak bo'ladi. 2 MB va 1 GB gacha bo'lgan katta sahifalardan foydalanganda unumdorlikning oshishi kuzatiladi. Katta sahifa hajmi yuklash vaqtida o'rnatilishi mumkin. Buyruq yordamida siz katta sahifa parametrlarini va ularning Linux kompyuteringizda ishlatilishini osongina tekshirishingiz mumkin cat /proc/meminfo | grep -i ulkan.

Katta sahifalar haqida ma'lumot olish (faqat Linuxda)

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

Ushbu misolda, katta sahifa hajmi 2048 (2 MB) ga o'rnatilgan bo'lsa-da, katta sahifalarning umumiy soni 0 ga o'rnatilgan. Bu katta sahifalar o'chirilganligini anglatadi.

Katta sahifalar sonini aniqlash uchun skript

Ushbu oddiy skript kerakli miqdordagi katta sahifalarni qaytaradi. PostgreSQL ishlayotgan vaqtda skriptni Linux serveringizda ishga tushiring. Atrof-muhit o'zgaruvchisi uchun ekanligiga ishonch hosil qiling $PGDATA PostgreSQL ma'lumotlar katalogi ko'rsatilgan.

Kerakli katta sahifalar sonini olish

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

Skript chiqishi quyidagicha ko'rinadi:

Skript chiqishi

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

Katta sahifalar uchun tavsiya etilgan qiymat 88 dir, shuning uchun uni 88 ga o'rnatishingiz kerak.

Katta sahifalarni o'rnatish

sysctl -w vm.nr_hugepages=88

Katta sahifalarni hozir tekshiring, siz katta sahifalar ishlatilmayotganini ko'rasiz (HugePages_Free = HugePages_Total).

Katta sahifalar qayta koʻrib chiqildi (faqat Linuxda)

$ 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

Endi $PGDATA/postgresql.conf faylida katta_pages parametrini "on" ga o'rnating va serverni qayta ishga tushiring.

Yana bir bor, katta sahifalar haqida ma'lumot (faqat 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

Endi siz juda oz sonli katta sahifalardan foydalanilayotganini ko'rishingiz mumkin. Keling, ma'lumotlar bazasiga ba'zi ma'lumotlarni qo'shishga harakat qilaylik.

Katta sahifalarni qayta ishlash uchun ba'zi ma'lumotlar bazasi operatsiyalari

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

Keling, hozir biz avvalgidan ko'ra kattaroq sahifalardan foydalanyapmizmi yoki yo'qligini bilib olaylik.

Katta sahifalar haqida qo'shimcha ma'lumot (faqat Linuxda)

$ 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

Endi siz katta sahifalarning aksariyati ishlatilayotganini ko'rishingiz mumkin.

Eslatma: Bu yerda ishlatiladigan HugePages uchun taxminiy qiymat juda past, bu mahsulot muhitida ishlaydigan mashina uchun oddiy qiymat emas. Iltimos, tizimingiz uchun kerakli sahifalar sonini hisoblang va ularni yuk va resurslarga qarab mos ravishda o'rnating.

vm.swappiness

vm.swappiness ma'lumotlar bazasi ishlashiga ta'sir qilishi mumkin bo'lgan yana bir yadro parametridir. Ushbu parametr Linuxda almashtirish (sahifalarni xotirada va undan tashqarida almashtirish) xatti-harakatlarini boshqarish uchun ishlatiladi. Qiymat 0 dan 100 gacha. Bu qancha xotirani sahifalash yoki sahifadan chiqarishni aniqlaydi. Nol almashinuvning yo'qligini va 100 agressiv almashinuvni anglatadi.

Pastroq qiymatlarni o'rnatish orqali yaxshi ishlashga erishishingiz mumkin.

Buni yangi yadrolarda 0 ga o'rnatish OOM Killer (Linux xotirasini tozalash jarayoni) jarayonni o'chirishiga olib kelishi mumkin. Shuning uchun almashtirishni minimallashtirishni istasangiz, uni 1 ga o'rnatish xavfsiz. Linuxda standart qiymat 60 dir. Yuqori qiymat MMU (xotirani boshqarish bloki) operativ xotiradan koʻra koʻproq almashtirish joyidan foydalanishiga olib keladi, pastroq qiymat esa xotirada koʻproq maʼlumot/kodni saqlaydi.

Pastroq qiymat PostgreSQL-da ish faoliyatini yaxshilash uchun yaxshi garov hisoblanadi.

vm.overcommit_memory / vm.overcommit_ratio

Ilovalar xotirani oladi va kerak bo'lmaganda uni chiqaradi. Ammo ba'zi hollarda dastur juda ko'p xotira oladi va uni bo'shatmaydi. Bu OOM qotiliga olib kelishi mumkin. Bu erda mumkin bo'lgan parametr qiymatlari vm.overcommit_memory har biri uchun tavsif bilan:

  1. Evristik overcommit (standart); yadroga asoslangan evristik
  2. Baribir haddan tashqari majburiyatga ruxsat bering
  3. Buni haddan tashqari oshirmang, haddan tashqari majburiyat nisbatini oshirmang.

Malumot: https://www.kernel.org/doc/Documentation/vm/overcommit-accounting

vm.overcommit_ratio — haddan tashqari yuklanish uchun mavjud operativ xotira foizi. 50 GB operativ xotiraga ega tizimda 2% qiymati 3 GB gacha RAMni ajratishi mumkin.

vm.overcommit_memory uchun 2 qiymati PostgreSQL uchun yaxshiroq ishlashni ta'minlaydi. Ushbu qiymat server jarayonining RAMdan foydalanishini OOM qotil jarayoni tomonidan o'ldirish xavfisiz maksimal darajada oshiradi. Ilova qayta yuklanishi mumkin, lekin faqat haddan tashqari yuklash chegarasida, bu OOM qotilining jarayonni o'ldirish xavfini kamaytiradi. Shuning uchun, 2 qiymati standart qiymati 0 dan ko'ra yaxshiroq ishlashni ta'minlaydi. Biroq, diapazondan tashqari xotirani ortiqcha yuklamaslikni ta'minlash orqali ishonchlilikni oshirish mumkin. Bu jarayonning OOM qotili tomonidan o'ldirilishi xavfini yo'q qiladi.

Almashtirilmagan tizimlarda vm.overcommit_memory bilan 2 ga teng muammo yuzaga kelishi mumkin.

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 - diskka yozilishi kerak bo'lgan iflos sahifalar bilan to'ldirilgan xotira foizi. Diskga o'chirish fonda sodir bo'ladi. Ushbu parametrning qiymati 0 dan 100 gacha; ammo, 5 dan past qiymat samarasiz bo'lishi mumkin va ba'zi yadrolar uni qo'llab-quvvatlamaydi. Ko'pgina Linux tizimlarida 10 standart hisoblanadi. Yozishni ko'p talab qiladigan operatsiyalar unumdorligini kichikroq omilga oshirishingiz mumkin, bu Linux fonda iflos sahifalarni tozalashini anglatadi.

Siz qiymatni belgilashingiz kerak vm.dirty_background_bytes haydovchi tezligiga bog'liq.

Ushbu ikki parametr uchun "yaxshi" qiymatlar yo'q, chunki ikkalasi ham apparatga bog'liq. Biroq, vm.dirty_background_ratio ni 5 ga va vm.dirty_background_bytes ni disk tezligining 25% ga o'rnatish ko'p hollarda ish faoliyatini ~25% gacha yaxshilaydi.

vm.dirty_ratio/dirty_bytes

Xuddi shunday vm.dirty_background_ratio/dirty_background_bytes, bundan mustasno, qayta o'rnatish ishchi seansda amalga oshiriladi, dasturni bloklaydi. Shuning uchun vm.dirty_ratio dan yuqori bo'lishi kerak vm.dirty_background_ratio. Bu dasturni iloji boricha blokirovka qilmaslik uchun fon jarayonlari erta boshlanishini ta'minlaydi. Ushbu ikki nisbat o'rtasidagi farqni diskdagi kirish/chiqarish yukiga qarab sozlashingiz mumkin.

Xulosa

Ishlashni yaxshilash uchun siz boshqa sozlamalarni o'zgartirishingiz mumkin, ammo yaxshilanishlar minimal bo'ladi va siz unchalik ko'p foyda ko'rmaysiz. Shuni yodda tutishimiz kerakki, barcha variantlar barcha turdagi ilovalarga tegishli emas. Ba'zi ilovalar ba'zi sozlamalarni o'rnatganimizda yaxshiroq ishlaydi, ba'zilari esa yo'q. Siz kutilayotgan ish yuki va dastur turi uchun ushbu sozlamalarni sozlash oʻrtasida toʻgʻri muvozanatni topishingiz kerak, shuningdek sozlashda OS harakatini ham hisobga olishingiz kerak. Yadro parametrlarini sozlash ma'lumotlar bazasi parametrlarini sozlash kabi oson emas, tavsiyalar berish qiyinroq.

Manba: www.habr.com

a Izoh qo'shish