配置 Linux 核心選項以最佳化 PostgreSQL

配置 Linux 核心選項以最佳化 PostgreSQL 最佳 PostgreSQL 效能取決於正確定義的作業系統參數。 作業系統核心設定配置不當可能會導致資料庫伺服器效能不佳。 因此,必須根據資料庫伺服器及其工作負載來配置這些設定。 在這篇文章中,我們將討論一些可能影響資料庫伺服器效能的重要 Linux 核心參數以及如何配置它們。

SHMMAX / SHMALL

SHM最大 是一個核心參數,用於確定 Linux 進程可以分配的單一共享記憶體段的最大大小。 在版本 9.2 之前,PostgreSQL 使用 System V (SysV),這需要 SHMMAX 設定。 9.2之後,PostgreSQL改用POSIX共享記憶體。 因此,現在需要更少的 System V 共享記憶體位元組。

在9.3版本之前,SHMMAX是最重要的核心參數。 SHMMAX 值以位元組為單位指定。

同樣, 上海商城 是另一個核心參數,用於確定
系統範圍的共享記憶體頁面量。 若要查看目前的 SHMMAX、SHMALL 或 SHMMIN 值,請使用指令 綜合控制系統.

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 叢集時可能會收到錯誤訊息 初始化資料庫.

初始化資料庫失敗
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.

了解定義的差異

在 Linux 和 MacOS X 上定義 SHMMAX/SHMALL 參數略有不同:

  • 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

大頁面

Linux 預設使用 4 KB 記憶體頁,BSD 使用 XNUMX KB 記憶體頁。 超級頁面,以及在 Windows 上 - 大頁面。 頁是分配給進程的一塊 RAM。 根據記憶體需求,一個進程可以有多個頁面。 進程需要的記憶體越多,分配的頁面就越多。 作業系統為進程維護一個頁面分配表。 頁大小越小,表越大,在該頁表中找到頁所需的時間就越長。 因此,大頁面允許使用大量內存,同時減少開銷; 更少的頁面瀏覽量、更少的頁面錯誤、在更大的緩衝區上更快的讀取/寫入操作。 結果是性能提高。

PostgreSQL 僅支援 Linux 上的大頁面。 預設情況下,Linux使用4KB記憶體頁面,因此在記憶體操作過多的情況下,需要設定更大的頁面。 使用 2 MB 至 1 GB 的大頁面時,可以觀察到效能提升。 大頁面大小可以在啟動時設定。 您可以使用以下命令輕鬆檢查 Linux 機器上的大頁面參數及其使用情況 貓 /proc/meminfo | grep -i 巨大.

獲取有關大頁面的資訊(僅限 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 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)。

重新造訪大頁面(僅限 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

現在在 $PGDATA/postgresql.conf 中將huge_pages 參數設定為「on」並重新啟動伺服器。

再次,有關大頁面的資訊(僅限 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的估計值非常低,這對於運行產品環境的機器來說不是正常值。 請估計您的系統所需的頁面數量,並根據負載和資源進行相應設定。

虛擬機交換性

虛擬機交換性 是另一個可以影響資料庫效能的核心參數。 此選項用於控制 Linux 上的交換行為(將頁面換入記憶體和換出記憶體)。 值範圍從 0 到 100。它決定將調出或調出多少記憶體。 零意味著沒有交換,100意味著積極交換。

透過設定較低的值可以獲得良好的效能。

在較新的核心上將此設為 0 可能會導致 OOM Killer(Linux 的記憶體清理進程)終止該進程。 因此,如果您想最大程度地減少交換,請將其設定為 1 是安全的。 Linux 中的預設值為 60。較高的值會導致 MMU(記憶體管理單元)使用比 RAM 更多的交換空間,而較低的值會在記憶體中保留更多的資料/程式碼。

較低的值是提高 PostgreSQL 效能的好選擇。

vm.overcommit_memory / vm.overcommit_ratio

應用程式獲取記憶體並在不再需要時釋放它。 但在某些情況下,應用程式獲取過多記憶體並且不釋放它。 這可能會導致 OOM 殺手。 以下是可能的參數值 虛擬機器記憶體過量使用 每個都有一個描述:

  1. 啟發式過量使用(預設); 基於核心的啟發式
  2. 無論如何都允許過度使用
  3. 不要過度使用,不要超過過度使用比例。

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

vm.overcommit_ratio — 可用於過載的 RAM 百分比。 在具有 50 GB RAM 的系統上,值 2% 最多可以分配 3 GB RAM。

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 是大多數 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。 這可以確保後台程序更早啟動,從而盡可能避免阻塞應用程式。 您可以根據磁碟 I/O 負載調整這兩個比率之間的差異。

您可以調整其他設定來提高效能,但改進很小,而且您不會看到太多好處。 我們必須記住,並非所有選項都適用於所有類型的應用程式。 當我們調整某些設定時,有些應用程式會運作得更好,而有些則不然。 您必須在針對預期工作負載和應用程式類型配置這些設定之間找到適當的平衡,並且在調整時還必須考慮作業系統行為。 配置核心參數並不像配置資料庫參數那麼容易;提出建議更困難。

來源: www.habr.com

添加評論