OS X 下 Leopard, Yosemite 版本的操作系统下, 修改 ulimit 命令默认的程序是 launchd.
默认的 ulimit 命令继承自 launchd, 默认的 limits 参数如下:
- daviddeMacBook-Pro:etc david$ sudo launchctl limit
- Password:
- CPU unlimited unlimited
- filesize unlimited unlimited
- data unlimited unlimited
- stack 8388608 67104768
- core 0 unlimited
- rss unlimited unlimited
- memlock unlimited unlimited
- maxproc 709 1064
- maxfiles 256 unlimited
如果因为如 socket 连接数过小等原因, 需要修改 ulimit 相关参数, 可以按照如下方式操作:
1. 在 /etc/launchd.conf(如无, 需用拥有 root 权限的账户创建) 文件中, 增加这一行:
echo "limit maxfiles 65535 unlimited" | sudo tee -a /etc/launchd.conf
tee 命令是等待用户输入, 并将输入写入到指定文件中, -a 参数表示添加方式为 "追加".
2. 在本次会话中, lanuchd 命令已经启动了; 如果想让配置在任何用户任何会话中都生效, 最简单的方式就只需要重启一下 server.
如果还需要修改其他参数, 只需要使用>> 命令追加到 /etc/launchd.conf 文件中即可.
注:
1. 上面
65535 unlimited
这 2 个参数即是设置 soft 和 hard 值.
2.Linux 发行版 RedHat/CentOS 配置与 OS X 不同, 如下:
- vi /etc/security/limits.conf
- # noproc 进程数, nofile 文件打开数
- # soft 软限制, 在程序的进程中可自行改变.
- # hard 硬限制, 程序不可随意改变, 除非有 root 权限.
- * soft noproc 11000
- * hard noproc 11000
- * soft nofile 4100
- * hard nofile 4100
超过系统最大文件打开数之后, 系统报 too many open files
1. 查看限制:
ulimit -a
2. 创建新的配置文件, 配置系统打开最多文件限制(如果没有的话)
sudo vi /Library/LaunchDaemons/limit.maxfiles.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>
- Label
- </key>
- <string>
- limit.maxfiles
- </string>
- <key>
- ProgramArguments
- </key>
- <array>
- <string>
- launchctl
- </string>
- <string>
- limit
- </string>
- <string>
- maxfiles
- </string>
- <string>
- 655360
- </string>
- <string>
- 655360
- </string>
- </array>
- <key>
- RunAtLoad
- </key>
- <true/>
- <key>
- ServiceIPC
- </key>
- <false/>
- </dict>
- </plist>
3. 创建每个最大进程数限制的配置文件
sudo vi /Library/LaunchDaemons/limit.maxproc.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>
- Label
- </key>
- <string>
- limit.maxproc
- </string>
- <key>
- ProgramArguments
- </key>
- <array>
- <string>
- launchctl
- </string>
- <string>
- limit
- </string>
- <string>
- maxproc
- </string>
- <string>
- 2048
- </string>
- <string>
- 2048
- </string>
- </array>
- <key>
- RunAtLoad
- </key>
- <true />
- <key>
- ServiceIPC
- </key>
- <false />
- </dict>
- </plist>
4. 以上两个文件 需要 owned by root:wheel
- chown root:wheel /Library/LaunchDaemons/limit.maxproc.plist
- chown root:wheel /Library/LaunchDaemons/limit.maxproc.plist
读写权限:-rw-r--r--
执行 ulimit -a
下面的参数应该是 MacOS 的默认参数
- core file size (blocks, -c) 0
- data seg size (kbytes, -d) unlimited
- file size (blocks, -f) unlimited
- max locked memory (kbytes, -l) unlimited
- max memory size (kbytes, -m) unlimited
- open files (-n) 256
- pipe size (512 bytes, -p) 1
- stack size (kbytes, -s) 8192
- CPU time (seconds, -t) unlimited
- max user processes (-u) 709
- virtual memory (kbytes, -v) unlimited
5. 执行 launchctl limit 是配置生效. 也许需要重启电脑(本人系统需要, OS X 10.10.3)
ulimit -a
修改后的参数如下
- core file size (blocks, -c) 0
- data seg size (kbytes, -d) unlimited
- file size (blocks, -f) unlimited
- max locked memory (kbytes, -l) unlimited
- max memory size (kbytes, -m) unlimited
- open files (-n) 655360
- pipe size (512 bytes, -p) 1
- stack size (kbytes, -s) 8192
- CPU time (seconds, -t) unlimited
- max user processes (-u) 2048
- virtual memory (kbytes, -v) unlimited
6. 打开端口后限制
查看 socket 端口范围限制
- sysctl -a | grep port
- kern.ds_supgroups_supported: 1
- kern.ipc_portbt: 0
- kern.hv_support: 1
- vfs.generic.nfs.client.callback_port: 0
- vfs.generic.nfs.server.require_resv_port: 0
- vfs.generic.nfs.server.export_hash_size: 64
- net..NET.ip.portrange.lowfirst: 1023
- net..NET.ip.portrange.lowlast: 600
- net..NET.ip.portrange.first: 1024
- net..NET.ip.portrange.last: 65535
- net..NET.ip.portrange.hifirst: 49152
- net..NET.ip.portrange.hilast: 65535
- net..NET.tcp.randomize_ports: 0
- net..NET.udp.randomize_ports: 1
- net..NET.ipsec.esp_port: 4500
- machdep.misc.fast_uexc_support: 1
系统默认端口打开范围大小只有大概 1500 个,
修改办法:
打开 (没有就创建) 文件 /etc/sysctl.conf
sudo vi /etc/sysctl.conf
添加以下两行:
- net..NET.ip.portrange.first=1024
- net..NET.ip.portrange.last=65535
第一行指定最小端口, 低于 1024 的端口, 系统预留, 部分已经默认分配给常见应用了. 一般需要 root 才能分配这低于 1024 的端口范围, 不建议使用, 除非你知道你在做什么.
第二行最大只能到达 65535=2^16 -1. 因为 ipv4 端口只占 16bits, 因此最大只能到达 65535.
因此一个客户端, 配置一个 ipv4 地址, 能够创建的最大连接数为 65535-1024=64511.
如何使用 Mac os 创建连接测试服务器, 考虑带其他应用程序占用的端口, 一般配置最大创建 64000 个连接, 基本到达系统最大限制了.
----------------
来源: http://www.bubuko.com/infodetail-3356850.html