16.7. 平台特定的 Comments

本节介绍了有关 PostgreSQL 安装和设置的特定于平台的其他问题。请务必阅读安装说明,尤其是Section 16.2。另外,请检查Chapter 32有关回归测试结果的解释。

此处未涵盖的平台没有已知的特定于平台的安装问题。

16.7.1. AIX

PostgreSQL 可在 AIX 上运行,但是正确安装它可能会遇到挑战。认为支持 4.3.3 到 6.1 的 AIX 版本。您可以使用 GCC 或本机 IBM 编译器xlc。通常,使用最新版本的 AIX 和 PostgreSQL 会有所帮助。检查构建服务器场,以获取有关已知可以使用哪个版本的 AIX 的最新信息。

支持的 AIX 版本的最低建议修订级别为:

  • AIX 4.3.3

    • 维护级别 11 ML11Binding 包
  • AIX 5.1

    • 维护级别 9 ML9Binding 包
  • AIX 5.2

    • 技术级别 10 Service Pack 3
  • AIX 5.3

    • 技术等级 7
  • AIX 6.1

    • Base Level

要检查当前的修订级别,请在 AIX 4.3.3 至 AIX 5.2 ML 7 中使用oslevel -r,在更高版本中使用oslevel -s

如果您已经在/usr/local中安装了 Readline 或 libz,请另外使用以下configure标志:--with-includes=/usr/local/include --with-libraries=/usr/local/lib

16 .7.1.1. GCC 问题

在 AIX 5.3 上,使 PostgreSQL 使用 GCC 编译和运行时存在一些问题。

您将要使用 3.3.2 之后的 GCC 版本,尤其是在使用预打包版本的情况下。我们在 4.0.1 上取得了成功。早期版本的问题似乎与 IBM 打包 GCC 的方式有关,而不是与 GCC 的实际问题有关,因此,如果您自己编译 GCC,则早期版本的 GCC 可能会成功。

16 .7.1.2. Unix 域套接字已损坏

AIX 5.3 有一个问题,其中sockaddr_storage没有定义得足够大。在 5.3 版中,IBM 增加了sockaddr_un的大小,这是 Unix 域套接字的地址结构,但没有相应地增加sockaddr_storage的大小。结果是,尝试在 PostgreSQL 上使用 Unix 域套接字会导致 libpq 溢出数据结构。 TCP/IP 连接可以正常运行,但不能使用 Unix 域套接字,因此无法进行回归测试。

该问题已报告给 IBM,并记录为错误报告 PMR29657.如果您升级到维护级别 5300-03 或更高版本,它将包含此修复程序。一种快速的解决方法是将/usr/include/sys/socket.h中的_SS_MAXSIZE更改为 1025.在任何一种情况下,一旦获得正确的头文件,请重新编译 PostgreSQL。

16 .7.1.3. 互联网地址问题

PostgreSQL 依靠系统的getaddrinfo函数来解析listen_addressespg_hba.conf等中的 IP 地址。较旧的 AIX 版本在此函数中存在各种错误。如果您有与这些设置有关的问题,则应更新到上面显示的适当的 AIX 修订级别。

一位用户报告:

在 AIX 5.3 上实现 PostgreSQL 版本 8.1 时,我们经常遇到统计收集器“神秘地”无法成功出现的问题。这似乎是 IPv6 实施中意外行为的结果。看起来 PostgreSQL 和 IPv6 在 AIX 5.3 上不能很好地协同工作。

以下任何操作均可“解决”问题。

  • 删除 localhost 的 IPv6 地址:
(as root)
# ifconfig lo0 inet6 ::1/0 delete
  • 从 Web Service 中删除 IPv6. AIX 上的文件/etc/netsvc.conf与 Solaris/Linux 上的/etc/nsswitch.conf大致相同。因此,AIX 上的缺省值为:
hosts=local,bind

替换为:

hosts=local4,bind4

禁用搜索 IPv6 地址。

Warning

对于与 IPv6 支持不成熟有关的问题,这确实是一种解决方法,该问题在 AIX 5.3 发行过程中得到了明显改善。它已与 AIX 5.3 版一起使用,但不能代表该问题的完美解决方案。据报道,这种解决方法不仅是不必要的,而且会在 AIX 6.1 上引起问题,而 AIX 6.1 的 IPv6 支持已经变得更加成熟。

16 .7.1.4. 内存 Management

关于 AIX 进行内存 Management 的方式,AIX 可能有些特殊。您可以使服务器具有许多 GB 的可用 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 的内存分配都会失败。

