Kinh nghiệm của tôi là nhiệm vụ đếm quá trình cao của tôi chỉ thành công với:
kern.maxproc=2500 # This is as big as I could set it.
kern.maxprocperuid=2048
ulimit -u 2048
Hai cái đầu tiên có thể đi vào /etc/sysctl.conf
và giá trị ulimit vào launchd.conf, cho cài đặt đáng tin cậy.
Vì tcp / ip là một phần của những gì tôi đang làm, tôi cũng cần phải tìm ra
kern.ipc.somaxconn=8192
từ 128 mặc định của nó.
Trước khi tôi tăng giới hạn quy trình, tôi đã nhận được các lỗi "fork", không đủ tài nguyên. Trước khi tôi tăng kern.ipc.somaxconn, tôi đã gặp lỗi "hỏng ống".
Điều này là trong khi chạy một số lượng khá lớn (500-4000) các quy trình tách rời trên máy Mac quái vật của tôi, OS 10.5.7, rồi 10.5.8, giờ là 10.6.1. Trong Linux trên máy tính của ông chủ tôi, nó chỉ hoạt động.
Tôi nghĩ rằng số lượng quy trình sẽ gần hơn 1000 nhưng dường như mọi quy trình tôi bắt đầu đều bao gồm bản sao vỏ của chính nó ngoài mục thực tế đang thực hiện công việc thực tế. Rất lễ hội.
Tôi đã viết một món đồ chơi trưng bày giống như:
#!/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
và xem số lượng tiến trình tối đa trong ps -ef và treo xung quanh trong netstat đang chờ TIME_WAIT
hết hạn ... Với các giới hạn được nâng lên, tôi đã thấy hơn 3500 TIME_WAIT
mặt hàng ở mức cao nhất.
Trước khi tôi tăng giới hạn, tôi có thể 'lẻn' lên ngưỡng thất bại, bắt đầu dưới 1K nhưng tăng lên giá trị cao là 1190 .. mỗi lần nó bị đẩy vào thất bại, có thể phải mất thêm một chút nữa vào lần tới, có lẽ vì điều gì đó lưu trữ mở rộng đến giới hạn của nó mỗi khi nó thất bại.
Mặc dù trường hợp thử nghiệm của tôi có "chờ đợi" vì tuyên bố cuối cùng của nó vẫn còn NHIỀU quy trình tách rời treo xung quanh sau khi nó thoát ra.
Tôi đã nhận được hầu hết các thông tin tôi sử dụng từ các bài đăng trên internet, nhưng không phải tất cả đều chính xác. Milage của bạn có thể thay đổi.