Câu trả lời:
Đâ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ủ đề
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 ntop
và iostat
, và vmstat
để chẩn đoán những gì đang xảy ra.
"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.
4
là con số tốt nhất.
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.
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.
(Ả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ư
đó có thể dễ dàng là yếu tố hạn chế trong các ứng dụng thực tế.
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
ps ax | wc -l
bá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.
Để 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.
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.