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