PostgreSQL ප්‍රශස්ත කිරීම සඳහා ලිනක්ස් කර්නල් විකල්ප වින්‍යාස කිරීම

PostgreSQL ප්‍රශස්ත කිරීම සඳහා ලිනක්ස් කර්නල් විකල්ප වින්‍යාස කිරීම Optimal PostgreSQL කාර්ය සාධනය නිවැරදිව අර්ථ දක්වා ඇති මෙහෙයුම් පද්ධති පරාමිතීන් මත රඳා පවතී. දුර්වල ලෙස වින්‍යාස කර ඇති OS කර්නල් සැකසුම් දුර්වල දත්ත සමුදා සේවාදායකයේ ක්‍රියාකාරිත්වයට හේතු විය හැක. එමනිසා, මෙම සැකසුම් දත්ත සමුදා සේවාදායකය සහ එහි කාර්ය භාරය අනුව වින්‍යාස කිරීම අත්‍යවශ්‍ය වේ. මෙම ලිපියෙන්, දත්ත සමුදා සේවාදායක ක්‍රියාකාරිත්වයට බලපෑම් කළ හැකි වැදගත් ලිනක්ස් කර්නල් පරාමිති කිහිපයක් සහ ඒවා වින්‍යාස කරන්නේ කෙසේද යන්න අපි සාකච්ඡා කරමු.

SHMMAX / SHMALL

SHMMAX ලිනක්ස් ක්‍රියාවලියකට වෙන් කළ හැකි තනි හවුල් මතක කොටසක උපරිම ප්‍රමාණය තීරණය කිරීමට භාවිතා කරන කර්නල් පරාමිතියකි. 9.2 අනුවාදයට පෙර, PostgreSQL භාවිතා කළේ System V (SysV), ඒ සඳහා SHMMAX සැකසුම අවශ්‍ය වේ. 9.2 න් පසු, PostgreSQL POSIX හවුල් මතකයට මාරු විය. එබැවින් දැන් පද්ධති V හවුල් මතකයේ බයිට් අඩු ප්‍රමාණයක් අවශ්‍ය වේ.

9.3 අනුවාදයට පෙර, SHMMAX වඩාත් වැදගත් කර්නල් පරාමිතිය විය. SHMMAX අගය බයිට් වලින් දක්වා ඇත.

ඒ හා සමානව SHMALL තීරණය කිරීමට භාවිතා කරන තවත් කර්නල් පරාමිතිය වේ
පද්ධති පුරා බෙදාගත් මතක පිටු පරිමාව. වත්මන් SHMMAX, SHMALL, හෝ SHMMIN අගයන් බැලීමට, විධානය භාවිතා කරන්න ipcs.

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 හවුල් මතකය වෙන් කිරීමට. මෙම පරාමිතිය වඩාත් වැදගත් කර්නල් පරාමිතීන්ගෙන් එකකි. ඔබට පහත දෝෂ පණිවිඩ ලැබෙන විට, එයින් අදහස් වන්නේ ඔබට 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.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

Linux මත කර්නල් පරාමිතීන් වෙනස් කිරීම

# 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 Linux හි විශාල පිටු සඳහා පමණක් සහය දක්වයි. පෙරනිමියෙන්, Linux 4 KB මතක පිටු භාවිතා කරයි, එබැවින් බොහෝ මතක මෙහෙයුම් ඇති අවස්ථාවන්හිදී, විශාල පිටු සැකසීමට අවශ්ය වේ. 2 MB සහ 1 GB දක්වා විශාල පිටු භාවිතා කරන විට කාර්ය සාධන වාසි නිරීක්ෂණය කෙරේ. විශාල පිටු ප්‍රමාණය ඇරඹුම් වේලාවේදී සැකසිය හැක. ඔබට විධානය භාවිතයෙන් ඔබේ ලිනක්ස් යන්ත්‍රයේ විශාල පිටු පරාමිතීන් සහ ඒවායේ භාවිතය පහසුවෙන් පරීක්ෂා කළ හැක cat /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 MB) ලෙස සකසා ඇතත්, විශාල පිටු ගණන 0 ලෙස සකසා ඇත. මෙයින් අදහස් කරන්නේ විශාල පිටු අක්‍රිය කර ඇති බවයි.

විශාල පිටු ගණන තීරණය කිරීම සඳහා ස්ක්‍රිප්ට්

මෙම සරල ස්ක්‍රිප්ට් අවශ්‍ය විශාල පිටු සංඛ්‍යාව ලබා දෙයි. PostgreSQL ක්‍රියාත්මක වන අතරතුර ඔබගේ Linux සේවාදායකයේ ස්ක්‍රිප්ට් ධාවනය කරන්න. පරිසර විචල්‍යය සඳහා බව සහතික කර ගන්න $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 හි විශාල_පිටු පරාමිතිය "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 (Linux හි මතක පිරිසිදු කිරීමේ ක්‍රියාවලිය) ක්‍රියාවලිය විනාශ කිරීමට හේතු විය හැක. එබැවින් ඔබට හුවමාරු කිරීම අවම කිරීමට අවශ්‍ය නම් එය 1 ලෙස සැකසීම ආරක්ෂිත වේ. Linux හි පෙරනිමි අගය 60. ඉහළ අගයක් MMU (මතක කළමනාකරණ ඒකකය) RAM වලට වඩා වැඩි swap ඉඩක් භාවිතා කිරීමට හේතු වන අතර අඩු අගයක් මතකයේ වැඩි දත්ත/කේතයක් තබා ගනී.

