Tại sao sử dụng nhiều chủ đề làm cho nó chậm hơn so với việc sử dụng ít chủ đề hơn


30

Đã thử chạy chương trình X bằng 8 luồng và nó đã kết thúc sau n phút .
Đã thử chạy cùng một chương trình bằng 50 luồng và nó đã kết thúc sau n * 10 phút .

Tại sao điều này xảy ra và làm thế nào tôi có thể nhận được số lượng chủ đề tối ưu tôi có thể sử dụng?

Câu trả lời:


33

Đây là một câu hỏi phức tạp bạn đang hỏi. Không biết nhiều hơn về bản chất của các chủ đề của bạn, thật khó để nói. Một số điều cần xem xét khi chẩn đoán hiệu năng hệ thống:

Là quá trình / chủ đề

  • CPU bị ràng buộc (cần nhiều tài nguyên CPU)
  • Bộ nhớ bị ràng buộc (cần nhiều tài nguyên RAM)
  • I / O bị ràng buộc (Tài nguyên mạng và / hoặc ổ cứng)

Tất cả ba tài nguyên này là hữu hạn và bất kỳ ai cũng có thể giới hạn hiệu suất của một hệ thống. Bạn cần xem xét cái nào (có thể là 2 hoặc 3 cùng nhau) tình huống cụ thể của bạn đang tiêu tốn.

Bạn có thể sử dụng ntopiostat, và vmstatđể chẩn đoán những gì đang xảy ra.


8
Các vấn đề phần cứng cũng vậy. Vật lý, ảo, số lõi, loại lõi, bộ đệm L1 / L2 / L3, v.v.
EightBitTony

46

"Lý do tại sao điều này xảy ra?" là loại dễ trả lời. Hãy tưởng tượng bạn có một hành lang mà bạn có thể đặt bốn người xuống cạnh nhau. Bạn muốn chuyển tất cả rác ở một đầu, sang đầu kia. Số người hiệu quả nhất là 4.

Nếu bạn có 1-3 người thì bạn đang bỏ lỡ việc sử dụng một số không gian hành lang. Nếu bạn có từ 5 người trở lên, thì ít nhất một trong số những người đó về cơ bản bị mắc kẹt xếp hàng sau một người khác mọi lúc. Thêm nhiều người hơn chỉ làm tắc nghẽn hành lang, nó không tăng tốc độ hoạt động.

Vì vậy, bạn muốn có nhiều người như bạn có thể phù hợp mà không gây ra bất kỳ hàng đợi nào. Tại sao bạn có hàng đợi (hoặc nút cổ chai) phụ thuộc vào câu hỏi trong câu trả lời của slm.


1
Ví dụ của bạn là sai lệch. Sẽ tốt hơn nếu nói điều gì đó như: "Bạn có một hành lang mà bạn có thể đặt bốn người xuống, cạnh nhau và nó được bạn những người khác sử dụng cho các nhiệm vụ khác nhau. Có một trọng tài quyết định ai có thể đi qua hành lang Sau đó, số người hiệu quả nhất lớn hơn 4 và ít hơn một số người, trong đó người của bạn bắt đầu xếp hàng [phụ thuộc nhiều vào bối cảnh]. " Thông thường có một số luồng nhiều hơn số lượng CPU hoạt động tốt hơn so với sử dụng chính xác 4 luồng. Nếu bạn là người duy nhất sử dụng CPU, thì đó 4là con số tốt nhất.
Bakuriu

7
Ví dụ tuyệt vời, +1. Bakuriu, một ví dụ minh họa vấn đề của một nguồn tài nguyên được chia sẻ hạn chế. Đó là giải thích vấn đề, không phải làm thế nào để tìm ra số lượng chủ đề tối ưu.
Bananguin

1
Cũng sẽ hữu ích khi nhớ rằng các luồng vẫn có kiểu chuyển đổi ngữ cảnh riêng diễn ra. Việc tăng số lượng luồng không làm tăng dung lượng hiệu năng (như bạn đã chỉ ra) nhưng nó cũng làm cạn kiệt thời gian của CPU bằng cách cung cấp cho nhân nhiều công việc hơn để làm. Về cơ bản, có lợi nhuận giảm dần khi xâu chuỗi và làm quá nhiều nguyên nhân làm giảm hiệu suất.
Bratchley

