Настройка ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ядра Linux для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ PostgreSQL

Настройка ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ядра Linux для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ PostgreSQL ΠžΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Π°Ρ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ PostgreSQL зависит ΠΎΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы. ΠŸΠ»ΠΎΡ…ΠΎ настроСнныС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ядра ОБ ΠΌΠΎΠ³ΡƒΡ‚ привСсти ΠΊ сниТСнию ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ сСрвСра Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ эти ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π±Ρ‹Π»ΠΈ настроСны Π² соотвСтствии с сСрвСром Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ. Π’ этом постС ΠΌΡ‹ обсудим Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π°ΠΆΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ядра Linux, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ²Π»ΠΈΡΡ‚ΡŒ Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ сСрвСра Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ способы ΠΈΡ… настройки.

SHMMAX / SHMALL

SHMMAX β€” это ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ядра, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для опрСдСлСния максимального Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΎΠ΄Π½ΠΎΠ³ΠΎ сСгмСнта раздСляСмой памяти (shared memory), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ процСсс Linux. Π”ΠΎ вСрсии 9.2 PostgreSQL использовал System V (SysV), для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ трСбуСтся настройка SHMMAX. ПослС 9.2 PostgreSQL ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΡΡ Π½Π° Ρ€Π°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ POSIX. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ трСбуСтся мСньшС Π±Π°ΠΉΡ‚ΠΎΠ² раздСляСмой памяти System V.

Π”ΠΎ вСрсии 9.3 SHMMAX Π±Ρ‹Π» Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ ядра. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ SHMMAX задаСтся Π² Π±Π°ΠΉΡ‚Π°Ρ….

Аналогично, SHMALL β€” это Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ядра, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для опрСдСлСния
общСсистСмного объСма страниц раздСляСмой памяти (shared memory). Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ значСния SHMMAX, SHMALL ΠΈΠ»ΠΈ SHMMIN, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ipcs.

SHM* Details β€” 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* Details β€” 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 ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ System V IPC для выдСлСния раздСляСмой памяти. Π­Ρ‚ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ являСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ядра. Всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ сообщСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…, это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρƒ вас Π±ΠΎΠ»Π΅Π΅ старая вСрсия PostgreSQL ΠΈ Ρƒ вас ΠΎΡ‡Π΅Π½ΡŒ Π½ΠΈΠ·ΠΊΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ SHMMAX. ΠžΠΆΠΈΠ΄Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² соотвСтствии с раздСляСмой ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ½ΠΈ ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡ‚ΡΡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ошибки Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ

Если SHMMAX настроСн Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ кластСр PostgreSQL с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ initdb.

initdb Failure
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 Failure
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:

  • Linux: 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

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ΅ страницы (Huge Pages)

Π’ Linux ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ страницы памяти 4 ΠšΠ‘, Π² BSD β€” Super Pages, Π° Π² Windows β€” Large Pages. Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° β€” это Ρ‡Π°ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти, выдСлСнная процСссу. ΠŸΡ€ΠΎΡ†Π΅ΡΡ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ нСсколько страниц Π² зависимости ΠΎΡ‚ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΊ памяти. Π§Π΅ΠΌ большС памяти трСбуСтся процСссу, Ρ‚Π΅ΠΌ большС страниц Π΅ΠΌΡƒ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΎ. ОБ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ выдСлСния страниц для процСссов. Π§Π΅ΠΌ мСньшС Ρ€Π°Π·ΠΌΠ΅Ρ€ страницы, Ρ‚Π΅ΠΌ большС Ρ‚Π°Π±Π»ΠΈΡ†Π°, Ρ‚Π΅ΠΌ большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ трСбуСтся для поиска страницы Π² этой Ρ‚Π°Π±Π»ΠΈΡ†Π΅ страниц. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ большиС страницы ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ большой объСм памяти с ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½Π½Ρ‹ΠΌΠΈ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹ΠΌΠΈ расходами; мСньшС просмотров страниц, мСньшС ошибок страниц, Π±ΠΎΠ»Π΅Π΅ быстрыС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ чтСния/записи Ρ‡Π΅Ρ€Π΅Π· большиС Π±ΡƒΡ„Π΅Ρ€Ρ‹. Как Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ β€” ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