PostgreSQL හි වැඩිදියුණු කළ කාර්ය සාධනය සඳහා අඩු අගයක් හොඳ ඔට්ටුවකි.

vm.overcommit_memory / vm.overcommit_ratio

යෙදුම් මතකය ලබා ගන්නා අතර එය තවදුරටත් අවශ්‍ය නොවන විට එය නිදහස් කරයි. නමුත් සමහර අවස්ථාවලදී, යෙදුම අධික මතකයක් ලබා ගන්නා අතර එය නිකුත් නොකරයි. මෙය OOM ඝාතකයෙකුට හේතු විය හැක. හැකි පරාමිති අගයන් මෙන්න vm.overcommit_memory එක් එක් සඳහා විස්තරයක් සමඟ:

  1. Heuristic overcommit (පෙරනිමි); කර්නලය මත පදනම් වූ හූරිස්ටික්
  2. කෙසේ හෝ ඉක්මවා යාමට ඉඩ දෙන්න
  3. එය ඉක්මවා නොයන්න, overcommit අනුපාතය ඉක්මවා නොයන්න.

යොමුව: https://www.kernel.org/doc/Documentation/vm/overcommit-accounting

vm.overcommit_ratio - අධි බර සඳහා ලබා ගත හැකි RAM ප්‍රතිශතය. 50 GB RAM සහිත පද්ධතියක 2% ක අගයක් RAM 3 GB දක්වා වෙන් කළ හැක.

vm.overcommit_memory සඳහා 2ක අගයක් PostgreSQL සඳහා වඩා හොඳ කාර්ය සාධනයක් සපයයි. මෙම අගය OOM ඝාතක ක්‍රියාවලිය මගින් මරණයට පත්වීමේ සැලකිය යුතු අවදානමකින් තොරව සේවාදායක ක්‍රියාවලියේ RAM භාවිතය උපරිම කරයි. යෙදුමට නැවත පූරණය කිරීමට හැකි වනු ඇත, නමුත් ඉක්මවා යාමේ සීමාවන් තුළ පමණක්, OOM ඝාතකයෙකු ක්‍රියාවලිය විනාශ කිරීමේ අවදානම අඩු කරයි. එබැවින්, 2 හි පෙරනිමි අගයට වඩා 0 අගයක් වඩා හොඳ කාර්ය සාධනයක් ලබා දෙයි. කෙසේ වෙතත්, පරාසයෙන් පිටත මතකය අධික ලෙස පැටවෙන්නේ නැති බව සහතික කර ගැනීමෙන් විශ්වසනීයත්වය වැඩිදියුණු කළ හැක. මෙම ක්රියාවලිය OOM ඝාතකයෙකු විසින් මරා දැමීමේ අවදානම ඉවත් කරයි.

හුවමාරුවකින් තොරව පද්ධති මත, 2 ට සමාන vm.overcommit_memory සමඟ ගැටළුවක් ඇති විය හැක.

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 පසුබිමේ අපිරිසිදු පිටු ෆ්ලෂ් කරන බවයි.

ඔබ අගය සැකසිය යුතුය 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 load එක අනුව ඔබට මෙම අනුපාත දෙක අතර වෙනස සකස් කළ හැක.

ප්රතිඵලය

කාර්ය සාධනය වැඩි දියුණු කිරීම සඳහා ඔබට වෙනත් සැකසුම් වෙනස් කළ හැකිය, නමුත් වැඩිදියුණු කිරීම් අවම වන අතර ඔබට වැඩි ප්‍රතිලාභයක් නොපෙනේ. සියලුම විකල්ප සියලු වර්ගවල යෙදුම් සඳහා අදාළ නොවන බව අප මතක තබා ගත යුතුය. අපි සමහර සැකසුම් සකස් කළ විට සමහර යෙදුම් වඩා හොඳින් ක්‍රියා කරන අතර සමහර ඒවා එසේ නොවේ. ඔබගේ අපේක්ෂිත කාර්ය භාරය සහ යෙදුම් වර්ගය සඳහා මෙම සැකසුම් වින්‍යාස කිරීම අතර නිවැරදි ශේෂය ඔබ සොයා ගත යුතු අතර, ඔබ සුසර කිරීමේදී OS හැසිරීමද සලකා බැලිය යුතුය. කර්නල් පරාමිති වින්‍යාස කිරීම දත්ත සමුදා පරාමිතීන් වින්‍යාස කිරීම තරම් පහසු නැත; නිර්දේශ කිරීම වඩාත් අපහසු වේ.

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න