9
Mọi vấn đề có thể được mô tả ở nhiều cấp độ phức tạp. Tôi đã đưa ra một xấp xỉ của vấn đề, mà tôi tin là hữu ích để giải thích những điều cơ bản. Tất nhiên nó có thể được tinh chỉnh hơn, và chi tiết hơn, nhưng bạn càng làm cho nó càng chi tiết, nó càng ít hữu ích như là một giới thiệu về vấn đề.
EightBitTony

Tôi chỉ nói thêm rằng, thay vì dành nhiều thời gian để tính toán số lượng chủ đề tối ưu, chỉ cần viết mã để có thể thay đổi dễ dàng. Bất kỳ sự hợp nhất lớn nào như thế này sẽ yêu cầu nhiều lần chạy thử (hầu hết với các tập hợp nhỏ dữ liệu của bạn) để hoàn thiện. Tăng số lượng chủ đề cho đến khi bạn thấy hiệu suất hoặc tác động giảm mạnh đối với hoạt động hệ thống khác là không thể chấp nhận được.
DocSalvager

20

Một khuyến nghị phổ biến là n + 1 luồng, n là số lượng lõi CPU có sẵn. Bằng cách đó, n luồng có thể hoạt động CPU trong khi 1 luồng đang chờ I / O đĩa. Có ít luồng hơn sẽ không sử dụng đầy đủ tài nguyên CPU (tại một số điểm sẽ luôn có I / O để chờ), có nhiều luồng hơn sẽ khiến các luồng chiến đấu với tài nguyên CPU.

Các luồng đến không miễn phí, nhưng với chi phí chung như chuyển mạch ngữ cảnh và - nếu dữ liệu phải được trao đổi giữa các luồng thường là trường hợp - các cơ chế khóa khác nhau. Điều này chỉ đáng giá khi bạn thực sự có nhiều lõi CPU chuyên dụng hơn để chạy mã. Trên CPU lõi đơn, một quy trình đơn (không có luồng riêng biệt) thường nhanh hơn bất kỳ luồng nào được thực hiện. Chủ đề không kỳ diệu làm cho CPU của bạn đi nhanh hơn, nó chỉ có nghĩa là làm thêm.


Đây phải là câu trả lời chung cho lượng thông tin có sẵn trong câu hỏi. chúng ta không cần một luận điểm và triết lý toàn diện như những câu trả lời khác
Allahjane

9

Như những người khác đã chỉ ra ( câu trả lời slm , câu trả lời EightBitTony ) đây là một câu hỏi phức tạp và hơn thế nữa vì bạn không mô tả những gì bạn đã làm và cách họ làm điều đó.

Nhưng dứt khoát ném vào nhiều chủ đề có thể làm cho mọi thứ tồi tệ hơn.

Trong lĩnh vực điện toán song song có luật của Amdahl có thể áp dụng (hoặc không thể, nhưng bạn không mô tả chi tiết về vấn đề của mình, vì vậy ....) và có thể đưa ra một số hiểu biết chung về loại vấn đề này.

Quan điểm của định luật Amdahl là trong bất kỳ chương trình nào (trong bất kỳ thuật toán nào) luôn có một tỷ lệ phần trăm không thể chạy song song ( phần tuần tự ) và có một tỷ lệ khác có thể chạy song song ( phần song song ) hai phần này thêm tới 100%].

Phần này có thể được biểu thị bằng phần trăm thời gian thực hiện. Ví dụ, có thể có 25% thời gian dành cho các hoạt động tuần tự nghiêm ngặt và 75% thời gian còn lại được dành cho hoạt động có thể được thực hiện song song.

Hình ảnh từ Wikipedia (Ảnh từ Wikipedia )

Luật của Amdahl dự đoán rằng với mỗi phần song song nhất định (ví dụ 75%) của chương trình, bạn chỉ có thể tăng tốc độ thực thi (ví dụ: nhiều nhất là 4 lần) ngay cả khi bạn sử dụng nhiều bộ xử lý hơn để thực hiện công việc.

