AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 15564
Accepted
archaelus
archaelus
Asked: 2009-05-31 05:09:36 +0800 CST2009-05-31 05:09:36 +0800 CST 2009-05-31 05:09:36 +0800 CST

OS X (10.5) 上指定的默认 ulimit 在哪里?

  • 772

如今,OS X 用户帐户的默认nofile限制似乎是大约 256 个文件描述符。我正在尝试测试一些需要比一次打开更多连接的软件。

在运行 pam 限制模块的典型 Debian 机器上,我会编辑/etc/security/limits.conf为将运行该软件的用户设置更高的限制,但我很困惑在 OS X 中在哪里设置这些限制。

它的某个地方有GUI吗?在某处有配置文件吗?在 OS X 上更改默认 ulimit 的最简洁方法是什么?

mac-osx ulimit
  • 7 7 个回答
  • 31155 Views

7 个回答

  • Voted
  1. Best Answer
    Dave Cheney
    2009-05-31T05:24:28+08:002009-05-31T05:24:28+08:00

    在 Leopard 下,初始过程是launchd. 每个进程的默认 ulimits 继承自launchd. 作为参考,默认(编译)限制是

    $ sudo launchctl limit
        cpu         unlimited      unlimited      
        filesize    unlimited      unlimited      
        data        6291456        unlimited      
        stack       8388608        67104768       
        core        0              unlimited      
        rss         unlimited      unlimited      
        memlock     unlimited      unlimited      
        maxproc     266            532            
        maxfiles    256            unlimited
    

    要更改任何这些限制,请在 中添加一行(您可能需要先创建文件) ,参数与传递给命令/etc/launchd.conf的参数相同。launchctl例如

    echo "limit maxfiles 1024 unlimited" | sudo tee -a /etc/launchd.conf
    

    但是launchd已经启动了你的登录 shell,所以让这些更改生效的最简单方法是重新启动我们的机器。(使用 >> 附加到 /etc/launchd.conf。)

    • 28
  2. kenorb
    2017-07-30T05:48:47+08:002017-07-30T05:48:47+08:00

    壳牌限制

    可用于 shell 和进程的资源可以通过添加到启动脚本的命令进行更改,例如ulimit单个用户~/.bashrc或~/.bash_profile/etc/bashrc所有用户。要添加的示例行:

    ulimit -Sn 4096 && ulimit -Sl unlimited
    

    请参阅:help ulimit以及man bash更多信息。

    系统限制

    一般来说,系统限制是由Launchd框架控制的,可以通过launchctl命令来改变,例如

    launchctl limit maxfiles 10240 unlimited
    

    要使更改持久化,您需要在特定的Launch 兼容文件夹中创建一个属性列表文件,该文件夹充当启动代理。

    以下是创建此类启动文件的示例命令:

    sudo /usr/libexec/PlistBuddy /Library/LaunchAgents/com.launchd.maxfiles.plist -c "add Label string com.launchd.maxfiles" -c "add ProgramArguments array" -c "add ProgramArguments: string launchctl" -c "add ProgramArguments: string limit" -c "add ProgramArguments: string maxfiles" -c "add ProgramArguments: string 10240" -c "add ProgramArguments: string unlimited" -c "add RunAtLoad bool true"

    该文件将在系统启动时加载,但是,加载以手动运行:

    sudo launchctl load /Library/LaunchAgents/com.launchd.maxfiles.plist
    

    要验证当前限制,请运行:launchctl limit。

    请参阅:创建启动守护程序和代理。

    内核限制

    • 内核限制由sysctl命令控制。
    • 要查看当前内核限制,请运行sysctl -a | grep ^kern.max:
    • 要更改允许打开的最大文件数,请运行:sudo sysctl -w kern.maxfiles=20480.
    • 要使更改持久化,请使用与上述类似的方法在系统启动文件夹中创建属性列表文件。

    有关的:

    • 如何在 Mac 上持续控制最大系统资源消耗?
    • 哪个命令控制打开文件的限制?

    已弃用的方法

    在早期版本的 macOS 中,您可以/etc/sysctl.conf像在 Unix 上一样在系统范围内设置这些限制,但是,它似乎不受支持。

    使用~/.launchd.conf或/etc/launchd.conf似乎在任何现有版本的 macOS 中也不支持。维基

    与/etc/rc.local启动文件相同,macOS 不支持。

    • 6
  3. andi
    2013-03-08T22:55:48+08:002013-03-08T22:55:48+08:00
    sudo echo "limit maxfiles 1024 unlimited" >> /etc/launchd.conf
    

    不起作用,因为 sudo 在错误的位置,试试这个:

    echo 'limit maxfiles 10000 unlimited' | sudo tee -a /etc/launchd.conf
    
    • 4
  4. apotek
    2013-08-01T09:36:42+08:002013-08-01T09:36:42+08:00

    在 OS X 上,如果您尝试修改守护程序或进程或任务的软限制,更改这些软限制的正确方法不是更改所有进程的默认启动配置,而是为您所在的进程设置它试图跑。

    这是在您的进程的launchd .plist 文件中完成的。

    如果您有一个守护进程或进程正在运行,您需要为其打开更多文件,请为其创建一个 plist 文件并将这些参数添加到其中:

        <key>SoftResourceLimits</key>
        <dict>
            <key>NumberOfFiles</key>
            <integer>1024</integer>
        </dict>
    

    一个例子,使用 mongodb。我创建了一个名为 org.mongo.mongodb.plist 的 .plist 文件,并将其保存到 /Library/LaunchDaemons/org.mongo.mongodb.plist。该文件如下所示:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
      <key>Disabled</key>
      <false/>
      <key>Label</key>
      <string>org.mongo.mongod</string>
      <key>ProgramArguments</key>
      <array>
        <string>/usr/local/lib/mongodb/bin/mongod</string>
        <string>--dbpath</string>
        <string>/Users/Shared/mongodata/</string>
        <string>--logpath</string>
        <string>/var/log/mongodb.log</string>
      </array>
      <key>QueueDirectories</key>
      <array/>
      <key>RunAtLoad</key>
      <true/>
      <key>UserName</key>
      <string>daemon</string>
      <key>SoftResourceLimits</key>
      <dict>
        <key>NumberOfFiles</key>
        <integer>1024</integer>
        <key>NumberOfProcesses</key>
        <integer>512</integer>
      </dict>
    </dict>
    </plist>
    

    现在您的进程拥有了它需要的资源,而无需与系统的全局配置混为一谈。这将在重新启动时自动设置。或者,如果您不想重新启动,您可以运行

    sudo launchctl load /Library/LaunchDaemons/org.mongod.plist
    

    如果您的进程或任务更像是代理而不是守护进程,则可以将 .plist 放在 /Library/LaunchAgents 中。在这两种情况下,不同的规则适用于 launchd 如何控制您的进程。LaunchDaemons 似乎保留给 launchd 将始终尝试跟上的进程。

    • 3
  5. Xerxes
    2009-05-31T06:18:37+08:002009-05-31T06:18:37+08:00
    % ulimit -a
    core file size          (blocks, -c) 0
    data seg size           (kbytes, -d) 6144
    file size               (blocks, -f) unlimited
    max locked memory       (kbytes, -l) unlimited
    max memory size         (kbytes, -m) unlimited
    open files                      (-n) 2560
    pipe size            (512 bytes, -p) 1
    stack size              (kbytes, -s) 8192
    cpu time               (seconds, -t) unlimited
    max user processes              (-u) 266
    virtual memory          (kbytes, -v) unlimited
    %
    

    现在我必须找出为什么存在两种检查/设置限制的方法......


    好的 - 似乎ulimit并sysctl给出了他们实际上在做某事的假阳性感觉 - 但相反,它们似乎没用。有人可以验证吗?


    好吧,我开始明白了。从 v10.4 开始,init不再有进程,它已被替换为launchd,它也以 PID 为 1 运行。

    % ps -fu root
      UID   PID  PPID   C     STIME TTY           TIME CMD
        0     1     0   0   0:30.72 ??         0:46.72 /sbin/launchd
    

    而且当然值得一提的是,它ulimit是一个shell内置的,launchctl是一个独立于shell的程序。

    • 2
  6. Bil Abbott
    2009-10-23T16:47:31+08:002009-10-23T16:47:31+08:00

    我的经验是,我的高进程计数任务只成功了:

    kern.maxproc=2500  # This is as big as I could set it.
    
    kern.maxprocperuid=2048
    
    ulimit -u 2048
    

    前两个可以进入/etc/sysctl.conf,ulimit 值进入launchd.conf,进行可靠设置。

    由于 tcp/ip 是我正在做的事情的一部分,我还需要提升

    kern.ipc.somaxconn=8192
    

    从默认的 128 开始。

    在我增加进程限制之前,我遇到了“fork”失败,没有足够的资源。在我增加 kern.ipc.somaxconn 之前,我遇到了“断管”错误。

    这是在我的怪物 Mac 上运行相当数量(500-4000)的分离进程时,OS 10.5.7,然后是 10.5.8,现在是 10.6.1。在我老板的计算机上的 Linux 下,它可以正常工作。

    我认为进程的数量会接近 1000,但似乎我开始的每个进程都包括自己的 shell 副本,以及执行实际工作的实际项目。非常喜庆。

    我写了一个展示玩具,类似于:

    #!/bin/sh
    
    while[ 1 ]
    
    do
    
        n=netstat -an | wc -l
    
        nw=netstat -an | grep WAIT | wc -l
    
        p=ps -ef | wc -l
    
        psh=ps -ef | fgrep sh | wc -l
    
        echo "netstat: $n   wait: $nw      ps: $p   sh: $psh"
    
        sleep 0.5
    
    done
    

    并观察了 ps -ef 中的最大进程数,并在 netstat 中等待TIME_WAIT过期......随着限制的提高,我看到了 3500 多个TIME_WAIT项目的峰值。

    在我提高限制之前,我可以“潜入”失败阈值,该阈值开始时低于 1K,但上升到 1190 的高值。每次它被推入失败时,下一次可能需要更多时间,可能是因为某些原因缓存每次失败时都会扩展到其极限。

    尽管我的测试用例有一个“等待”作为它的最终语句,但在它退出后仍然有大量分离的进程在附近徘徊。

    我从互联网上的帖子中获得了我使用的大部分信息,但并非所有信息都是准确的。您的里程可能会有所不同。

    • 1
  7. errant.info
    2012-12-04T04:13:41+08:002012-12-04T04:13:41+08:00

    以下应该解决大多数解决方案(并按其层次结构顺序列出):

    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
    

    笔记:

    1. 您需要重新启动才能使这些更改生效。
    2. AFAIK,您不能再在 OS X 下将限制设置为“无限制”
    3. launchctl maxfiles 受 sysctl maxfiles 限制,因此不能超过它们
    4. sysctl 似乎从 launchctl maxfiles 继承了 kern.maxfilesperproc
    5. 默认情况下,ulimit 似乎从 launchctl 继承了它的“打开文件”值
    6. 您可以在 /etc/profile 或 ~/.profile 中设置自定义 ulimit;虽然这不是必需的,但我提供了一个示例
    7. 与默认值相比,将这些值中的任何一个设置为非常高的数字时要小心 - 这些功能存在稳定性/安全性。我已将这些我认为合理的示例数字写在其他网站上。
    8. 当 launchctl 限制低于 sysctl 限制时,有报道称相关 sysctl 限制会自动增加以满足要求。
    • 1

相关问题

  • Mac OS X:如何在无头机器上运行 GUI 应用程序

  • 全新安装后要安装到 Mac OS X 的程序列表是什么?

  • 多操作系统环境的首选电子邮件客户端

  • 现在从 mac os 在 NTFS 分区上写入是否安全?

  • 最佳混合环境(OS X + Windows)备份?[关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve