PostgreSQL 平臺相關的說明

2021-08-27 17:27 更新
16.7.1. AIX
16.7.2. Cygwin
16.7.3. macOS
16.7.4. MinGW/原生 Windows
16.7.5. Solaris

這一節(jié)提供了考慮 PostgreSQL 安裝和設置的附加平臺相關的話題。確保閱讀安裝指導,特別是第 16.2 節(jié)。 同樣,檢查關于回歸測試結果解釋的第 32 章。

這里沒有覆蓋的平臺不存在平臺相關的安裝問題。

16.7.1. AIX

PostgreSQL 能在 AIX 上工作,但是AIX 6.1以前的版本有各種問題并且不推薦使用。你可以使用 GCC 或本地 IBM 編譯器xlc

16.7.1.1. 內存管理

AIX 的特別之處在于它的內存管理。你可能有一個裝備有好多個吉字節(jié)空閑 RAM 的服務器,但是在運行應用時仍然會得到內存不足或者地址空間錯誤。一個例子是加載擴展會因為罕見的錯誤失敗。例如,作為 PostgreSQL 安裝的擁有者運行:

=# CREATE EXTENSION plperl;
ERROR:  could not load library "/opt/dbs/pgsql/lib/plperl.so": A memory address is not in the address space for the process.

作為擁有 PostgreSQL 安裝的組中的非擁有者運行:

=# CREATE EXTENSION plperl;
ERROR:  could not load library "/opt/dbs/pgsql/lib/plperl.so": Bad address

另一個例子是 PostgreSQL 服務器日志中的內存不足錯誤,每次內存分配接近或者超過 256 MB 時都會失敗。

所有這些問題的總體成因是服務器進程所用的尋址空間和內存模型。默認情況下,所有在 AIX 上編譯的二進制都是32位。這并不依賴于硬件類型或使用的內核。這些32位進程被限制在 4GB 的內存中,并被使用幾種模型之一安排成 256 MB 的段。該默認值允許在堆中低于 256 MB,因為它和棧共享一個單獨的段。

plperl的例子中,檢查你的 umask 和你的 PostgreSQL 安裝中的二進制的權限。這個例子中涉及的二進制是32位的并且被用模式 750 而不是 755 安裝。由于這種方式的權限設置,只有所有者或擁有組的成員可以載入該庫。因為它不是所有人可讀的,載入器將該對象放在進程的堆中而不是它應該被放入的共享庫段中。

這個問題的理想的解決方案是使用 PostgreSQL 的64位編譯,但是這不是總是實用的,因為有32位處理器的系統(tǒng)可以編譯64位二進制但是卻不能運行它。

如果想要一個 32 位二進制,在開始 PostgreSQL 服務器之前將LDR_CNTRL設置為MAXDATA=0xn 0000000,其中 1 <= n <= 8,并且嘗試不同的值以及postgresql.conf設置來找一個能讓你滿意的配置。這種LDR_CNTRL的使用告訴 AIX 你希望服務器留出MAXDATA字節(jié)給堆,以 256 MB 的段分配。當你找到了一個可工作的配置時,ldedit可以被用來修改二進制,這樣它們默認使用想要的堆尺寸。PostgreSQL 也可以被重新編譯,傳遞configure LDFLAGS="-Wl,-bmaxdata:0xn 0000000"來達到相同的效果。

對于一個 64 位編譯,設置OBJECT_MODE為 64 并且傳遞CC="gcc -maix64"LDFLAGS="-Wl,-bbigtoc"configure(給xlc的選項可能不同)。如果你省略 OBJECT_MODE的輸出,你的編譯可能會因為鏈接器錯誤而失敗。當OBJECT_MODE被設置時,它告訴 AIX 的編譯工具(如ar、asld)默認要處理哪些對象類型。

默認情況下,過量使用頁面空間的情況可能會發(fā)生。不過我們還沒有看到過,當進程用盡內存并且出現了過量使用時 AIX 會殺死進程。我們見到過的最接近于此的是 fork 失敗,其原因是系統(tǒng)覺得已經沒有足夠的內存給另一個進程。和 AIX 的很多其他部分一樣,如果這成為了一個問題,頁面空間分配方法和耗盡內存導致的殺死在系統(tǒng)范圍或進程范圍是可以配置的。