Theo nguyên tắc thông thường, càng nhiều chương trình mà bạn không thể chuyển đổi trong thực thi song song, bạn càng có thể nhận được ít hơn bằng cách sử dụng nhiều đơn vị thực thi (bộ xử lý).

Cho rằng bạn đang sử dụng các luồng (và không phải bộ xử lý vật lý), tình huống có thể còn tồi tệ hơn thế này. Hãy nhớ rằng các luồng có thể được xử lý (tùy thuộc vào việc triển khai và phần cứng khả dụng, ví dụ: CPU / lõi) chia sẻ cùng bộ xử lý / lõi vật lý (đây là một dạng đa nhiệm, như được chỉ ra trong câu trả lời khác).

Dự đoán thiên thạch này (về thời gian CPU) không xem xét các tắc nghẽn thực tế khác như

  1. Tốc độ I / O giới hạn (tốc độ ổ cứng và mạng)
  2. Giới hạn kích thước bộ nhớ
  3. Khác

đó có thể dễ dàng là yếu tố hạn chế trong các ứng dụng thực tế.


Điều này phải được chọn câu trả lời.
Eonil

6

Thủ phạm ở đây phải là "CÔNG TẮC TIẾP THEO". Đây là quá trình lưu trạng thái của luồng hiện tại để bắt đầu thực thi một luồng khác. Nếu một số luồng được ưu tiên như nhau, chúng cần được chuyển xung quanh cho đến khi chúng hoàn thành thực thi.

Trong trường hợp của bạn, khi có 50 luồng, rất nhiều chuyển đổi ngữ cảnh diễn ra khi so sánh với việc chỉ chạy 10 luồng.

Thời gian trên được giới thiệu vì chuyển đổi ngữ cảnh là điều làm cho chương trình của bạn chạy chậm


Vì chúng ta không biết các chủ đề là gì, điều này dường như là một phỏng đoán. Có, chuyển đổi ngữ cảnh thêm một chi phí, nhưng nếu các luồng đang thực hiện một số loại phân tích dữ liệu, vấn đề có thể là các vấn đề về bộ đệm (tức là không thể sử dụng bộ đệm vì mỗi khi bạn chuyển đổi các luồng, bạn phải xóa nó).
EightBitTony

Tự chuyển ngữ cảnh theo luồng , trừ khi chúng ta đang xử lý một số lượng lớn các chuyển đổi ngữ cảnh, có thể sẽ không có tác động lớn đến hiệu suất. 50 chủ đề là cao nhưng không phải là cực đoan (trên hộp của tôi ngay bây giờ, ps ax | wc -lbáo cáo 225 quy trình, và nó không có nghĩa là được tải nặng). Tôi có xu hướng đi với dự đoán của @ EightBitTony; bộ nhớ cache huỷ bỏ hiệu lực có thể là một vấn đề lớn hơn, vì mỗi khi bạn tuôn bộ nhớ cache, CPU phải đợi kiếp cho mã và dữ liệu từ RAM.
một CVn

3

Để sửa ẩn dụ của EightBitTony:

"Lý do tại sao điều này xảy ra?" là loại dễ trả lời. Hãy tưởng tượng bạn có hai bể bơi, một đầy và một trống. Bạn muốn di chuyển tất cả nước từ nơi này sang nơi khác và có 4 thùng . Số người hiệu quả nhất là 4.

Nếu bạn có 1-3 người thì bạn đã bỏ lỡ việc sử dụng một số thùng . Nếu bạn có 5 người trở lên, thì ít nhất một trong số những người đó bị mắc kẹt chờ đợi một cái xô . Thêm ngày càng nhiều người ... không tăng tốc hoạt động.

Vì vậy, bạn muốn có càng nhiều người có thể làm một số công việc (sử dụng một cái xô) cùng một lúc .

Một người ở đây là một luồng và một nhóm đại diện cho bất kỳ tài nguyên thực thi nào là nút cổ chai. Thêm nhiều chủ đề không giúp đỡ nếu họ không thể làm bất cứ điều gì. Ngoài ra, chúng ta nên nhấn mạnh rằng việc chuyển một thùng từ người này sang người khác thường chậm hơn so với một người chỉ mang thùng có cùng khoảng cách. Đó là, hai luồng thay phiên nhau trên lõi thường hoàn thành công việc ít hơn một luồng chạy dài gấp đôi: điều này là do công việc phụ được thực hiện để chuyển đổi giữa hai luồng.