所有这些问题的总体原因是服务器进程使用的默认 bittedness 和内存模型。缺省情况下,所有基于 AIX 构建的二进制文件都是 32 位的。这不取决于使用的硬件类型或内核。使用某些模型之一,这些 32 位进程限于 256 MB 段中分配的 4 GB 内存。缺省值允许堆中的内存少于 256 MB,因为它与堆栈共享一个段。

对于上面的plperl示例,请检查您的 umask 和 PostgreSQL 安装中二进制文件的权限。该示例中涉及的二进制文件是 32 位的,并以 750 模式而不是 755 模式安装。由于以这种方式设置了权限,因此只有所有者或拥有组的成员才能加载该库。由于它不是世界可读的,因此加载程序将对象放置到进程的堆中,而不是将共享库段放置到其他地方。

解决此问题的“理想”解决方案是使用 PostgreSQL 的 64 位构建,但这并不总是可行的,因为具有 32 位处理器的系统可以构建但不能运行 64 位二进制文件。

如果需要 32 位二进制文件,请在启动 PostgreSQL 服务器之前将LDR_CNTRL设置为MAXDATA=0xn0000000,其中 1 <= n <= 8,然后尝试使用其他值和postgresql.conf设置来找到令人满意的配置。 LDR_CNTRL的这种用法告诉 AIX 您希望服务器为堆预留MAXDATA个字节,并以 256 MB 的段分配。找到可行的配置后,可以使用ldedit修改二进制文件,以便它们默认使用所需的堆大小。也可以通过传递configure LDFLAGS="-Wl,-bmaxdata:0xn0000000"来重建 PostgreSQL,以达到相同的效果。

对于 64 位版本,请将OBJECT_MODE设置为 64,并将CC="gcc -maix64"LDFLAGS="-Wl,-bbigtoc"传递给configure。 (xlc的选项可能有所不同.)如果省略OBJECT_MODE的导出,则构建可能会因链接器错误而失败。设置OBJECT_MODE时,它会告诉 AIX 的构建 Util(例如arasld)默认要处理的对象类型。

默认情况下,会发生调页空间的过量使用。虽然我们还没有看到这种情况发生,但是当 AIX 内存不足并且访问了过量使用时,AIX 将终止进程。我们所看到的最接近的情况是 fork 失败,因为系统认为没有足够的内存用于另一个进程。像 AIX 的许多其他部分一样,如果这成为问题,则可以在系统级或进程级的基础上配置调页空间分配方法和内存不足终止。

参考资料和资源

大程序支持”。 * AIX 文档:通用编程概念:编写和调试程序*。

程序地址空间概述”。 * AIX 文档:通用编程概念:编写和调试程序*。

虚拟内存 Management 器(VMM)的性能概述”。 * AIX 文档:性能 Management 指南*。

页面空间分配”。 * AIX 文档:性能 Management 指南*。

分页空间阈值调整”。 * AIX 文档:性能 Management 指南*。

16.7.2. Cygwin

可以使用 Cygwin 构建 PostgreSQL,Cygwin 是 Windows 的类似 Linux 的环境,但是该方法不如 Windows 本机 Windows 构建(请参见Chapter 17),并且不再建议在 Cygwin 下运行服务器。

从源代码进行构建时,请遵循正常的安装过程(即./configure; make等),并注意以下与 Cygwin 特定的区别:

  • 在 WindowsUtil 之前,将路径设置为使用 Cygwin bin 目录。这将有助于防止编译问题。

  • 不支持adduser命令;在 Windows NT,2000 或 XP 上使用适当的用户 Management 应用程序。否则,请跳过此步骤。

  • 不支持su命令;使用 ssh 在 Windows NT,2000 或 XP 上模拟 su。否则,请跳过此步骤。

  • 不支持 OpenSSL。

  • cygserver开始获得共享内存支持。为此,Importing 命令/usr/sbin/cygserver &。每当您启动 PostgreSQL 服务器或初始化数据库集群(initdb)时,都需要运行该程序。可能需要更改默认的cygserver配置(例如,增加SEMMNS),以防止 PostgreSQL 因缺少系统资源而失败。

  • 在某些使用非 C 语言环境的系统上,构建可能会失败。要解决此问题,请在构建 PostgreSQL 之前先执行export LANG=C.utf8,然后在安装 PostgreSQL 之后将其设置回先前的设置,以将语言环境设置为 C。

  • 并行回归测试(make check)可能会由于listen()待办事项队列溢出而生成虚 Pseudo 回归测试失败,从而导致连接拒绝错误或挂起。您可以使用 make 变量MAX_CONNECTIONS来限制连接数,因此:

