Os x终端,ssh和太多打开的文件

时间:2012-04-10 20:14:29

标签: macos solr ssh terminal

大家好:我有一些代码可以通过ssh转发到AWS机器的连接运行多个休息查询(fyi:这些查询正在点击在这台机器上运行的Solr服务器),并且查询针对我的localhost运行(转发到AWS实例)。

代码最初在必要时运行得很好,但运行了一段时间后,代码停止了(在eclipse中)。

在这个确切的时刻,终端(即我开始使用ssh隧道的地方)完全冻结,填满了字符串:

“接受:打开的文件过多”

因为这个无限的打印不与bash终端相关联(即我无法告诉ssh连接是否仍然存在,并且没有文本指示哪个shell进入...只是未经打击,无情的打印语句我不能告诉它是来自亚马逊,还是来自我的客户终端。

我想找到导致此行为的原因并查明造成我的终端爆炸的机器

为了测试两台机器中的哪一台导致错误的无限打印,我在服务器上运行了ulimit命令...并且发现允许打开文件的最大数量(在aws服务器上)在客户端程序(从我的ide运行)执行时,在任何给定时间远远高于打开文件的数量(也使用ulimit确定)。

我在我的客户端上进行了相同的测试,发现打开文件的数量没有显着增加。

一些侧面细节:我正在向SOLR服务器运行数百个查询,该服务器在短时间内拥有超过100GB的数据。

关于如何确定我的sshd mac os x终端死亡和无限打印此消息的任何提示对我来说可能非常有用。当然,无论有没有,他们都是solr特有的。也就是说,对使用solr服务时会发生这种情况的任何见解也可以帮助解决这个问题。

5 个答案:

答案 0 :(得分:13)

您可以尝试查看ulimit(通过终端类型):

ulimit -a

具体来说,检查open files的值。在我的机器(OS X)上,它报告256.您可能想尝试将其增加到512:

ulimit -n 512

答案 1 :(得分:6)

这似乎对我有用:

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

答案 2 :(得分:3)

这里没有足够的信息可以确定,但听起来ssh在尝试接受本地转发套接字的连接时达到了每个进程的文件描述符限制,这反过来表明已经打开连接没有及时关闭。您可以使用ssh运行-d以查看连接和断开连接的详细信息;您可能希望捕获其stderr并使用脚本来跟踪套接字操作,因为它们将被隐藏在许多其他调试信息中。

请注意,ssh本身可能会将其打开的文件描述符限制在默认值之外,以避免对其转发端口的拒绝服务攻击;我在文档中没有看到任何迹象,但这是我期望的那种。

答案 3 :(得分:0)

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

注意 - 选择自行承担风险的号码

答案 4 :(得分:0)

以下命令帮助了我

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDBPDO";

try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // set the PDO error mode to exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // prepare sql and bind parameters
    $stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) 
    VALUES (:firstname, :lastname, :email)");
    $stmt->bindParam(':firstname', $firstname);
    $stmt->bindParam(':lastname', $lastname);
    $stmt->bindParam(':email', $email);

    // insert a row
    $firstname = "John";
    $lastname = "Doe";
    $email = "john@example.com";
    $stmt->execute();

    // insert another row
    $firstname = "Mary";
    $lastname = "Moe";
    $email = "mary@example.com";
    $stmt->execute();

    // insert another row
    $firstname = "Julie";
    $lastname = "Dooley";
    $email = "julie@example.com";
    $stmt->execute();

    echo "New records created successfully";
    }
catch(PDOException $e)
    {
    echo "Error: " . $e->getMessage();
    }
$conn = null;
?>