我们的服务器最近用完了文件描述符,对此我有一些疑问。ulimit -n应该给我最大数量的打开文件描述符。这个数字是 1024。我通过运行检查了打开的文件描述符的数量,lsof -u root |wc -l得到了 2500 个 fds。这比 1024 多得多,所以我猜这意味着数字 1024 是每个进程,而不是每个用户,就像我一样。好吧,我跑了lsof -p$PidOfGlassfish|wc -l,得到了 1300。这是我没有得到的部分。如果ulimit -n不是每个用户或每个进程的最大进程数,那么它有什么用?它不适用于root用户吗?如果是这样,我怎么能得到关于文件描述符用完的错误消息?
编辑:我能理解的唯一方法ulimit -n是它是否应用打开文件的数量(如 bash 手册中所述)而不是文件句柄的数量(不同的进程可以打开同一个文件)。如果是这种情况,那么仅列出打开文件的数量(grepping '/',从而排除内存映射文件)是不够的:
lsof -u root |grep /|sort -k9 |wc -l #prints '1738'
Run Code Online (Sandbox Code Playgroud)
要实际查看打开文件的数量,我需要对名称列进行过滤,仅打印唯一条目。因此,以下可能更正确:
lsof -u root |grep /|sort -k9 -u |wc -l #prints '604'
Run Code Online (Sandbox Code Playgroud)
上面的命令需要 lsof 以以下格式输出:
java 32008 root mem REG 8,2 11942368 72721 /usr/lib64/locale/locale-archive
vmtoolsd 4764 root mem REG 8,2 18624 106432 /usr/lib64/open-vm-tools/plugins/vmsvc/libguestInfo.so
Run Code Online (Sandbox Code Playgroud)
这至少给了我小于 …
我在 Azure 上运行的 Ubuntu 虚拟机上运行各种服务,我想远程访问某些服务,即使端口没有公开开放。为此,我设置了一个脚本来使用 SSH进行本地端口转发。
通常这是通过启动到远程主机的连接,执行sleep 10,并在 sleep 命令完成之前在转发的端口上建立连接来工作的。这在使用保持连接活动的服务时很有效,例如远程 SMB 共享。
但是我在访问 Web 服务时遇到问题,因为连接在一段时间后关闭 - 建立连接后 10-90 秒。
为了在它关闭时重新连接连接,我根据这个SO 线程编写了这个小脚本。
while true; do { \
while true; do \
echo echo ping; sleep 10; \
done } | ssh -f myapp.cloudapp.net -F .ssh/myapp.cloudapp.net_config \
-o ExitOnForwardFailure=yes sleep 10; echo "$(date) I died";
sleep 1;
done
Run Code Online (Sandbox Code Playgroud)
不幸的是,这个“修复”有点不稳定,并且连接经常断开,因此浏览器每五个请求就会挂起。它有效,但远非完美,所以我想要一个更好的方法。也许可能有某种脚本进行长轮询之类的?有谁解决了这个问题?