PostgreSQL ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ большиС страницы Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Linux. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Linux ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ 4 ΠšΠ‘ страниц памяти, поэтому Π² случаях, ΠΊΠΎΠ³Π΄Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ слишком ΠΌΠ½ΠΎΠ³ΠΎ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ страницы большСго Ρ€Π°Π·ΠΌΠ΅Ρ€Π°. ΠΠ°Π±Π»ΡŽΠ΄Π°Π΅Ρ‚ΡΡ прирост ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΡ€ΠΈ использовании Π±ΠΎΠ»ΡŒΡˆΠΈΡ… страниц Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 2 ΠœΠ‘ ΠΈ Π΄ΠΎ 1 Π“Π‘. Π Π°Π·ΠΌΠ΅Ρ€ большой страницы ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ установлСн Π²ΠΎ врСмя Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π»Π΅Π³ΠΊΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ большой страницы ΠΈ ΠΈΡ… использованиС Π½Π° вашСм Linux-ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ cat /proc/meminfo | grep -i huge.

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… страницах (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° 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

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, хотя Ρ€Π°Π·ΠΌΠ΅Ρ€ большой страницы установлСн Π² 2048 (2 ΠœΠ‘), ΠΎΠ±Ρ‰Π΅Π΅ количСство Π±ΠΎΠ»ΡŒΡˆΠΈΡ… страниц ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ большиС страницы ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹.

Π‘ΠΊΡ€ΠΈΠΏΡ‚ опрСдСлСния количСства Π±ΠΎΠ»ΡŒΡˆΠΈΡ… страниц

Π­Ρ‚ΠΎ простой скрипт Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ количСство Π±ΠΎΠ»ΡŒΡˆΠΈΡ… страниц. ЗапуститС скрипт Π½Π° вашСм сСрвСрС Linux, ΠΏΠΎΠΊΠ° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ 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).

