为什么在Linux中信号量受限?

8

由于使用了太多的Websphere Message Broker实例或其他原因,我们的Linux服务器上的信号量已经用完。

我和一位同事都想知道为什么会有这种限制 - 这只是一小部分内存,对吧?

我已经认真地搜索过但没有找到答案。

有人知道是什么原因吗?

谢谢。


也许值得在Unix&Linux Stackexchange上询问。我对答案很感兴趣 :-) - Daniel W.
2
信号量的数量默认为128,但这不是一个固定值,可以在运行时更改。请参见Unix&Linux中的此问题 - user2845360
1
这只是一点内存,但这一点位于内核的内存空间中。您希望将其尽可能保持小;您不希望一个进程因为创建了比您的内存更多的信号量而导致系统崩溃。 - chepner
您可以使用 sysctl 命令来增加数字...例如: sysctl -A | grep kernel.sem - Mark Setchell
1个回答

4
当使用信号量时,需要频繁访问并保持非常低的开销。如果为每个新请求的信号量结构分配内存,则会引入复杂性,从而降低对它们的访问速度,因为它必须首先查找当前所需的特定信号量存储的位置,然后获取存储它的内存并检查其值。将它们保存在一个紧凑的固定内存块中更容易且更快速。
通过动态分配将它们分散在整个内存中,也会使有效利用被锁定的内存页(即在内存需求高时无法交换出去的内存页)变得更加困难。对于时间敏感和/或关键的内核函数,使用“锁定”的内存页来存储内核数据尤其重要。
将限制设为可调参数(请参见原问题评论中的链接)允许在运行时通过“昂贵”的重新分配和重定位块来增加它。但通常,在任何东西使用信号量之前,在系统初始化时仅进行一次这样的操作。
话虽如此,信号量集使用的内存量相当微小。随着现代系统上可用的内存达到数十亿字节,原始默认限制数量可能看起来有点吝啬。但请记住,在许多系统上,用户空间进程很少使用信号量,并且Linux内核被用于许多具有相当有限内存的小型嵌入式系统中,因此在可能被使用的情况下将默认限制设置得过高似乎是浪费的。
少数软件包(例如Oracle数据库)确实依赖于可用的许多信号量,通常建议在安装和/或系统调整建议中增加系统限制。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接