make MAX_CONNECTIONS=5 check

(在某些系统上,您最多可以同时构建 10 个连接)。

可以将cygserver和 PostgreSQL 服务器安装为 Windows NT 服务。有关如何执行此操作的信息,请参考 Cygwin 上 PostgreSQL 二进制软件包随附的README文档。它安装在目录/usr/share/doc/Cygwin中。

16.7.3. HP-UX

给定适当的系统补丁程序级别和构建工具,PostgreSQL 7.3 应该可以在运行 HP-UX 10.X 或 11.X 的 700/800 系列 PA-RISC 计算机上运行。至少有一个开发人员在 HP-UX 10.20 上进行例行测试,并且我们收到在 HP-UX 11.00 和 11.11 上成功安装的报告。

除了 PostgreSQL 源代码发行版之外,您还需要 GNU make(HP 的 make 不会这样做),以及 GCC 或 HP 的完整 ANSI C 编译器。如果您打算从 Git 来源而不是分发 tarball 进行构建,则还需要 Flex(GNU lex)和 Bison(GNU yacc)。我们还建议确保您对 HP 补丁程序保持最新。至少,如果要在 HP-UX 11.11 上构建 64 位二进制文件,则可能需要 PHSS_30966(11.11)或后续补丁程序,否则initdb可能会挂起:

PHSS_30966 s700_800 ld(1)和链接器工具累积修补程序

一般原则上,您应该使用 libc 和 ld/dld 补丁,如果使用 HP 的 C 编译器,则应该是编译器补丁。请访问惠普的支持网站,例如ftp://us-ffs.external.hp.com/,以获取其最新补丁程序的免费副本。

如果要在 PA-RISC 2.0 计算机上构建,并且要使用 GCC 使用 64 位二进制文件,则必须使用 GCC 64 位版本。

如果要在 PA-RISC 2.0 计算机上构建,并且希望编译的二进制文件在 PA-RISC 1.1 计算机上运行,则需要在CFLAGS中指定+DAportable

如果要在 HP-UX Itanium 计算机上构建,则将需要最新的 HP ANSI C 编译器及其相关补丁或后续补丁:

PHSS_30848 s700_800 HP C 编译器(A.05.57)
PHSS_30849 s700_800 u2comp/be/plugin 库补丁

如果您同时拥有 HP 的 C 编译器和 GCC 的编译器,则可能需要在运行configure时显式选择要使用的编译器:

./configure CC=cc

用于 HP 的 C 编译器,或

./configure CC=gcc

对于 GCC。如果省略此设置,则 configure 会选择gcc(如果可以选择)。

默认的安装目标位置是/usr/local/pgsql,您可能希望将其更改为/opt下的名称。如果是这样,请使用--prefix切换到configure

在回归测试中,几何测试中可能存在一些低位数字差异,具体取决于您使用的编译器和 math 库版本。任何其他错误都值得怀疑。

16.7.4. macOS

在最新的 macOS 发行版中,有必要将“ sysroot”路径嵌入用于查找某些系统头文件的 include 开关中。这导致配置脚本的输出根据配置期间使用的 SDK 版本而有所不同。在简单的情况下,这应该不会造成任何问题,但是,如果您要尝试在与构建服务器代码不同的计算机上构建扩展,例如可能需要强制使用其他 sysroot 路径。为此,请设置PG_SYSROOT,例如

make PG_SYSROOT=/desired/path all

要在您的计算机上找到合适的路径,请运行

xcodebuild -version -sdk macosx Path

请注意,实际上不建议使用与构建核心服务器不同的 sysroot 版本构建扩展。在最坏的情况下,它可能导致难以调试的 ABI 不一致。

您还可以在配置时通过指定PG_SYSROOT来选择非默认的 sysroot 路径:

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

macOS 的“系统完整性保护”(SIP)功能破坏了make check,因为它阻止了将所需的DYLD_LIBRARY_PATH设置传递给正在测试的可执行文件。您可以通过在make check之前执行make install来解决此问题。不过,大多数 Postgres 开发人员只是关闭了 SIP。

16 .7.5. MinGW /本机 Windows

可以使用 MinGW(适用于 Microsoftos 的类似于 Unix 的构建环境)或使用 Microsoft 的 Visual C 编译器来构建 Windows 的 PostgreSQL。 MinGW 构建变体使用本章中描述的常规构建系统。 Visual C 构建的工作原理完全不同,并在Chapter 17中进行了描述。这是一个完全本机的版本,不使用 MinGW 等其他软件。可以在 PostgreSQL 主网站上找到现成的安装程序。

