ulimit 无限堆栈行为奇怪

ulimit 无限堆栈行为奇怪

我正在 Solaris 10 系统上运行一个应用程序。

昨天我们将进程堆栈大小设置为无限制:

ulimit -s unlimited

今天,在加载期间,进程不会报告从 Oracle 数据库加载期间“内存不足”,当堆栈大小再次限制为 8192K 时,进程没有出现任何问题。

Stack Overflow 上有一个关于此的问题:运行具有“无限堆栈”大小的应用程序会产生什么影响?

但我们并没有看到人们所期望的奇怪且通常变化的内存相关问题。

所以有2个问题:

  1. 将 stack 设置为 Unlimited 是否有特定的含义,这将恢复到某些可能低于每个用户当前设置的 ulimit 的系统限制?
  2. 如果没有 root 访问权限,我在哪里可以找到这些限制?

编辑

`isainfo -v

64位sparcv9应用程序vis2 vis

32 位 sparc 应用程序 vis2 vis v8plus div32 mul32`

答案1

查看 pmap 输出的建议将引导您走向正确的方向。您可能需要考虑的一件事是内存碎片 - 如果您停止并启动数据库实例(以及依赖于它的应用程序),应用程序(rdbms 引擎)将进行多次系统调用以请求尽可能多的连续内存。当您的系统存在内存碎片时,需要大量内存的应用程序将难以启动,并且在这种情况下可能会报告 ENOMEM(内存不足)。

您可以使用 DTrace 亲自观察这一点。

Solaris 11、SRU 和更新中对此有一些修复,但我不确定它们是否适用于 Solaris 10。您应该登录到 MOS 并检查 rdbms 页面以了解 Solaris 10 特定的问题。

相关内容