PostgreSQLን ለማሻሻል የሊኑክስ ከርነል አማራጮችን ማስተካከል

PostgreSQLን ለማሻሻል የሊኑክስ ከርነል አማራጮችን ማስተካከል ምርጥ የ PostgreSQL አፈጻጸም በትክክል በተገለጹ የክወና ስርዓት መቼቶች ይወሰናል። በደንብ ያልተዋቀሩ የስርዓተ ክወና ከርነል መመዘኛዎች የውሂብ ጎታ አገልጋዩ አዝጋሚ ስራን ሊያስከትል ይችላል። ስለዚህ, እነዚህ መቼቶች በመረጃ ቋቱ አገልጋይ እና በስራው ጫና መሰረት መዋቀሩ በጣም አስፈላጊ ነው. በዚህ ልጥፍ፣ የውሂብ ጎታ አገልጋይ አፈጻጸም ላይ ተጽዕኖ ሊያሳድሩ የሚችሉ አንዳንድ ጠቃሚ የሊኑክስ ከርነል መለኪያዎችን እና እንዴት ማስተካከል እንደሚችሉ እንነጋገራለን።

SHMMAX / SHMALL

SHMMAX የሊኑክስ ሂደት ሊመደብ የሚችለውን የአንድ የጋራ ማህደረ ትውስታ ክፍል ከፍተኛ መጠን ለመወሰን የሚያገለግል የከርነል መለኪያ ነው። ከስሪት 9.2 በፊት፣ PostgreSQL ሲስተም V (SysV) ተጠቅሟል፣ ይህም የ SHMMAX መቼት ያስፈልገዋል። ከ9.2 PostgreSQL በኋላ ወደ POSIX የጋራ ማህደረ ትውስታ ተቀይሯል። ስለዚህ አሁን ያነሰ ባይት የስርዓት ቪ የጋራ ማህደረ ትውስታ ያስፈልጋል።

ከስሪት 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 አገልጋይ ሲጀምሩ ስህተት ሊያጋጥምዎት ይችላል። ገጽ_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 አማራጮች ትርጉም በሊኑክስ እና ማክኦኤስ ኤክስ ላይ ትንሽ የተለየ ነው።

  • ሊኑክስ፡ 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 ነባሪዎች ለ ልዕለ ገጾች, እና በዊንዶውስ ላይ ትላልቅ ገጾች. ገጽ ለአንድ ሂደት የተመደበው የ RAM ክፍል ነው። የማህደረ ትውስታ መስፈርቶች ላይ በመመስረት ሂደት በርካታ ገጾች ሊኖሩት ይችላል. አንድ ሂደት የበለጠ ማህደረ ትውስታ በሚያስፈልገው መጠን, ብዙ ገጾች ለእሱ ይመደባሉ. ስርዓተ ክወናው ለሂደቶች የገጽ ምደባ ሠንጠረዥን ይይዛል። የገጹ መጠን ባነሰ መጠን ሠንጠረዡ በትልቁ፣ በዚያ የገጽ ሠንጠረዥ ውስጥ ገጽ ለመፈለግ ረጅም ጊዜ ይወስዳል። ስለዚህ, ትላልቅ ገፆች ከፍተኛ መጠን ያለው ማህደረ ትውስታን ከተቀነሰ ትርፍ ጋር እንዲጠቀሙ ይፈቅዳሉ; ያነሱ የገጽ ዕይታዎች፣ ጥቂት የገጽ ጥፋቶች፣ ፈጣን የማንበብ/የጽሑፍ ሥራዎችን በትላልቅ ማቋቋሚያዎች። ውጤቱም የተሻሻለ አፈጻጸም ነው.

PostgreSQL በሊኑክስ ላይ ትላልቅ ገጾችን ብቻ ነው የሚደግፈው። በነባሪ, ሊኑክስ 4 ኪባ የማስታወሻ ገጾችን ይጠቀማል, ስለዚህ በጣም ብዙ የማህደረ ትውስታ ስራዎች ባሉበት ጊዜ, ትላልቅ ገጾችን መጫን አስፈላጊ ነው. ትላልቅ ገጾችን 2 ሜባ እና እስከ 1 ጂቢ ሲጠቀሙ የአፈፃፀም መጨመር አለ. ትልቅ ገጽ መጠን በመጫን ጊዜ ሊዘጋጅ ይችላል። ትዕዛዙን በመጠቀም ትላልቅ የገጽ አማራጮችን እና አጠቃቀማቸውን በሊኑክስ ማሽንዎ ላይ በቀላሉ ማረጋገጥ ይችላሉ። ድመት /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

