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

د PostgreSQL غوره کولو لپاره د لینکس کرنل اختیارونه تنظیم کول د غوره PostgreSQL فعالیت په سمه توګه تعریف شوي عملیاتي سیسټم پیرامیټونو پورې اړه لري. په ضعیف ډول تنظیم شوي د OS کرنل ترتیبات کولی شي د ډیټابیس سرور ضعیف فعالیت پایله ولري. نو ځکه، دا اړینه ده چې دا ترتیبات د ډیټابیس سرور او د هغې د کاري بار سره سم تنظیم شي. پدې پوسټ کې ، موږ به د ځینې مهم لینکس کرنل پیرامیټونو په اړه بحث وکړو چې کولی شي د ډیټابیس سرور فعالیت اغیزه وکړي او څنګه یې تنظیم کړي.

SHMMAX / SHMALL

SHMMAX د کرنل پیرامیټر دی چې د یوې ګډې حافظې برخې اعظمي اندازې ټاکلو لپاره کارول کیږي چې د لینکس پروسې تخصیص کولی شي. د 9.2 نسخه دمخه، PostgreSQL سیسټم V (SysV) کارولی، کوم چې د SHMMAX ترتیب ته اړتیا لري. د 9.2 وروسته، PostgreSQL د POSIX شریک یادداشت ته لاړ. نو اوس د سیسټم 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

ټیم سیسټټ د لنډمهاله ارزښت بدلولو لپاره کارول کیدی شي. د ثابت ارزښتونو د ټاکلو لپاره، داخله اضافه کړئ /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 KB حافظې پاڼې په ډیفالټ کاروي، BSD د XNUMX KB حافظې پاڼې کاروي. سوپر پا .ې، او په وینډوز کې - لوی پاڼې. یوه پاڼه د RAM یوه ټوټه ده چې یوې پروسې ته ځانګړې شوې. یوه پروسه د حافظې اړتیاو پورې اړه لري څو پاڼې ولري. څومره چې یوه پروسه ډیره حافظه ته اړتیا لري، هغومره ډیرې پاڼې تخصیص کیږي. OS د پروسو لپاره د مخ تخصیص جدول ساتي. هر څومره چې د پاڼې اندازه کوچنۍ وي، هومره جدول لوی وي، هومره به د دې پاڼې په جدول کې د یوې پاڼې موندل ډېر وخت نیسي. له همدې امله لویې پاڼې د حافظې لوی مقدار ته اجازه ورکوي چې د سر په کموالي سره وکارول شي. د پاڼې لږ لید، د پاڼې لږې نیمګړتیاوې، په لویو بفرونو کې د چټک لوستلو/لیکلو عملیات. پایله یې ښه فعالیت دی.

PostgreSQL یوازې په لینکس کې د لویو پاڼو ملاتړ کوي. په ډیفالټ، لینکس د 4 KB حافظې پاڼې کاروي، نو په هغه حالتونو کې چې د حافظې ډیری عملیات شتون لري، دا اړینه ده چې لوی پاڼې تنظیم کړئ. د فعالیت لاسته راوړنې لیدل کیږي کله چې د 2 MB لوی پاڼې او تر 1 GB پورې کاروئ. د لوی پاڼې اندازه د بوټ په وخت کې ټاکل کیدی شي. تاسو کولی شئ د کمانډ په کارولو سره ستاسو په لینکس ماشین کې د لوی پا pagesې پیرامیټونه او د دوی کارول په اسانۍ سره چیک کړئ 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 MB) ته ټاکل شوې، د لویو پاڼو شمیر 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 کې د لوی_ مخونو پیرامیټر "آن" ته تنظیم کړئ او سرور بیا پیل کړئ.

یو ځل بیا، لوی پاڼې (یوازې لینکس) د ‏‎

$ 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 قاتل (د لینکس د حافظې پاکولو پروسه) پروسه له مینځه ویسي. نو دا خوندي ده چې دا 1 ته تنظیم کړئ که تاسو غواړئ تبادله کم کړئ. په لینکس کې ډیفالټ ارزښت 60 دی. لوړ ارزښت د دې لامل کیږي چې MMU (د حافظې مدیریت واحد) د RAM په پرتله ډیر سویپ ځای وکاروي پداسې حال کې چې ټیټ ارزښت ډیر ډیټا/کوډ په حافظه کې ساتي.

ټیټ ارزښت په PostgreSQL کې د ښه فعالیت لپاره ښه شرط دی.

vm.overcommit_memory / vm.overcommit_ratio

غوښتنلیکونه حافظه ترلاسه کوي او خوشې کوي کله چې اړتیا ورته نه وي. مګر په ځینو مواردو کې ، غوښتنلیک خورا ډیر حافظه ترلاسه کوي او خوشې نه کوي. دا کیدای شي د OOM وژونکي سبب شي. دلته د پیرامیټرو احتمالي ارزښتونه دي vm.overcommit_memory د هر یو لپاره د توضیحاتو سره:

  1. Heuristic overcommit (ډیفالټ)؛ د کرنل پراساس هوریستیک
  2. په هرصورت، د زیاتې ژمنې اجازه ورکړئ
  3. دا ډیر مه کوئ، د ډیر کمیت تناسب څخه ډیر مه کوئ.

سیسټم: https://www.kernel.org/doc/Documentation/vm/overcommit-accounting

vm.overcommit_ratio - د اوورلوډ لپاره د رام سلنه شتون لري. د 50 GB RAM سره په سیسټم کې د 2٪ ارزښت کولی شي تر 3 GB رام پورې تخصیص کړي.

د vm.overcommit_memory لپاره د 2 ارزښت د 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 په ډیری لینکس سیسټمونو کې ډیفالټ دی. تاسو کولی شئ د یو کوچني فاکتور لخوا د لیکلو ژورو عملیاتو لپاره فعالیت ښه کړئ ، پدې معنی چې لینکس به په شالید کې خندا پاڼې فلش کړي.

تاسو اړتیا لرئ ارزښت تنظیم کړئ 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 بار پورې اړوند تنظیم کړئ.

نتیجه

تاسو کولی شئ د فعالیت ښه کولو لپاره نور ترتیبات ټیک کړئ، مګر اصلاحات به لږ وي او تاسو به ډیره ګټه ونه ګورئ. موږ باید په یاد ولرو چې ټول اختیارونه په ټولو ډولونو کې نه پلي کیږي. ځینې ​​ایپسونه ښه کار کوي کله چې موږ ځینې ترتیبات تنظیم کړو، او ځینې یې نه. تاسو باید د خپل متوقع کاري بار او غوښتنلیک ډول لپاره د دې ترتیباتو تنظیم کولو ترمینځ سم توازن ومومئ ، او تاسو باید د ټون کولو پرمهال د OS چلند هم په پام کې ونیسئ. د کرنل پیرامیټرو تنظیم کول دومره اسانه ندي لکه څنګه چې د ډیټابیس پیرامیټرونو تنظیم کول؛ د سپارښتنو چمتو کول خورا ستونزمن دي.

سرچینه: www.habr.com

Add a comment