os x 终端、ssh 和太多打开的文件
Posted
技术标签:
【中文标题】os x 终端、ssh 和太多打开的文件【英文标题】:Os x terminal, ssh , and too many open files 【发布时间】:2012-04-23 03:49:27 【问题描述】:我有一些代码通过 ssh 转发到 AWS 机器的连接运行多个 rest 查询(仅供参考:这些查询正在访问运行在这台机器上的 Solr 服务器),并且查询针对我的 localhost(转发到 AWS 实例)。
代码最初运行良好,可以根据需要获取数据,但运行一段时间后,代码停止(在 Eclipse 中)。
此时,终端(即我启动 ssh 隧道的位置)完全冻结,充满了字符串:
“接受:打开的文件太多”
因为这个无限打印与 bash 终端无关(即我无法判断 ssh 连接是否仍然存在,并且没有文本指示我在哪个 shell... ) 我不知道它是来自亚马逊还是来自我的客户端。
我想找出导致此行为的原因并查明导致我的终端爆炸的机器
为了测试两台机器中的哪一台导致了错误的无限打印,我在服务器上运行了 ulimit 命令...并发现 允许的最大打开文件数(在 aws 服务器上)在客户端程序(从我的 ide 运行) 正在执行时,在任何给定时间都远高于打开文件的数量(也使用 ulimit 确定)。
我在客户端上做了同样的测试,发现打开文件的数量没有明显增加。
一些细节:我在短时间内对拥有超过 100GB 数据的 SOLR 服务器运行数百个查询。
任何提示如何确定为什么我的 sshd mac os x 终端正在死机并无限打印此消息可能对我非常有用。当然,无论它们是否特定于 solr。也就是说,任何关于使用 solr 服务时为什么会发生这种情况的见解也可能有助于解决这个问题。
【问题讨论】:
【参考方案1】:您可以尝试查看ulimit
(通过终端类型):
ulimit -a
具体来说,检查open files
的值。在我的机器 (OS X) 上,它报告 256。您可能想尝试将其增加到 512:
ulimit -n 512
【讨论】:
您可能需要为运行 SOLR 的用户执行此操作,例如作为tomcat。 我必须为每个运行需要更多文件的程序的 bash 实例执行此操作。【参考方案2】:这似乎对我有用:
echo 'kern.maxfiles=20480' | sudo tee -a /etc/sysctl.conf
echo -e 'limit maxfiles 8192 20480\nlimit maxproc 1000 2000' | sudo tee -a /etc/launchd.conf
echo 'ulimit -n 4096' | sudo tee -a /etc/profile
然后重新启动 OS X。
https://superuser.com/questions/302754/increase-the-maximum-number-of-open-file-descriptors-in-snow-leopard
【讨论】:
【参考方案3】:这里没有足够的信息可以确定,但听起来ssh
在尝试在本地接受到转发套接字的连接时达到了其每个进程的文件描述符限制,这反过来表明已经打开的连接是没有及时关闭。您可以运行ssh
和-d
以查看连接和断开连接的详细信息;您可能想要捕获它的 stderr 并使用脚本来跟踪套接字操作,因为它们会隐藏在许多其他调试信息中。
请注意,ssh
本身可能会限制其打开的文件描述符超出默认值,以避免对其转发端口的拒绝服务攻击;我在文档中没有看到任何迹象,但这是我所期望的。
【讨论】:
这是唯一有解释的回复。【参考方案4】:sudo launchctl limit maxfiles 1000000 unlimited
或
sudo sysctl -w kern.maxfilesperproc=1000000
sudo sysctl -w kern.maxfilesperproc=18000
要使更改永久生效,请使用 sudo 将您的设置放入 /etc/sysctl.conf(您可能需要创建),如下所示:
kern.maxfiles=20480
kern.maxfilesperproc=18000
注意 - 选择号码需要您自担风险
【讨论】:
【参考方案5】:以下命令帮助了我,
launchctl limit maxfiles
【讨论】:
以上是关于os x 终端、ssh 和太多打开的文件的主要内容,如果未能解决你的问题,请参考以下文章
使用Mac OS X 终端 SSH 登录远程LINUX服务器
如何使用 SSH 和 MAC OS X 终端跨计算机复制文件 [关闭]
用 Mac OS X 自带的 SSH 登陆 Linux 后出现中文乱码,如何解决?