Tôi đang chạy song song các quy trình nền curl song song trong tập lệnh bash sau
START=$(date +%s)
for i in {1..100000}
do
curl -s "http://some_url_here/"$i > $i.txt&
END=$(date +%s)
DIFF=$(( $END - $START ))
echo "It took $DIFF seconds"
done
Tôi có máy chủ chuyên dụng 49Gb Corei7-920 (không ảo).
Tôi theo dõi mức tiêu thụ bộ nhớ và CPU thông qua top
lệnh và chúng ở rất xa giới hạn.
Tôi đang sử dụng ps aux | grep curl | wc -l
để đếm số lượng các quy trình curl hiện tại . Con số này tăng nhanh lên tới 2-4 nghìn và sau đó bắt đầu giảm liên tục.
Nếu tôi thêm phân tích cú pháp đơn giản thông qua đường ống curl thành awk ( curl | awk > output
) thì số quy trình curl tăng lên chỉ còn 1-2 nghìn và sau đó giảm xuống 20-30 ...
Tại sao số lượng quá trình giảm đáng kể? Đâu là giới hạn của kiến trúc này?
parallel(1)
cho các tác vụ như vậy: manpages.debian.org/cgi-bin/
start=$SECONDS
và end=$SECONDS
- và sử dụng các tên biến chữ thường hoặc chữ thường trong trường hợp để tránh xung đột tên tiềm năng với các biến shell. Tuy nhiên, bạn thực sự chỉ nhận được khoảng thời gian ngày càng tăng kể từ khi bắt đầu mỗi quy trình. Bạn sẽ không nhận được quá trình tải xuống mất bao lâu kể từ khi quá trình ở chế độ nền (và start
chỉ được tính một lần). Trong Bash, bạn có thể (( diff = end - start ))
bỏ các ký hiệu đô la và cho phép khoảng cách linh hoạt hơn. Sử dụng pgrep
nếu bạn có nó.
awk
).
parallel
và nó nói với tôi rằng tôi có thể chỉ chạy 500 tác vụ song song do giới hạn hệ thống xử lý tệp. Tôi đã tăng giới hạn trong giới hạn. Thông tin, nhưng bây giờ khi tôi cố gắng chạy 5000 công việc simulaneus, nó ngay lập tức ăn hết bộ nhớ của tôi (49 Gb) ngay cả trước khi bắt đầu vì mỗi parallel
tập lệnh perl ăn 32Mb.
ulimit
sẽ chỉ ra một số giới hạn đó