我运行一个软件测试服务器,该服务器依赖于大量使用队列(POSIX 消息队列)。我将限制增加到合理的水平,并在很久以前就开始工作了。然而,测试(及其 mqueues)的数量不断增加,并且测试在创建新 mqueues 时开始失败,尽管限制似乎并未耗尽。
$ cat /proc/sys/fs/mqueue/queues_max # maximum mqueue count
65535
$ sudo mount -t mqueue none /mnt
$ ls -1 /mnt | wc -l # current mqueue count
8445
$ ulimit -q # maximum bytes in mqueues
819200
$ du -s /mnt # current mqueues size
0 /mnt
呼叫失败后mq_open()
,errno
设置为 24,这意味着(根据/usr/include/asm-generic/errno-base.h
):
#define EMFILE 24 /* Too many open files */
因此我检查了打开文件的限制,但似乎也没有耗尽。
$ ulimit -n # file descriptors limit
1024
$ lsof -u $(whoami) | wc -l # currently open files
306
这些检查是否正确?还有什么我应该检查的吗?
我看过如何检查 ulimit 使用情况但使用检查似乎特定于特定限制,并且那里没有提到 mqueues。
由于 mqueues 的行为随着时间的推移而发生变化虫子,我的内核版本是4.1.13-rt15+
.我自己使用适当的方法构建了内核实时补丁无需进一步修改。我最近没有切换内核(当问题开始出现时)。