አሁን ግዙፍ_ገጾቹን በ$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 ምሳሌ ዋጋ በጣም ዝቅተኛ ነው፣ ይህም ለማምረቻ ማሽን የተለመደ አይደለም። እባክዎ ለስርዓትዎ የሚፈለጉትን የገጾች ብዛት ይገምቱ እና እንደ ጭነቱ እና ሃብቶች ላይ በመመስረት ያቀናብሩ።

ቪም.ስዋፒነት

ቪም.ስዋፒነት የውሂብ ጎታ አፈጻጸምን የሚነካ ሌላ የከርነል ቅንብር ነው። ይህ ቅንብር በሊኑክስ ላይ የመለዋወጥ ባህሪን (ገጽ መግጠም እና ከ ማህደረ ትውስታ ውጪ) ለመቆጣጠር ስራ ላይ ይውላል። እሴቱ ከ 0 እስከ 100 ይደርሳል. ምን ያህል ማህደረ ትውስታ በገጽ ላይ እንደሚወጣ ወይም እንደሚወርድ ይወስናል. ዜሮ ማለት ምንም ማጋራት ማለት ነው, እና 100 የጥቃት መጋራት ማለት ነው.

ዝቅተኛ ዋጋዎችን በማዘጋጀት ጥሩ አፈፃፀም ማግኘት ይችላሉ.

በአዲሱ አስኳሎች ላይ ወደ 0 ማዋቀር የ OOM ገዳይ (የሊኑክስ ማህደረ ትውስታ ማጽጃ ሂደት) ሂደቱን እንዲገድል ያደርገዋል። ስለዚህ ፔጅ ማድረግን ለመቀነስ ከፈለጉ እሴቱን ወደ 1 ማቀናበሩ ምንም ችግር የለውም። በሊኑክስ ላይ ያለው ነባሪ እሴት 60 ነው። ከፍ ያለ ዋጋ ኤምኤምዩ (የማህደረ ትውስታ አስተዳደር ክፍል) ከ RAM የበለጠ የመለዋወጫ ቦታ እንዲጠቀም ያደርገዋል ፣ ዝቅተኛ እሴት ደግሞ ብዙ ውሂብ / ኮድ በማህደረ ትውስታ ውስጥ ይይዛል።

ዝቅተኛ ዋጋ በPostgreSQL ውስጥ ለአፈጻጸም ማሻሻያ ጥሩ ውርርድ ነው።

vm.overcommit_memory / vm.overcommit_ratio

አፕሊኬሽኖች ማህደረ ትውስታን ያገኛሉ እና በማይፈለግበት ጊዜ ይለቃሉ። ነገር ግን በአንዳንድ ሁኔታዎች, አፕሊኬሽኑ ብዙ ማህደረ ትውስታን ያገኛል እና አይለቀቅም. ይህ የOOM ገዳይን ሊያስነሳ ይችላል። ሊሆኑ የሚችሉ መለኪያዎች እዚህ አሉ። vm.ከመጠን በላይ_ማህደረ ትውስታ ለእያንዳንዱ መግለጫ ጋር:

  1. ሂዩሪስቲክ ከመጠን በላይ መጨናነቅ (ነባሪ); በከርነል ላይ የተመሰረተ ሂውሪስቲክ
  2. ለማንኛውም ከመጠን በላይ መውጣትን ፍቀድ
  3. ከመጠን በላይ አይውሰዱ, ከመጠን በላይ ከመጠን በላይ አይለፉ.

ማጣቀሻ https://www.kernel.org/doc/Documentation/vm/overcommit-accounting

vm.overcommit_ሬሾ - ከመጠን በላይ ለመጫን የ RAM መቶኛ። 50 ጂቢ RAM ባለው ስርዓት 2% ዋጋ እስከ 3 ጊባ ራም ሊመደብ ይችላል።

