PostgreSQL-ийг оновчтой болгохын тулд Линуксийн цөмийн сонголтуудыг тохируулж байна

PostgreSQL-ийг оновчтой болгохын тулд Линуксийн цөмийн сонголтуудыг тохируулж байна PostgreSQL-ийн оновчтой гүйцэтгэл нь үйлдлийн системийн зөв тодорхойлсон параметрүүдээс хамаарна. Муу тохируулагдсан үйлдлийн системийн цөмийн тохиргоо нь өгөгдлийн сангийн серверийн гүйцэтгэлд муугаар нөлөөлдөг. Тиймээс эдгээр тохиргоог өгөгдлийн сангийн сервер болон түүний ажлын ачаалалд тохируулан тохируулах нь зайлшгүй чухал юм. Энэ нийтлэлд бид өгөгдлийн сангийн серверийн гүйцэтгэлд нөлөөлж болох Linux цөмийн чухал параметрүүд болон тэдгээрийг хэрхэн тохируулах талаар ярилцах болно.

SHMMAX / SHMALL

SHMMAX нь Линукс процессын хуваарилж болох нэг хуваалцсан санах ойн сегментийн хамгийн их хэмжээг тодорхойлоход ашигладаг цөмийн параметр юм. 9.2 хувилбараас өмнө PostgreSQL нь SHMMAX тохиргоог шаарддаг System V (SysV) ашигладаг байсан. 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 параметрүүдийг тодорхойлох нь Linux болон MacOS X дээр арай өөр байна:

  • Линукс: kernel.shmmax, kernel.shmal
  • MacOS X: kern.sysv.shmmax, kern.sysv.shmal

баг 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 КБ санах ойн хуудсыг ашигладаг. Супер хуудас, мөн Windows дээр - Том хуудаснууд. Хуудас нь процесст хуваарилагдсан RAM-ийн хэсэг юм. Процесс нь санах ойн шаардлагаас хамааран олон хуудастай байж болно. Процесс илүү их санах ой шаардагдах тусам илүү олон хуудас хуваарилагдана. Үйлдлийн систем нь процессуудын хуудасны хуваарилалтын хүснэгтийг хөтөлдөг. Хуудасны хэмжээ бага байх тусам хүснэгт томрох тусам тухайн хуудасны хүснэгтээс хуудсыг олоход удаан хугацаа шаардагдана. Тиймээс том хуудсууд нь их хэмжээний санах ойг ачаалал багатай ашиглах боломжийг олгодог; цөөн хуудас үзсэн, хуудасны алдаа бага, том буфер дээр илүү хурдан унших/бичих үйлдлүүд. Үр дүн нь гүйцэтгэл сайжирсан.

PostgreSQL нь зөвхөн Линукс дээрх том хуудсыг дэмждэг. Анхдагчаар Линукс нь 4 KB санах ойн хуудсыг ашигладаг тул санах ойн үйл ажиллагаа хэт их байгаа тохиолдолд илүү том хуудас тохируулах шаардлагатай байдаг. 2 МБ ба 1 ГБ хүртэлх том хуудсыг ашиглах үед гүйцэтгэлийн өсөлт ажиглагдаж байна. Ачаалах үед том хуудасны хэмжээг тохируулж болно. Та тушаалыг ашиглан том хуудасны параметрүүд болон тэдгээрийн хэрэглээг Линукс машин дээрээ хялбархан шалгаж болно муур /proc/meminfo | grep - би асар том.

Том хуудсуудын талаар мэдээлэл авах (зөвхөн Линукс)

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

Одоо $PGDATA/postgresql.conf-д large_pages параметрийг "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 нь мэдээллийн баазын гүйцэтгэлд нөлөөлж болох өөр нэг цөмийн параметр юм. Энэ сонголт нь Линукс дээр солигдох (санах ой доторх болон санах ойн хуудсыг солих) үйлдлийг хянахад ашиглагддаг. Утга нь 0-ээс 100-ийн хооронд хэлбэлздэг. Энэ нь хэр хэмжээний санах ойг хуудас эсвэл хуудаснаас гаргахыг тодорхойлдог. Тэг нь солилцоо байхгүй, 100 нь түрэмгий солилцоо гэсэн үг.

Та бага утгыг тохируулснаар сайн гүйцэтгэлтэй болно.

Үүнийг шинэ цөм дээр 0 болгож тохируулах нь OOM Killer (Linux-ийн санах ойг цэвэрлэх процесс) процессыг устгахад хүргэж болзошгүй. Тиймээс хэрэв та солихыг багасгахыг хүсвэл 1 болгож тохируулах нь аюулгүй юм. Линукс дээрх өгөгдмөл утга нь 60. Илүү өндөр утга нь MMU (санах ойн удирдлагын нэгж) нь RAM-аас илүү их солилцооны зай ашиглахад хүргэдэг бол бага утга нь санах ойд илүү их өгөгдөл/код хадгалдаг.