16.7.2. Cygwin

PostgreSQL 可以使用 Cygwin 來編譯,它是用于 Windows 的一個類 Linux 環(huán)境,但是這種方法不如原生 Windows 編譯見第 17 章)并且我們已經不再推薦在 Cygwin 下運行一個服務器。

在從源代碼編譯時,按照UNIX風格安裝過程進行(即./configure; make; 等;只要注意下列 Cygwin 相關的區(qū)別:

  • 將你的路徑設置為使用 Cygwin 的 bin 目錄并且把它放在 Windows 工具的前面。這將幫助避免很多編譯的問題。

  • 不支持adduser命令;使用 Windows NT、2000 或 XP 上的用戶管理應用來替代。否則,跳過這一步。

  • 不支持su命令;在 Windows NT、2000 或 XP 上使用 ssh 來模擬 su。否則,跳過這一步。

  • 不支持 OpenSSL。

  • 為共享內存支持啟動cygserver。要這樣做,輸入命令/usr/sbin/cygserver &。這個程序在你啟動 PostgreSQL 服務器或初始化一個數據集簇(initdb)時的任何時刻都需要被運行。默認的cygserver配置可能需要被更改(例如增加 SEMMNS)來防止 PostgreSQL 因為缺少系統(tǒng)資源而失敗。

  • 在某些不使用 C 區(qū)域的系統(tǒng)上編譯可能會失敗。要修復這個問題,通過在邊以前export LANG=C.utf8把區(qū)域設置為 C,并且在安裝完 PostgreSQL 之后把區(qū)域恢復成之前的設置。

  • 并行回歸測試(make check)可能產生虛假的回歸測試錯誤,這是由于溢出的listen()連接緩沖區(qū),它會導致連接拒絕錯誤或掛起。你可以使用MAX_CONNECTIONS來限制連接數:

    make MAX_CONNECTIONS=5 check
    

    (在某些系統(tǒng)上你可以有大約 10 個同時連接。)

可以把cygserver PostgreSQL 服務器安裝為 Windows NT 服務。關于如何這樣做的信息,請參考包含在 Cygwin 上 PostgreSQL 二進制包中的README文檔。它被安裝在目錄/usr/share/doc/Cygwin中。

16.7.3. macOS

在最新的macOS版本中,有必要將sysroot路徑嵌入用于查找某些系統(tǒng)頭文件的include選項中。這導致configure 腳本的輸出會有所不同,具體取決于在configure期間使用的SDK版本。 在簡單的情況下,這應該不會造成任何問題,但是,如果您要嘗試在與構建服務器代碼不同 的計算機上構建擴展程序,則可能需要強制使用其他sysroot路徑。為此,需要設置 PG_SYSROOT,例如:

make PG_SYSROOT=/desired/path all

要在您的計算機上找到合適的路徑,請運行

xcodebuild -version -sdk macosx Path

請注意,實際上不建議使用與構建核心服務器不同的sysroot版本構建擴展。 在最壞的情況下,它可能導致難以調試的ABI不一致。

您還可以在配置時選擇非默認的sysroot路徑,通過在 configure中指定PG_SYSROOT

./configure ... PG_SYSROOT=/desired/path

macOS系統(tǒng)完整性保護(SIP) 功能破壞了make check,因為它阻止通過 設置所需的DYLD_LIBRARY_PATH傳遞給被測試的可執(zhí)行文件。 您可以通過在make check之前執(zhí)行 make install來解決此問題。     不過,大多數PostgreSQL開發(fā)人員關閉了SIP。

16.7.4. MinGW/原生 Windows

用于 Windows 的 PostgreSQL 可以使用 MinGW 編譯,它是一個用于微軟操作系統(tǒng)的類 Unix 的編譯環(huán)境。也可以使用微軟的Visual C++編譯器套件來編譯。 MinGW 編譯步驟使用本章中描述的正常編譯系統(tǒng);而 Visual C++ 編譯的工作完全不同并且在第 17 章/中描述。

原生 Windows 移植要求一個 Windows 2000 或更高的 32 或 64 位版本。早期的操作系統(tǒng)沒有足夠的基礎設施(但 Cygwin可以用在它們之上)。類 Unix 的編譯工具 MinGW 和 MSYS(一個 Unix 工具集合,用于運行如configure之類的 shell 腳本)可以從http://www.mingw.org/下載。運行結果二進制兩者都需要,它們只在創(chuàng)建二進制時需要。

要使用 MinGW 編譯 64 位二進制,從http://mingw-w64.sourceforge.net/安裝 64 位工具。把它放在PATH中的 bin 目錄,并且使用--host=x86_64-w64-mingw32選項運行 configure.

在你安裝完所有的東西之后,我們建議你在CMD.EXE下運行psql,因為 MSYS 控制臺有緩沖問題。

16.7.4.1. 在 Windows 上收集崩潰轉儲

如果 PostgreSQL 在 Windows 上崩潰,它有能力產生minidumps,這可以被用來追蹤崩潰發(fā)生的原因,這與 Unix 上的核心轉儲相似。這些轉儲可以被使用Windows Debugger ToolsVisual Studio讀取。要啟用在 Windows 上的轉儲生成,可在集簇數據目錄下創(chuàng)建一個名為 crashdumps的子目錄。轉儲將被寫入到這個目錄,轉儲的名字基于崩潰進程的標識符和崩潰的當前時間來確定。

16.7.5. Solaris

PostgreSQL 在 Solaris 上得到了很好的支持。你的操作系統(tǒng)越新,你將會碰到更少的問題。

16.7.5.1. 要求的工具

你可以使用 GCC 或 Sun 的編譯器套件進行編譯。為了更好的代碼優(yōu)化,我們強烈推薦在 SPARC 架構下使用 Sun 的編譯器。如果你正在使用 Sun 的編譯器,注意不要選擇/usr/ucb/cc;而是使用/opt/SUNWspro/bin/cc

你可以從https://www.oracle.com/technetwork/server-storage/solarisstudio/downloads/下載 Sun Studio。很多 GNU 工具都被整合到了 Solaris 10,或者它們在 Solaris companion CD 中。如果你需要用于老版本 Solaris 的包,你可以在http://www.sunfreeware.com找到這些工具。如果你想要源碼,在https://www.gnu.org/prep/ftp上找找。

16.7.5.2. configure 抱怨一個失敗的測試程序

如果configure抱怨一個失敗的測試程序,可能的情況是運行時鏈接器無法找到某些庫,可能是libz、libreadline或某些其他非標準庫如 libssl。要向它指出正確的位置,在configure命令行上設置LDFLAGS環(huán)境變量,例如:

configure ... LDFLAGS="-R /usr/sfw/lib:/opt/sfw/lib:/usr/local/lib"

更多信息可見ld手冊頁。

16.7.5.3. 為最優(yōu)性能編譯

在 SPARC 架構上,我們強烈推薦使用 Sun Studio來編譯。嘗試使用-xO5優(yōu)化標志來生成顯著加快的二進制。不要使用任何修改浮點操作和errno處理(例如-fast)行為的標志。

如果你沒有理由要使用 SPARC 上的 64 位二進制,最好用 32 位版本。64 位操作較慢并且 64 位二進制比其 32 位變體要慢。在另一方面,AMD64 CPU 家族上的32 位代碼不是原生的,所以在那個 CPU 族中 32 位代碼要明顯地更慢。

16.7.5.4. 用 DTrace 來跟蹤 PostgreSQL

是的,可以使用 DTrace。詳見第 27.5 節(jié)。

如果你看到postgres可執(zhí)行程序的鏈接中斷并且報出下面的錯誤消息:

Undefined                       first referenced
 symbol                             in file
AbortTransaction                    utils/probes.o
CommitTransaction                   utils/probes.o
ld: fatal: Symbol referencing errors. No output written to postgres
collect2: ld returned 1 exit status
make: *** [postgres] Error 1

說明你的 DTrace 安裝太舊,無法處理靜態(tài)函數中的探測。你需要 Solaris 10u4 或更新的版本以使用DTrace。


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號