vm.overcommit_memoryን ወደ 2 ማቀናበር ለPostgreSQL ምርጡን አፈጻጸም ያቀርባል። ይህ ዋጋ በOOM ገዳይ ሂደት የመገደል አደጋ ሳይኖር የአገልጋዩን ሂደት የ RAM አጠቃቀምን ከፍ ያደርገዋል። አፕሊኬሽኑ ድጋሚ ማስነሳት ይችላል፣ ነገር ግን በተጨናነቀው ገደብ ውስጥ ብቻ፣ ይህም የ OOM ገዳይ ሂደቱን ሊገድለው የሚችለውን አደጋ ይቀንሳል። ስለዚህ የ 2 እሴት ከነባሪው 0 የተሻለ አፈፃፀም ይሰጣል። ነገር ግን ከተፈቀደው ክልል ውጪ ያለው ማህደረ ትውስታ ከመጠን በላይ እንዳይጫን በማድረግ አስተማማኝነትን ማሻሻል ይቻላል። ይህ ሂደቱን በኦኦኤም-ገዳይ የመገደል አደጋን ያስወግዳል።

ገጽ ባልሆኑ ስርዓቶች ላይ 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.ቆሻሻ_ዳራ_ሬሾ በዲስክ ላይ መፃፍ በሚያስፈልጋቸው በቆሸሹ ገጾች የተሞላው የማህደረ ትውስታ መቶኛ ነው። ወደ ዲስክ ማፍሰስ ከበስተጀርባ ይከናወናል. የዚህ ግቤት ዋጋ ከ 0 እስከ 100 ይደርሳል. ሆኖም ከ 5 በታች የሆነ እሴት ውጤታማ ላይሆን ይችላል እና አንዳንድ እንክብሎች አይደግፉትም። 10 በአብዛኛዎቹ የሊኑክስ ስርዓቶች ነባሪ እሴት ነው። በጥቂቱ ለመፃፍ የተጠናከረ ስራዎችን አፈጻጸም ማሻሻል ትችላለህ፣ ይህ ማለት ሊኑክስ የቆሸሹ ገጾችን ከበስተጀርባ ያጠፋል ማለት ነው።

እሴቱን ማዘጋጀት ያስፈልግዎታል vm.ቆሻሻ_ዳራ_ባይት እንደ ዲስክዎ ፍጥነት ይወሰናል.

ሁለቱም የሃርድዌር ጥገኛ ስለሆኑ ለእነዚህ ሁለት መለኪያዎች ምንም "ጥሩ" እሴቶች የሉም። ነገር ግን vm.dirty_background_ratio ወደ 5 እና vm.dirty_background_bytes ወደ 25% የዲስክ ፍጥነት ማዋቀር አፈፃፀሙን በአብዛኛው እስከ ~25% ያሻሽላል።

vm. dirty_ratio / ቆሻሻ_ባይት

ይህ ተመሳሳይ ነው vm. dirty_background_ratio / ቆሻሻ_ዳራ_ባይት, ዳግም ማስጀመር በስራ ክፍለ ጊዜ ውስጥ ካልሆነ በስተቀር ማመልከቻውን በማገድ ላይ. ስለዚህ vm.dirty_ratio ከፍ ያለ መሆን አለበት። vm.ቆሻሻ_ዳራ_ሬሾ. ይህ አፕሊኬሽኑን በተቻለ መጠን እንዳይታገድ ለማድረግ የጀርባ ሂደቶች ቀደም ብለው መጀመራቸውን ያረጋግጣል። በዲስክ I / O ጭነት ላይ በመመስረት በእነዚህ ሁለት ሬሾዎች መካከል ያለውን ልዩነት ማስተካከል ይችላሉ.

ውጤቱ

አፈጻጸሙን ለማሻሻል ሌሎች ቅንብሮችን ማስተካከል ይችላሉ፣ ነገር ግን ማሻሻያዎቹ አነስተኛ ይሆናሉ እና ብዙ ጥቅም አያገኙም። ሁሉም አማራጮች በሁሉም አይነት መተግበሪያዎች ላይ እንደማይተገበሩ ማስታወስ አለብን. አንዳንድ አፕሊኬሽኖች አንዳንድ ቅንብሮችን ስናስተካክል እና አንዳንድ አያደርጉም። በሚጠበቀው የሥራ ጫና እና የመተግበሪያ አይነት በእነዚህ ቅንብሮች ውቅሮች መካከል ትክክለኛውን ሚዛን ማግኘት አለቦት፣ እና ሲዋቀር የስርዓተ ክወናው ባህሪ ግምት ውስጥ መግባት አለበት። የከርነል መለኪያዎችን ማስተካከል የውሂብ ጎታ መለኪያዎችን እንደ ማዋቀር ቀላል አይደለም፡ እዚህ ምክሮችን መስጠት የበለጠ ከባድ ነው።

ምንጭ: hab.com

አስተያየት ያክሉ