Số lượng chủ đề tối đa có thể được tạo bởi một quy trình trong Linux là bao nhiêu?
Làm thế nào (nếu có thể) giá trị này có thể được sửa đổi?
Số lượng chủ đề tối đa có thể được tạo bởi một quy trình trong Linux là bao nhiêu?
Làm thế nào (nếu có thể) giá trị này có thể được sửa đổi?
Câu trả lời:
Linux không có một luồng riêng biệt cho mỗi giới hạn quy trình, chỉ là giới hạn về tổng số quy trình trên hệ thống (các luồng về cơ bản chỉ là các quy trình có không gian địa chỉ dùng chung trên Linux) mà bạn có thể xem như sau:
cat /proc/sys/kernel/threads-max
Mặc định là số trang bộ nhớ / 4. Bạn có thể tăng như thế này:
echo 100000 > /proc/sys/kernel/threads-max
Ngoài ra còn có giới hạn về số lượng quy trình (và do đó là các luồng) mà một người dùng có thể tạo, xem ulimit/getrlimit
chi tiết về các giới hạn này.
E667: Fsync failed
khi tôi cố gắng lưu vào vi.
Đây là SAU để nói rằng LINUX không có một luồng riêng cho mỗi giới hạn quy trình.
Linux thực hiện số lượng luồng tối đa trên mỗi tiến trình một cách gián tiếp !!
number of threads = total virtual memory / (stack size*1024*1024)
Do đó, số lượng luồng trên mỗi tiến trình có thể được tăng lên bằng cách tăng tổng bộ nhớ ảo hoặc bằng cách giảm kích thước ngăn xếp. Nhưng, việc giảm kích thước ngăn xếp quá nhiều có thể dẫn đến lỗi mã do tràn ngăn xếp trong khi bộ nhớ ảo tối đa bằng với bộ nhớ trao đổi.
Kiểm tra máy của bạn:
Tổng bộ nhớ ảo: ulimit -v
(mặc định là không giới hạn, do đó bạn cần tăng bộ nhớ trao đổi để tăng mức này)
Tổng kích thước ngăn xếp: ulimit -s
(mặc định là 8Mb)
Lệnh tăng các giá trị này:
ulimit -s newvalue
ulimit -v newvalue
* Thay thế giá trị mới bằng giá trị bạn muốn đặt làm giới hạn.
Người giới thiệu:
http://dustycodes.wordpress.com/2012/02/09/increasing-number-of-threads-per- Process /
ulimit -s
. Rất có thể (không hợp lý, nhưng có thể) để tạo ra càng nhiều chủ đề càng có ID chủ đề có thể. Trong Linux 64 bit, thậm chí có thể dễ dàng "có thể" tạo ra nhiều luồng hơn so với ID luồng (tất nhiên là không thể, nhưng theo như stack, thì nó là như vậy). 3. Dự trữ ngăn xếp, cam kết và VM là những thứ khác nhau, đặc biệt với OC.
Trong điều kiện thực tế, giới hạn thường được xác định bởi không gian ngăn xếp. Nếu mỗi luồng có một ngăn xếp 1 MB (tôi không thể nhớ đó là mặc định trên Linux), thì hệ thống 32 bit của bạn sẽ hết dung lượng địa chỉ sau 3000 luồng (giả sử rằng gb cuối cùng được dành cho kernel) .
Tuy nhiên, rất có thể bạn sẽ trải nghiệm hiệu suất khủng khiếp nếu bạn sử dụng nhiều hơn vài chục chủ đề. Sớm hay muộn, bạn nhận được quá nhiều chi phí chuyển đổi ngữ cảnh, quá nhiều chi phí trong công cụ lên lịch, v.v. (Tạo một số lượng lớn các luồng không chỉ chiếm nhiều bộ nhớ. Nhưng rất nhiều luồng với công việc thực tế sẽ làm bạn chậm lại vì chúng đang chiến đấu vì thời gian CPU có sẵn)
Bạn đang làm gì khi giới hạn này thậm chí có liên quan?
chủ đề 100k thích hợp trên linux:
ulimit -s 256
ulimit -i 120000
echo 120000 > /proc/sys/kernel/threads-max
echo 600000 > /proc/sys/vm/max_map_count
echo 200000 > /proc/sys/kernel/pid_max
./100k-pthread-create-app
Cập nhật 2018 từ @Thomas, trên các hệ thống systemd:
/etc/systemd/logind.conf: UserTasksMax=100000
@dragosrsupercool
Linux không sử dụng bộ nhớ ảo để tính toán tối đa luồng, nhưng ram vật lý được cài đặt trên hệ thống
max_threads = totalram_pages / (8 * 8192 / 4096);
http://kavassalis.com/2011/03/linux-and-the-maximum-number-of- Processes-threads /
kernel / fork.c
/* The default maximum number of threads is set to a safe
* value: the thread structures can take up at most half
* of memory.
*/
max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);
Vì vậy, max max khác nhau giữa mọi hệ thống, vì ram được cài đặt có thể từ các kích cỡ khác nhau, tôi biết Linux không cần tăng bộ nhớ ảo, vì trên 32 bit, chúng tôi có 3 GB cho không gian người dùng và 1 GB cho kernel, trên 64 bit, chúng tôi có 128 TB bộ nhớ ảo, điều đó xảy ra trên Solaris, nếu bạn muốn tăng bộ nhớ ảo, bạn cần thêm không gian hoán đổi.
Để lấy nó:
cat /proc/sys/kernel/threads-max
Để đặt nó:
echo 123456789 > /proc/sys/kernel/threads-max
123456789 = # chủ đề
>
) mất phần sudo
: thửecho 12345678 | sudo tee -a /proc/sys/kernel/threads-max
Giới hạn số lượng chủ đề:
$ cat /proc/sys/kernel/threads-max
Nó được tính như thế nào:
max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);
và: kích thước trang x86_64 (PAGE_SIZE) là 4K; Giống như tất cả các kiến trúc khác, x86_64 có ngăn xếp hạt nhân cho mọi luồng hoạt động. Các ngăn xếp luồng này là THREAD_SIZE (2 * PAGE_SIZE) lớn;
cho các trang ghi nhớ:
cat /proc/zoneinfo | grep spanned | awk '{totalpages=totalpages+$2} END {print totalpages}';
Vì vậy, thực sự số lượng không liên quan đến giới hạn kích thước ngăn xếp bộ nhớ luồng ( ulimit -s
).
PS: giới hạn ngăn xếp bộ nhớ luồng là 10M trong máy ảo rrc của tôi và đối với bộ nhớ 1,5G, máy ảo này chỉ có thể đủ 150 luồng?
Đối với bất cứ ai nhìn vào điều này bây giờ, trên các hệ thống systemd (trong trường hợp của tôi, cụ thể là Ubuntu 16.04), có một giới hạn khác được thi hành bởi tham số cgroup pids.max.
Điều này được đặt thành 12.288 theo mặc định và có thể được ghi đè trong /etc/systemd/logind.conf
Những lời khuyên khác vẫn được áp dụng bao gồm pids_max, thread-max, max_maps_count, ulimits, v.v.
kiểm tra kích thước ngăn xếp trên mỗi luồng với ulimit, trong trường hợp của tôi Redhat Linux 2.6:
ulimit -a
...
stack size (kbytes, -s) 10240
Mỗi luồng của bạn sẽ nhận được lượng bộ nhớ này (10MB) được gán cho ngăn xếp của nó. Với chương trình 32 bit và không gian địa chỉ tối đa 4GB, tức là tối đa chỉ 4096MB / 10MB = 409 luồng !!! Trừ mã chương trình, trừ không gian heap có thể sẽ dẫn đến mức tối đa được quan sát. trong số 300 chủ đề.
Bạn sẽ có thể nâng cao điều này bằng cách biên dịch và chạy trên 64 bit hoặc đặt ulimit -s 8192 hoặc thậm chí ulimit -s 4096. Nhưng nếu điều này được khuyến khích là một cuộc thảo luận khác ...
Có lẽ nó không quan trọng. Bạn sẽ có được hiệu năng tốt hơn nhiều khi thiết kế thuật toán của mình để sử dụng một số luồng cố định (ví dụ: 4 hoặc 8 nếu bạn có 4 hoặc 8 bộ xử lý). Bạn có thể làm điều này với hàng đợi công việc, IO không đồng bộ hoặc một cái gì đó như libevent.
Phụ thuộc vào hệ thống của bạn, chỉ cần viết chương trình mẫu [bằng cách tạo các quy trình trong một vòng lặp] và kiểm tra bằng cách sử dụng ps axo pid, ppid, rss, vsz, nlwp, cmd. Khi nó không thể tạo chủ đề nữa, hãy kiểm tra số lượng nlwp [nlwp là số chủ đề] voila bạn đã có câu trả lời bằng chứng ngu ngốc của mình thay vì đi qua sách
Để đặt vĩnh viễn,
vim /etc/sysctl.conf
và thêm
kernel.threads-max = "value"
Chúng ta có thể thấy số lượng chủ đề tối đa được xác định trong tệp sau trong linux
cat / Proc / sys / kernel / thread-max
(HOẶC LÀ)
hệ thống -a | chủ đề grep-max
Bạn có thể thấy giá trị hiện tại bằng lệnh sau- cat / Proc / sys / kernel / thread-max
Bạn cũng có thể đặt giá trị như
echo 100500> / Proc / sys / kernel / thread-max
Giá trị bạn đặt sẽ được kiểm tra đối với các trang RAM có sẵn. Nếu cấu trúc luồng chiếm hơn 1/8) số trang RAM có sẵn, thì tối đa luồng sẽ bị giảm tương ứng.
Có, để tăng số lượng chủ đề, bạn cần tăng bộ nhớ ảo hoặc giảm kích thước ngăn xếp. Trong Raspberry Pi, tôi đã không tìm được cách tăng bộ nhớ ảo, nếu giảm kích thước ngăn xếp từ 8MB mặc định xuống 1MB, có thể nhận được hơn 1000 luồng trên mỗi tiến trình nhưng giảm kích thước ngăn xếp bằng lệnh Lệnh ulimit -s. làm điều này cho tất cả các chủ đề. Vì vậy, giải pháp của tôi là sử dụng lớp pthread_t phiên bản của Nhật Bản vì lớp pthread_t cho phép tôi đặt kích thước ngăn xếp cho mỗi luồng. Cuối cùng, tôi có sẵn để lưu trữ hơn 1000 luồng trên mỗi tiến trình trong Raspberry Pi mỗi luồng với 1 MB ngăn xếp.