为什么Sempaphores在Linux中受到限制

由于使用了太多的Websphere Message Broker实例或者其他的东西,我们在Linux机器上只用尽了信号量

一个同事,我不禁要问,为什么这是有限的 – 这只是一点记忆,对吧?

我彻底search了一下,什么都没发现。

任何人都知道这是为什么?

干杯

当使用信号量时,需要经常访问,开销非常低。

有一个可扩展的系统,其中每个新请求的信号量结构的内存在运行中分配会导致复杂性,这将减慢对它们的访问,因为它将不得不首先查找当前所讨论的特定信号量的存储位置,存储它的地方,并检查值。 把它们放在一个随手可得的固定存储器的紧凑块中是更容易和更快的。

让它们通过动态分配分散在整个内存中也会使得高效地使用被锁定的内存页面(即在内存要求很高的时候不会被交换出去)更加困难。 内核数据的“锁定”内存页的使用对时间敏感和/或关键内核功能尤其重要。

限制是一个可调参数(请参阅原始问题的注释中的链接),如果需要,可以在运行时通过“昂贵的”重新分配和块重定位来增加限制。 但是,通常这在系统初始化之前完成一次,甚至在使用信号量之前就已经完成了。

也就是说,一个信号集所使用的内存量是相当小的。 由于现代内存在系统中可用的数量是千兆字节,所以对它们的数量的原始默认限制可能看起来有点吝啬。 但是请记住,在很多系统中,信号量很少被用户空间进程所使用,并且linux内核会进入很多小型嵌入式系统,而且内存相当有限,所以如果设置默认的限制,可能会浪费一些。

少数软件包(例如Oracle数据库)依赖于具有多个信号量,通常建议在其安装和/或系统调整建议中增加系统限制。