本机 Windows 端口需要 32 位或 64 位版本的 Windows 2000 或更高版本。较早的 os 没有足够的基础架构(但可以在其上使用 Cygwin)。可以从http://www.mingw.org/下载 MinGW(类似于 Unix 的构建工具)和 MSYS(运行configure之类的 Shell 脚本所需的一系列 Unix 工具)。运行生成的二进制文件都不需要;仅在创建二进制文件时才需要它们。

要使用 MinGW 构建 64 位二进制文件,请从http://mingw-w64.sourceforge.net/安装 64 位工具集,将其 bin 目录放在PATH中,然后使用--host=x86_64-w64-mingw32选项运行configure

安装完所有组件后,建议您在CMD.EXE下运行 psql,因为 MSYS 控制台存在缓冲问题。

16 .7.5.1. 在 Windows 上收集故障转储

如果 Windows 上的 PostgreSQL 崩溃,它具有生成小型转储的功能,该转储可用于跟踪崩溃的原因,类似于 Unix 上的核心转储。可以使用 Windows 调试器工具或 Visual Studio 读取这些转储。要在 Windows 上启用转储生成,请在群集数据目录中创建一个名为crashdumps的子目录。然后,将基于崩溃过程的标识符和崩溃的当前时间,使用唯一的名称将转储写入此目录。

16.7.6. Solaris

PostgreSQL 在 Solaris 上得到了很好的支持。您的 os 更新得越多,遇到的问题就越少;详细信息如下。

16 .7.6.1. 必备工具

您可以使用 GCC 或 Sun 的编译器套件进行构建。为了更好的代码优化,强烈建议在 SPARC 体系结构上使用 Sun 的编译器。我们听说过使用 GCC 2.95.1 时出现问题的报告;建议使用 GCC 2.95.3 或更高版本。如果使用的是 Sun 的编译器,请注意不要选择/usr/ucb/cc。使用/opt/SUNWspro/bin/cc

您可以从http://www.oracle.com/technetwork/server-storage/solarisstudio/downloads/下载 Sun Studio。许多 GNU 工具已集成到 Solaris 10 中,或者它们在 Solaris 随附 CD 中提供。如果您喜欢旧版本 Solaris 的软件包,可以在http://www.sunfreeware.com找到这些工具。如果您喜欢来源,请查看http://www.gnu.org/order/ftp.html

16 .7.6.2. 配置有关失败的测试程序的投诉

如果configure抱怨测试程序失败,则可能是运行时链接程序无法找到某些库(可能是 libz,libreadline 或其他非标准库,例如 libssl)的情况。要将其指向正确的位置,请在configure命令行上设置LDFLAGS环境变量,例如,

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

有关更多信息,请参见 ld 手册页。

16 .7.6.3. 64 位版本有时会崩溃

在 Solaris 7 和更早版本上,64 位版本的 libc 具有一个有问题的vsnprintf例程,这导致 PostgreSQL 中的核心转储不稳定。已知的最简单的解决方法是强制 PostgreSQL 使用自己的vsnprintf版本而不是库副本。为此,在运行configure之后,编辑configure生成的文件:在src/Makefile.global中,更改行

LIBOBJS =

to read

LIBOBJS = snprintf.o

(此变量中可能已经列出了其他文件.Sequences 无关紧要.)然后照常进行构建。

16 .7.6.4. 编译以获得最佳性能

在 SPARC 体系结构上,强烈建议对 Sun Studio 进行编译。尝试使用-xO5优化标志来生成明显更快的二进制文件。请勿使用任何修改浮点运算和errno处理行为的标志(例如-fast)。这些标志可能会引发一些非标准的 PostgreSQL 行为,例如在日期/时间计算中。

如果没有理由在 SPARC 上使用 64 位二进制文件,请选择 32 位版本。与 32 位变体相比,64 位操作更慢,而 64 位二进制文件则更慢。另一方面,AMD64 CPU 系列上的 32 位代码不是本地的,这就是为什么 32 位代码在该 CPU 系列上明显慢的原因。

16 .7.6.5. 使用 DTrace 跟踪 PostgreSQL

是的,可以使用 DTrace。有关更多信息,请参见Section 28.5

如果您看到postgres可执行文件中止的链接,并显示以下错误消息:

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 安装太旧,无法处理静态功能中的探针。您需要 Solaris 10u4 或更高版本。