PostgreSQL-i optimallaşdırmaq üçün Linux Kernel Seçimlərinin tənzimlənməsi

PostgreSQL-i optimallaşdırmaq üçün Linux Kernel Seçimlərinin tənzimlənməsi Optimal PostgreSQL performansı düzgün müəyyən edilmiş əməliyyat sistemi parametrlərindən asılıdır. Zəif konfiqurasiya edilmiş OS kernel parametrləri verilənlər bazası serverinin zəif işləməsi ilə nəticələnə bilər. Buna görə də, bu parametrlərin verilənlər bazası serverinə və onun iş yükünə uyğun olaraq konfiqurasiya edilməsi mütləqdir. Bu yazıda verilənlər bazası serverinin işinə təsir edə biləcək bəzi mühüm Linux nüvəsi parametrlərini və onların necə konfiqurasiya olunacağını müzakirə edəcəyik.

SHMMAX / SHMALL

SHMMAX Linux prosesinin ayıra biləcəyi tək paylaşılan yaddaş seqmentinin maksimum ölçüsünü müəyyən etmək üçün istifadə edilən ləpə parametridir. 9.2 versiyasından əvvəl PostgreSQL SHMMAX parametrini tələb edən System V (SysV) istifadə edirdi. 9.2-dən sonra PostgreSQL POSIX paylaşılan yaddaşa keçdi. Beləliklə, indi Sistem V paylaşılan yaddaşının daha az baytı tələb olunur.

9.3 versiyasından əvvəl SHMMAX nüvənin ən vacib parametri idi. SHMMAX dəyəri baytlarla müəyyən edilir.

Oxşar, SHMALL müəyyən etmək üçün istifadə edilən başqa bir nüvə parametridir
paylaşılan yaddaş səhifələrinin sistem miqyasında həcmi. Cari SHMMAX, SHMALL və ya SHMMIN dəyərlərinə baxmaq üçün əmrdən istifadə edin ipcs.

SHM* Təfərrüatlar - 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* Təfərrüatları - 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 istifadə edir Sistem V IPC paylaşılan yaddaşı ayırmaq üçün. Bu parametr nüvənin ən vacib parametrlərindən biridir. Aşağıdakı xəta mesajlarını aldığınız zaman bu o deməkdir ki, sizdə PostgreSQL-in köhnə versiyası var və SHMMAX dəyəriniz çox aşağıdır. İstifadəçilərin istifadə etmək niyyətində olduqları paylaşılan yaddaşa uyğun olaraq dəyəri tənzimləmələri və artırmaları gözlənilir.

Mümkün səhv konfiqurasiya xətaları

SHMMAX düzgün konfiqurasiya edilməyibsə, əmrdən istifadə edərək PostgreSQL klasterini işə salmağa çalışarkən xəta ala bilərsiniz. initdb.

initdb uğursuzluğu
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

Eyni şəkildə, əmrdən istifadə edərək PostgreSQL serverini işə salarkən xəta ala bilərsiniz pg_ctl.

pg_ctl Uğursuzluq
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.

Təriflərdəki fərqləri başa düşmək

SHMMAX/SHMALL parametrlərinin müəyyən edilməsi Linux və MacOS X-də bir qədər fərqlidir:

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

Komanda sysctl dəyəri müvəqqəti olaraq dəyişdirmək üçün istifadə edilə bilər. Sabit dəyərlər təyin etmək üçün giriş əlavə edin /etc/sysctl.conf. Təfərrüatlar aşağıdadır.

MacOS X-də Kernel Parametrlərinin dəyişdirilməsi

# 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-da Kernel Parametrlərinin dəyişdirilməsi

# 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

Unutmayın: Dəyişiklikləri daimi etmək üçün bu dəyərləri /etc/sysctl.conf-a əlavə edin

Böyük Səhifələr

Linux standart olaraq 4 KB yaddaş səhifələrindən istifadə edir, BSD XNUMX KB yaddaş səhifələrindən istifadə edir. Super Səhifələr, və Windows-da - Böyük Səhifələr. Səhifə bir proses üçün ayrılmış RAM parçasıdır. Yaddaş tələblərindən asılı olaraq proses bir neçə səhifədən ibarət ola bilər. Bir proses nə qədər çox yaddaş tələb edirsə, bir o qədər çox səhifə ayrılır. ƏS proseslər üçün səhifələrin ayrılması cədvəlini saxlayır. Səhifənin ölçüsü nə qədər kiçik olarsa, cədvəl nə qədər böyük olarsa, həmin səhifə cədvəlində bir səhifə tapmaq üçün bir o qədər çox vaxt lazımdır. Böyük səhifələr buna görə də azaldılmış yüklə böyük həcmdə yaddaşdan istifadə etməyə imkan verir; daha az səhifə baxışı, daha az səhifə xətası, daha böyük buferlər üzərində daha sürətli oxuma/yazma əməliyyatları. Nəticə təkmilləşdirilmiş performansdır.

PostgreSQL yalnız Linux-da böyük səhifələri dəstəkləyir. Varsayılan olaraq, Linux 4 KB yaddaş səhifələrindən istifadə edir, buna görə də çoxlu yaddaş əməliyyatlarının olduğu hallarda daha böyük səhifələr təyin etmək lazımdır. 2 MB və 1 GB-a qədər böyük səhifələrdən istifadə edərkən performans artımları müşahidə olunur. Böyük səhifə ölçüsü yükləmə zamanı təyin edilə bilər. Komandadan istifadə edərək, böyük səhifə parametrlərini və onların Linux maşınınızda istifadəsini asanlıqla yoxlaya bilərsiniz cat /proc/meminfo | grep - mən nəhəngəm.

Böyük səhifələr haqqında məlumat əldə etmək (yalnız Linux)

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

Bu nümunədə böyük səhifə ölçüsü 2048 (2 MB) olaraq təyin edilsə də, böyük səhifələrin ümumi sayı 0-a təyin edilib. Bu o deməkdir ki, böyük səhifələr qeyri-aktiv edilib.

Böyük səhifələrin sayını təyin etmək üçün skript

Bu sadə skript tələb olunan sayda böyük səhifələri qaytarır. PostgreSQL işləyərkən skripti Linux serverinizdə işə salın. Ətraf mühit dəyişəni üçün əmin olun $PGDATA PostgreSQL məlumat kataloqu müəyyən edilmişdir.

Tələb olunan böyük səhifələrin sayının əldə edilməsi

#!/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 çıxışı belə görünür:

Skript çıxışı

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

Böyük səhifələr üçün tövsiyə olunan dəyər 88-dir, ona görə də onu 88-ə təyin etməlisiniz.

Böyük Səhifələrin Quraşdırılması

sysctl -w vm.nr_hugepages=88

İndi böyük səhifələri yoxlayın, böyük səhifələrin istifadə edilmədiyini görəcəksiniz (HugePages_Free = HugePages_Total).

Böyük Səhifələrə yenidən baxıldı (Yalnız Linux)

$ 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

İndi $PGDATA/postgresql.conf-da large_pages parametrini "on" vəziyyətinə qoyun və serveri yenidən başladın.

Yenə böyük səhifələr haqqında məlumat (yalnız 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

İndi çox az sayda böyük səhifələrin istifadə olunduğunu görə bilərsiniz. İndi verilənlər bazasına bəzi məlumatları əlavə etməyə çalışaq.

Böyük səhifələri təkrar emal etmək üçün bəzi verilənlər bazası əməliyyatları

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

Gəlin görək indi əvvəlkindən daha böyük səhifələrdən istifadə edirikmi?

Böyük səhifələr haqqında ətraflı məlumat (yalnız Linux)

$ 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

İndi böyük səhifələrin çoxunun istifadə olunduğunu görə bilərsiniz.

Qeyd: Burada istifadə edilən HugePages üçün təxmini dəyər çox aşağıdır, bu, məhsul mühiti ilə işləyən maşın üçün normal dəyər deyil. Zəhmət olmasa sisteminiz üçün lazım olan səhifələrin sayını təxmin edin və onları yükə və resurslara əsasən təyin edin.

vm.swappiness

vm.swappiness verilənlər bazası performansına təsir edə biləcək başqa bir kernel parametridir. Bu seçim Linux-da mübadilə davranışına nəzarət etmək üçün istifadə olunur (səhifələrin yaddaşda və yaddaşda dəyişdirilməsi). Dəyər 0-dan 100-ə qədər dəyişir. O, nə qədər yaddaşın səhifələnəcəyini və ya səhifədən çıxarılacağını müəyyən edir. Sıfır mübadilə yoxdur, 100 isə aqressiv mübadilə deməkdir.

Aşağı dəyərlər təyin etməklə yaxşı performans əldə edə bilərsiniz.

Bunu daha yeni nüvələrdə 0-a təyin etmək OOM Killer-in (Linux-un yaddaş təmizləmə prosesi) prosesi öldürməsinə səbəb ola bilər. Beləliklə, dəyişdirməni minimuma endirmək istəyirsinizsə, onu 1-ə təyin etmək təhlükəsizdir. Linux-da standart dəyər 60-dır. Daha yüksək dəyər MMU-nun (yaddaşın idarə edilməsi vahidi) RAM-dan daha çox dəyişdirmə sahəsi istifadə etməsinə səbəb olur, aşağı dəyər isə yaddaşda daha çox məlumat/kod saxlayır.

Aşağı dəyər PostgreSQL-də təkmilləşdirilmiş performans üçün yaxşı bir bahisdir.

vm.overcommit_memory / vm.overcommit_ratio

Tətbiqlər yaddaş əldə edir və lazım olmadıqda onu buraxır. Ancaq bəzi hallarda proqram çox yaddaş alır və onu buraxmır. Bu, OOM qatilinə səbəb ola bilər. Burada mümkün parametr dəyərləri var vm.overcommit_memory hər biri üçün təsviri ilə:

  1. Heuristic overcommit (defolt); nüvəyə əsaslanan evristik
  2. İstənilən halda həddi aşmağa icazə verin
  3. Həddindən artıq həddi aşmayın, həddi aşmayın.

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

vm.overcommit_ratio — həddindən artıq yükləmə üçün mövcud RAM faizi. 50 GB RAM olan bir sistemdə 2% dəyər 3 GB-a qədər RAM ayıra bilər.

vm.overcommit_memory üçün 2 dəyəri PostgreSQL üçün daha yaxşı performans təmin edir. Bu dəyər OOM killer prosesi tərəfindən öldürülmə riski olmadan server prosesinin RAM istifadəsini maksimum dərəcədə artırır. Tətbiq yenidən yüklənə biləcək, lakin yalnız həddi aşmaq hüdudlarında olacaq ki, bu da OOM qatilinin prosesi öldürməsi riskini azaldır. Buna görə də, 2 dəyəri standart 0 dəyərindən daha yaxşı performans verir. Bununla belə, etibarlılıq diapazondan kənar yaddaşın həddindən artıq yüklənməməsini təmin etməklə yaxşılaşdırıla bilər. Bu, prosesin OOM qatili tərəfindən öldürülməsi riskini aradan qaldırır.

Mübadiləsiz sistemlərdə vm.overcommit_memory ilə 2-yə bərabər problem yarana bilər.

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 diskə yazılmalı olan çirkli səhifələrlə dolu yaddaşın faizidir. Diskə flush fonda baş verir. Bu parametrin dəyəri 0-dan 100-ə qədərdir; lakin, 5-dən aşağı dəyər təsirsiz ola bilər və bəzi ləpələr bunu dəstəkləmir. 10 əksər Linux sistemlərində standartdır. Yazma intensivliyi olan əməliyyatlar üçün performansı daha kiçik bir amillə yaxşılaşdıra bilərsiniz, bu da Linux-un arxa planda çirkli səhifələri siləcəyini bildirir.

Dəyəri təyin etməlisiniz vm.dirty_background_bytes sürücünüzün sürətindən asılı olaraq.

Bu iki parametr üçün "yaxşı" dəyərlər yoxdur, çünki hər ikisi aparatdan asılıdır. Bununla belə, vm.dirty_background_ratio-nun 5-ə və vm.dirty_background_bytes-in disk sürətinin 25%-nə təyin edilməsi əksər hallarda performansı ~25%-ə qədər yaxşılaşdırır.

vm.dirty_ratio/dirty_bytes

Eynidir vm.dirty_background_ratio/dirty_background_bytes, istisna olmaqla, sıfırlama tətbiqi bloklayan işçi sessiyasında həyata keçirilir. Buna görə də vm.dirty_ratio daha yüksək olmalıdır vm.dirty_background_ratio. Bu, proqramın mümkün qədər bloklanmasının qarşısını almaq üçün fon proseslərinin daha erkən başlamasını təmin edir. Siz diskin I/O yükündən asılı olaraq bu iki nisbət arasındakı fərqi tənzimləyə bilərsiniz.

Ümumi

Performansı artırmaq üçün digər parametrləri düzəldə bilərsiniz, lakin təkmilləşdirmələr minimal olacaq və çox fayda görməyəcəksiniz. Unutmamalıyıq ki, bütün seçimlər bütün proqram növlərinə aid deyil. Bəzi parametrləri tənzimləyəndə bəzi proqramlar daha yaxşı işləyir, bəziləri isə yox. Siz gözlənilən iş yükünüz və proqram növü üçün bu parametrləri konfiqurasiya etmək arasında düzgün tarazlığı tapmalısınız və tənzimləmə zamanı OS davranışını da nəzərə almalısınız. Kernel parametrlərini konfiqurasiya etmək verilənlər bazası parametrlərini konfiqurasiya etmək qədər asan deyil, tövsiyələr vermək daha çətindir.

Mənbə: www.habr.com

Добавить комментарий