Việc tài nguyên thực thi giới hạn (nhóm) là CPU, hay lõi hay đường dẫn lệnh siêu luồng cho mục đích của bạn phụ thuộc vào phần nào của kiến ​​trúc là yếu tố giới hạn của bạn. Cũng lưu ý rằng chúng tôi giả định rằng các chủ đề là hoàn toàn độc lập. Đây chỉ là trường hợp nếu họ chia sẻ không có dữ liệu (và tránh mọi va chạm bộ đệm).

Như một vài người đã đề xuất, đối với I / O, tài nguyên giới hạn có thể là số lượng các hoạt động I / O có thể xếp hàng hữu ích: điều này có thể phụ thuộc vào toàn bộ các yếu tố phần cứng và hạt nhân, nhưng có thể dễ dàng lớn hơn nhiều so với số lượng lõi. Ở đây, bộ chuyển đổi ngữ cảnh rất tốn kém so với mã ràng buộc thực thi, khá rẻ so với mã ràng buộc I / O. Đáng buồn thay, tôi nghĩ rằng phép ẩn dụ sẽ hoàn toàn mất kiểm soát nếu tôi cố gắng biện minh điều này bằng xô.

Lưu ý rằng hành vi tối ưu với mã ràng buộc I / O thường vẫn có tối đa một luồng trên mỗi đường ống / lõi / CPU. Tuy nhiên, bạn phải viết mã I / O không đồng bộ hoặc không đồng bộ / không chặn và việc cải thiện hiệu suất tương đối nhỏ sẽ không luôn luôn chứng minh sự phức tạp thêm.


Tái bút Vấn đề của tôi với phép ẩn dụ hành lang ban đầu là nó gợi ý mạnh mẽ rằng bạn sẽ có thể có 4 hàng người, với 2 hàng đợi mang rác và 2 người trở về để thu thập thêm. Sau đó, bạn có thể thực hiện mỗi hàng đợi dài gần bằng hành lang và thêm người đã tăng tốc thuật toán (về cơ bản bạn đã biến toàn bộ hành lang thành một băng chuyền).

Trong thực tế, kịch bản này rất giống với mô tả chuẩn về mối quan hệ giữa độ trễ và kích thước cửa sổ trong mạng TCP, đó là lý do tại sao nó nhảy ra khỏi tôi.


Đó không phải là một phép ẩn dụ, đó là một phép tính gần đúng được thiết kế để giải thích hệ thống cho mọi người theo cách họ có thể hình dung nó một cách dễ dàng. Như vậy, nó sẽ luôn bị 'rác rưởi' bởi những người biết mức độ chi tiết tiếp theo, nhưng không nhận ra mức độ chi tiết của chúng không thực sự cần thiết cho người mới bắt đầu. Không ai học vật lý hạt bằng cách bắt đầu ở cấp độ tiến sĩ. Tất cả những thứ trước đây là một xấp xỉ họ dẫn bạn vào nó dần dần, tinh chỉnh nó khi bạn đi. Nó không "sai", nó không phải là bức tranh đầy đủ.
EightBitTony

Không ai nhầm lẫn về con số bài phát biểu mà bạn đã sử dụng và đó không phải là một từ tương tự xấu. Mọi sự tương tự đều có một số giới hạn mà nó vượt ra khỏi điều mà nó được cho là mô tả và không còn hữu ích. Tôi chỉ đề cập đến điều này bởi vì bản gốc đã nhắc nhở tôi rất mạnh về một kịch bản khác và vì tôi không nghĩ phiên bản này phức tạp hơn đối với khả năng dự đoán được cải thiện (hy vọng).
Vô dụng

0

Nó là khá đơn giản và dễ hiểu. Có nhiều luồng hơn những gì CPU của bạn hỗ trợ, bạn thực sự nối tiếp và không song song. Càng nhiều chủ đề, hệ thống của bạn sẽ càng chậm. Kết quả của bạn thực sự là một bằng chứng của hiện tượng này.

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.