Π‘Π½ΠΎΠ²Π° информация ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… страницах (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° 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

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π·Π°Π΄Π°ΠΉΡ‚Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ huge_pages Β«onΒ» Π² $PGDATA/postgresql.conf ΠΈ пСрСзапуститС сСрвСр.

И снова информация ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… страницах (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° 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

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ°Π»ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… страниц. Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π² Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ….

НСкоторыС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… для ΡƒΡ‚ΠΈΠ»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… страниц

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

Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π»ΠΈ ΠΌΡ‹ сСйчас большС Π±ΠΎΠ»ΡŒΡˆΠΈΡ… страниц, Ρ‡Π΅ΠΌ Ρ€Π°Π½ΡŒΡˆΠ΅.

Π•Ρ‰Π΅ Ρ€Π°Π· информация ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… страницах (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° 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

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… страниц ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для HugePages, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ΅ здСсь, ΠΎΡ‡Π΅Π½ΡŒ Π½ΠΈΠ·ΠΊΠΎΠ΅, Ρ‡Ρ‚ΠΎ Π½Π΅ являСтся Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ для ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Π½Π° ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ²ΠΎΠΉ срСдС. ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, ΠΎΡ†Π΅Π½ΠΈΡ‚Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ количСство страниц для вашСй систСмы ΠΈ установитС ΠΈΡ… соотвСтствСнно Π² зависимости ΠΎΡ‚ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈ рСсурсов.

vm.swappiness

vm.swappiness β€” это Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ядра, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π»ΠΈΡΡ‚ΡŒ Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…. Π­Ρ‚ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для управлСния ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎΠ΄ΠΊΠ°Ρ‡ΠΊΠΈ (swappiness) (ΠΏΠΎΠ΄ΠΊΠ°Ρ‡ΠΊΠΈ страниц Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ ΠΈΠ· Π½Π΅Π΅) Π² Linux. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²Π°Ρ€ΡŒΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ ΠΎΡ‚ 0 Π΄ΠΎ 100. Он опрСдСляСт, сколько памяти Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Ρ€ΡƒΠΆΠ΅Π½ΠΎ ΠΈΠ»ΠΈ Π²Ρ‹Π³Ρ€ΡƒΠΆΠ΅Π½ΠΎ. Ноль ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΎΠ±ΠΌΠ΅Π½Π°, Π° 100 ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ агрСссивный ΠΎΠ±ΠΌΠ΅Π½.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, установив Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΠ·ΠΊΠΈΠ΅ значСния.

Установка значСния 0 Π² Π±ΠΎΠ»Π΅Π΅ Π½ΠΎΠ²Ρ‹Ρ… ядрах ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ OOM Killer (процСсс очистки памяти Π² Linux) ΡƒΠ±ΡŒΠ΅Ρ‚ процСсс. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΠΎΠΆΠ½ΠΎ бСзопасно ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 1, Ссли Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ°Ρ‡ΠΊΡƒ. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² Linux β€” 60. Π‘ΠΎΠ»Π΅Π΅ высокоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ заставляСт MMU (Π±Π»ΠΎΠΊ управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ большС пространства ΠΏΠΎΠ΄ΠΊΠ°Ρ‡ΠΊΠΈ, Ρ‡Π΅ΠΌ ΠžΠ—Π£, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΠ·ΠΊΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сохраняСт большС Π΄Π°Π½Π½Ρ‹Ρ…/ΠΊΠΎΠ΄Π° Π² памяти.

МСньшСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ β€” Ρ…ΠΎΡ€ΠΎΡˆΠ°Ρ ставка Π½Π° ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π² PostgreSQL.

vm.overcommit_memory / vm.overcommit_ratio

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡŽΡ‚ Π΅Π΅, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½Π° большС Π½Π΅ Π½ΡƒΠΆΠ½Π°. Но Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ слишком ΠΌΠ½ΠΎΠ³ΠΎ памяти ΠΈ Π½Π΅ освобоТдаСт Π΅Π΅. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ OOM killer. Π’ΠΎΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ значСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° vm.overcommit_memory с описаниСм для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ:

  1. ЭвристичСский overcommit (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ); основанная Π½Π° ядрС эвристика
  2. Π Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ overcommit Π² любом случаС
  3. НС пСрСусСрдствуйтС, Π½Π΅ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°ΠΉΡ‚Π΅ overcommit коэффициСнт.

Бсылка: https://www.kernel.org/doc/Documentation/vm/overcommit-accounting

vm.overcommit_ratio β€” ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти, доступной для Ρ‡Ρ€Π΅Π·ΠΌΠ΅Ρ€Π½ΠΎΠΉ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 50% Π² систСмС с 2 Π“Π‘ ΠžΠ—Π£ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ Π΄ΠΎ 3 Π“Π‘ ΠžΠ—Π£.

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 2 для vm.overcommit_memory обСспСчиваСт Π»ΡƒΡ‡ΡˆΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ для PostgreSQL. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ максимизируСт использованиС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти сСрвСрным процСссом Π±Π΅Π· ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ риска Π±Ρ‹Ρ‚ΡŒ ΡƒΠ±ΠΈΡ‚Ρ‹ΠΌ процСссом OOM killer. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ смоТСт ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒΡΡ, Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… пСрСрасхода, Ρ‡Ρ‚ΠΎ сниТаСт риск Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ OOM killer ΡƒΠ±ΡŒΠ΅Ρ‚ процСсс. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 2 Π΄Π°Π΅Ρ‚ Π»ΡƒΡ‡ΡˆΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Ρ‡Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 0. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½Π° Π·Π° счСт Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠ°ΠΌΡΡ‚ΡŒ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ допустимого Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π°. Π­Ρ‚ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ риск Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ процСсс Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ±ΠΈΡ‚ OOM-killer.

Π’ систСмах Π±Π΅Π· ΠΏΠΎΠ΄ΠΊΠ°Ρ‡ΠΊΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с 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 β€” Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ систСм Linux. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ²Ρ‹ΡΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с интСнсивной записью с мСньшим коэффициСнтом, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ 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. Π­Ρ‚ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ„ΠΎΠ½ΠΎΠ²Ρ‹Π΅ процСссы Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ Ρ€Π°Π½ΡŒΡˆΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ максимально Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ прилоТСния. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ€Π°Π·Π½ΠΈΡ†Ρƒ ΠΌΠ΅ΠΆΠ΄Ρƒ этими двумя ΡΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡΠΌΠΈ Π² зависимости ΠΎΡ‚ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ дискового Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°.

Π˜Ρ‚ΠΎΠ³

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ для увСличСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Π½ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ Π±ΡƒΠ΄ΡƒΡ‚ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΈ Π²Ρ‹Π³ΠΎΠ΄Ρ‹ особой Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅. ΠœΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½Π΅ всС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ относятся ΠΊΠΎ всСм Ρ‚ΠΈΠΏΠ°ΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. НСкоторыС прилоТСния Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π»ΡƒΡ‡ΡˆΠ΅, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ настраиваСм Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ β€” Π½Π΅Ρ‚. Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°ΠΉΡ‚ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ баланс ΠΌΠ΅ΠΆΠ΄Ρƒ конфигурациями этих ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² для ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠΉ Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈ Ρ‚ΠΈΠΏΠ° прилоТСния, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈ настройкС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ОБ. ΠΠ°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ядра Π½Π΅ Ρ‚Π°ΠΊ просто, ΠΊΠ°ΠΊ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…: здСсь слоТнСС Π΄Π°Π²Π°Ρ‚ΡŒ свои Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com