Бага үнэ нь PostgreSQL-ийн гүйцэтгэлийг сайжруулах сайн бооцоо юм.

vm.overcommit_memory / vm.overcommit_ratio

Аппликейшн нь санах ойг олж авч, шаардлагагүй болсон үед сулладаг. Гэхдээ зарим тохиолдолд програм хэт их санах ой авч, түүнийгээ гаргадаггүй. Энэ нь OOM алуурчин үүсгэж болзошгүй. Боломжит параметрийн утгууд энд байна vm.recommit_memory тус бүрийн тайлбартай:

  1. Heuristic overcommit (анхдагч); цөмд суурилсан эвристик
  2. Ямар ч байсан хэтрүүлэхийг зөвшөөр
  3. Үүнийг бүү хэтрүүл, хэтрүүлсэн харьцааг бүү хэтрүүл.

Эх сурвалж: https://www.kernel.org/doc/Documentation/vm/overcommit-accounting

vm.overcommit_ratio — Хэт ачаалалд ашиглах боломжтой RAM-ийн хувь. 50 ГБ RAM-тай системд 2%-ийн утга нь 3 ГБ хүртэлх RAM-г хуваарилах боломжтой.

vm.overcommit_memory-ийн 2 утга нь PostgreSQL-д илүү сайн гүйцэтгэлийг хангадаг. Энэ утга нь OOM алуурчин процесст өртөх эрсдэлгүйгээр серверийн процессын RAM ашиглалтыг дээд зэргээр нэмэгдүүлдэг. Аппликейшн дахин ачаалах боломжтой, гэхдээ зөвхөн хэтрүүлсэн хязгаарт багтах бөгөөд энэ нь OOM алуурчин үйл явцыг хөнөөх эрсдэлийг бууруулдаг. Тиймээс 2-ын утга нь анхдагч утга 0-ээс илүү сайн гүйцэтгэлийг өгдөг. Гэсэн хэдий ч хүрээнээс гадуурх санах ойг хэт ачаалахгүй байх замаар найдвартай байдлыг сайжруулж болно. Энэ нь үйл явцын OOM алуурчинд өртөх эрсдэлийг арилгадаг.

Солилцоогүй систем дээр vm.overcommit_memory-д 2-той тэнцэх асуудал гарч болзошгүй.

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

vm.бохир_арын_харьцаа / vm.бохир_арын_байт

vm.бохир_арын_харьцаа нь дискэнд бичих шаардлагатай бохир хуудсаар дүүрсэн санах ойн эзлэх хувь юм. Диск рүү угаах нь цаана нь тохиолддог. Энэ параметрийн утга нь 0-ээс 100 хооронд хэлбэлздэг; гэхдээ 5-аас доош утга нь үр дүнгүй байж болох бөгөөд зарим цөм үүнийг дэмждэггүй. 10 нь ихэнх Линукс системүүдийн анхдагч юм. Та бичихэд эрчимтэй үйлдлүүдийн гүйцэтгэлийг бага хүчин зүйлээр сайжруулах боломжтой бөгөөд энэ нь Линукс нь бохир хуудсыг арын дэвсгэр дээр цэвэрлэх болно гэсэн үг юм.

Та утгыг тохируулах хэрэгтэй vm.бохир_арын_байт таны жолооны хурдаас хамаарна.

Эдгээр хоёр параметрийн хувьд "сайн" утга байхгүй, учир нь хоёулаа техник хангамжаас хамаардаг. Гэсэн хэдий ч, 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.бохир_арын_харьцаа. Энэ нь програмыг аль болох хаахаас зайлсхийхийн тулд суурь процессууд эрт эхлэх боломжийг олгодог. Та дискний оролт гаралтын ачааллаас хамааран эдгээр хоёр харьцааны зөрүүг тохируулж болно.

Үр дүн

Та гүйцэтгэлийг сайжруулахын тулд бусад тохиргоог өөрчилж болно, гэхдээ сайжруулалт нь хамгийн бага байх бөгөөд та тийм ч их ашиг тусыг харахгүй. Бүх сонголтууд бүх төрлийн програмуудад хамаарахгүй гэдгийг бид санах ёстой. Бид зарим тохиргоог тохируулахад зарим апп илүү сайн ажилладаг бол зарим нь тэгдэггүй. Та хүлээгдэж буй ажлын ачаалал болон програмын төрлөөр эдгээр тохиргоог тохируулахын хооронд зөв тэнцвэрийг олох ёстой бөгөөд тааруулахдаа үйлдлийн системийн үйл ажиллагааг анхаарч үзэх хэрэгтэй. Цөмийн параметрүүдийг тохируулах нь өгөгдлийн сангийн параметрүүдийг тохируулахтай адил хялбар биш бөгөөд зөвлөмж гаргахад илүү хэцүү байдаг.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх