欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

平台相关说明:16.7.解读平台的相关信息

最编程 2024-01-01 22:55:40
...

16.7.1.4. 内存管理

AIX 的特别之处在于它的内存管理。你可能有一个装备有好多个吉字节空闲 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位处理器的系统可以编译64位二进制但是却不能运行它。

如果想要一个 32 位二进制,在开始 PostgreSQL 服务器之前将LDR_CNTRL设置为MAXDATA=0xn0000000,其中 1 <= n <= 8,并且尝试不同的值以及postgresql.conf设置来找一个能让你满意的配置。这种LDR_CNTRL的使用告诉 AIX 你希望服务器留出MAXDATA字节给堆,以 256 MB 的段分配。当你找到了一个可工作的配置时,ldedit可以被用来修改二进制,这样它们默认使用想要的堆尺寸。PostgreSQL 也可以被重新编译,传递configure LDFLAGS="-Wl,-bmaxdata:0xn0000000"来达到相同的效果。

对于一个 64 位编译,设置OBJECT_MODE为 64 并且传递CC="gcc -maix64"LDFLAGS="-Wl,-bbigtoc"configure(给xlc的选项可能不同)。如果你省略OBJECT_MODE的输出,你的编译可能会因为链接器错误而失败。当OBJECT_MODE被设置时,它告诉 AIX 的编译工具(如arasld)默认要处理哪些对象类型。

默认情况下,过量使用页面空间的情况可能会发生。不过我们还没有看到过,当进程用尽内存并且出现了过量使用时 AIX 会杀死进程。我们见到过的最接近于此的是 fork 失败,其原因是系统觉得已经没有足够的内存给另一个进程。和 AIX 的很多其他部分一样,如果这成为了一个问题,页面空间分配方法和耗尽内存导致的杀死在系统范围或进程范围是可以配置的。

参考和资源

Large Program Support”. AIX Documentation: General Programming Concepts: Writing and Debugging Programs.

Program Address Space Overview”. AIX Documentation: General Programming Concepts: Writing and Debugging Programs.

Performance Overview of the Virtual Memory Manager (VMM)”. AIX Documentation: Performance Management Guide.

Page Space Allocation”. AIX Documentation: Performance Management Guide.

Paging-space thresholds tuning”. AIX Documentation: Performance Management Guide.

Developing and Porting C and C++ Applications on AIX. IBM Redbook.

推荐阅读