Số luồng tối đa cho mỗi tiến trình trong Linux?


245

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:


247

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/getrlimitchi tiết về các giới hạn này.


3
Giới hạn trong / Proc / sys / vm / max_map_count cũng có thể giới hạn số lượng chủ đề. Sẽ an toàn để tăng giới hạn đó rất nhiều nếu bạn đánh nó.
Mikko Rantalainen

1
Robert: Linux thực hiện gián tiếp trên mỗi giới hạn quy trình. Kiểm tra câu trả lời của tôi để biết chi tiết;)
codersofthedark

Tôi đang cố gắng thay đổi điều này trên Ubuntu 12.04 của tôi và nó không thay đổi với lệnh của bạn. Tôi cũng đã thử vi để thay đổi nó, nhưng tôi nhận được E667: Fsync failedkhi tôi cố gắng lưu vào vi.
Siddharth

4
@dragosrsupercool luồng tối đa được tính bằng tổng ram, không có bộ nhớ ảo
c4f4t0r

1
Số lượng kích thước ngăn xếp trên mỗi luồng (mặc định trên hệ thống của bạn) có nhiều khả năng là giới hạn hơn bất kỳ thứ gì khác. Giảm kích thước ngăn xếp trên mỗi luồng là một cách để tăng tổng số luồng (mặc dù đó hiếm khi là một ý tưởng hay).
Randy Howard

67

Đâ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 /


11
Ngoại trừ 3 chi tiết nhỏ: 1. Linux không làm điều này, sự hiện diện của ngăn xếp và thực tế là bộ nhớ và không gian địa chỉ có kích thước hữu hạn không liên quan gì đến nó. 2. Bạn phải chỉ định ngăn xếp của một luồng khi tạo nó, điều này không liên quan đến 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.
Damon

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

43

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?


3
1 MB cho mỗi luồng cho ngăn xếp là khá cao, nhiều chương trình không cần bất cứ nơi nào gần không gian ngăn xếp nhiều này. Hiệu suất sẽ được dựa trên số lượng các quy trình có thể chạy , chứ không phải số lượng các luồng tồn tại. Tôi có một máy đang chạy ngay bây giờ với hơn 1200 luồng với tải 0,40.
Robert Gamble

13
hiệu suất phụ thuộc vào những gì các chủ đề đang làm. bạn có thể tăng cao hơn vài chục nếu họ không làm nhiều và do đó ít chuyển đổi ngữ cảnh.
Corey Goldberg

ngăn xếp đang phát triển linh hoạt, chỉ có trang ban đầu được phân bổ ngoài
luồng

28

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

4
Cảm ơn bạn, cuối cùng nó đã cho phép tôi vượt qua số lượng luồng 32k Java.
berezovskyi

1
Không hoạt động với tôi: $ ulimit -s 100000 $ ulimit -i 63645 $ cat / Proc / sys / kernel / thread-max 127626 $ cat / Proc / sys / vm / max_map_count 600000 $ cat / Proc / sys / kernel / pid_max 200000 $ java -Xmx4G -Xss256k -cp. ThreadCreation ... 11542 11543 java.lang.OutOfMemoryError: không thể tạo luồng gốc mới tại java.lang.Thread.start0 (Phương thức gốc) tại java.lang.Thread.start (Thread.java:717) tại ThreadCreation.main ( ThreadCreation.java:15)
Martin Vysny

@MartinVysny ulimit -s = kích thước luồng tính bằng kb. Vì vậy, bạn đang cố gắng tạo chủ đề với kích thước ngăn xếp luồng 100MB.
Vladimir Kunschikov

đã thêm đề xuất của bạn mà không cần kiểm tra, @Thomas, cảm ơn vì đã phản hồi.
Vladimir Kunschikov

2
@VladimirKunschikov Cảm ơn bạn thân, giải pháp của bạn thực sự hiệu quả và cảm ơn Thomas để thêm dòng bổ sung đó, tôi có thể xác nhận rằng nó sẽ không hoạt động với dòng đó.
BillHoo

14

@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.


11

Để lấy nó:

cat /proc/sys/kernel/threads-max

Để đặt nó:

echo 123456789 > /proc/sys/kernel/threads-max

123456789 = # chủ đề


Tôi bị từ chối khi cố gắng viết, ngay cả với root.
Kim

Chà, đã gần một thập kỷ kể từ khi nó được đăng. Tôi không cập nhật về tình trạng hiện tại, nhưng rất nhiều điều có thể đã thay đổi (và có lẽ là có) ...
Vincent Van Den Berghe

vấn đề với perm-deny có thể là phần append ( >) mất phần sudo: thửecho 12345678 | sudo tee -a /proc/sys/kernel/threads-max
dwanderson

10

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?


5

Đố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.


5

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 ...


4

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.


3
Mục đích của đa luồng không chỉ là hiệu suất. Ví dụ: bạn đang nghe 10 cổng với hệ thống chặn trên bộ xử lý 4 lõi. Trong ví dụ này không có nghĩa là 4.
obayhan

3

Sử dụng nbio thư viện i / o không chặn hoặc bất cứ điều gì, nếu bạn cần thêm luồng để thực hiện các cuộc gọi I / O mà chặn


2

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


1

Để đặt vĩnh viễn,

vim /etc/sysctl.conf

và thêm

kernel.threads-max = "value"

0

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


0

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.


0

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.