Chỉ sử dụng một lõi cpu


9

Tôi cần chạy thử nghiệm hiệu năng cho chương trình đồng thời của mình và yêu cầu của tôi là nó chỉ nên chạy trên một lõi CPU. (Tôi không muốn các chủ đề hợp tác - Tôi muốn luôn có một chuyển đổi ngữ cảnh).

Vì vậy, tôi có hai câu hỏi:

  1. Giải pháp tốt nhất - Cách chỉ ký và dự trữ một lõi CPU cho chương trình của tôi (để buộc HĐH không sử dụng lõi CPU này). Tôi đoán điều đó là không thể nhưng có lẽ tôi đã sai ...

  2. Làm cách nào để đặt linux (Fedora 24) chỉ sử dụng một lõi CPU?



1
Lưu ý rằng các CPU hiện đại có thể thay đổi tốc độ của chúng tùy thuộc vào tổng số lõi được sử dụng. Ngay cả khi bạn chắc chắn rằng quy trình của bạn chỉ sử dụng một lõi và không có quy trình nào khác sử dụng nó, tốc độ của lõi đó sẽ khác nhau tùy thuộc vào cách hệ điều hành sẽ sử dụng các lõi khác. Hãy tính đến điều này khi chạy thử nghiệm của bạn.
liori

Bạn sẽ có thể hủy kích hoạt lõi CPU khỏi BIOS, có thể đáng tin cậy hơn cho các thử nghiệm của bạn vì @liori đã nói ở trên rằng HĐH có thể thay đổi tốc độ lõi.
Marcs

Còn việc tạo một VM và chỉ gán một lõi cho nó thì sao? Ồ, tôi chỉ đọc "không sử dụng lõi CPU này" nên đừng
bận

Câu trả lời:


26

Trên linux, lệnh gọi hệ thống để đặt ái lực CPU cho một tiến trình là sched_setaffinity. Sau đó, có tasksetcông cụ để làm điều đó trên dòng lệnh.

Để chương trình duy nhất đó chỉ chạy trên một CPU, tôi nghĩ bạn muốn một cái gì đó như

taskset -c 1 ./myprogram

(đặt bất kỳ số CPU nào làm đối số cho công -ctắc.)

Nó phải đủ gần với một hệ thống xử lý đơn, miễn là các quy trình khác của bạn không chạy quá nhiều so với hệ thống bạn muốn đo hoặc chúng được lên lịch cho các CPU khác. Nếu bạn chỉ muốn dành một CPU cho quy trình duy nhất đó và ngăn các quy trình khác chạy trên CPU đó, bạn cũng cần đặt mối quan hệ của chúng.

Điều đó, tôi không biết làm thế nào cho đúng. Bạn cần đặt mối quan hệ của bộ xử lý từ initrất sớm trong quá trình khởi động để đảm bảo nó được kế thừa cho tất cả các quy trình trên hệ thống. Như một giải pháp thay thế, bạn có thể sử dụng taskset -c -p 0 $PIDcho tất cả các quy trình khác để buộc chúng chỉ chạy trên CPU # 0.

systemd cũngCPUAffinity= phải kiểm soát mối quan hệ trong các tệp đơn vị và có một số câu hỏi về việc đặt mối quan hệ mặc định ở đây trên unix.SE, nhưng tôi không tìm thấy bất kỳ giải pháp nào tốt.

Mặc dù như @Kamil Maciorowski nhận xét và trả lời cho một câu hỏi về superuser.com , thiết lập isolcpus=1 trên dòng lệnh hạt nhân nên "cô lập CPU mà từ các thuật toán lập lịch trình chung", mà là một cái gì đó bạn có thể muốn.


Điều này không hoàn toàn trả lời câu hỏi. Mặc dù tasket (hoặc các phương thức khác để thiết lập mối quan hệ tác vụ) sẽ đảm bảo rằng một tiến trình chỉ chạy trên bộ lõi được chỉ định, nhưng nó sẽ không đảm bảo rằng chỉ có quá trình đó sẽ chạy trên các lõi đó. Điều đó có nghĩa là, hệ điều hành có thể lên lịch cho các quy trình khác vào lõi mà bạn đã đặt mối quan hệ quy trình của mình. Trong thực tế, đây là câu trả lời hữu ích nhất, nhưng hãy chú ý đến những hạn chế và đặc biệt lưu ý rằng nó không cung cấp những gì bạn yêu cầu trong 1) "chỉ dành riêng một lõi cpu cho chương trình của tôi (để buộc HĐH phải không sử dụng lõi cpu này) "
James Greenhalgh

@JamesGreenhalgh, nhưng, tìm cách đặt mối quan hệ CPU cho mọi quy trình sẽ trả lời câu hỏi. Có thể đặt mối quan hệ cpu mặc định cho các quy trình mới, dưới dạng tùy chọn kernel (dòng cmd) không? Điều đó sẽ có hiệu lực sớm trong quá trình khởi động và ảnh hưởng đến tất cả các quy trình.
jpaugh

Tôi thực sự đã bỏ lỡ mệnh đề trong ngoặc đơn về việc ngăn các tiến trình khác chạy trên CPU đó. Hoặc có lẽ tôi nghĩ vấn đề lớn nhất là đảm bảo rằng chương trình đang được hỏi sẽ chỉ chạy trên một lõi, thay vì bốn, và các quy trình khác có thể được coi là một loại phiền toái, điều đó sẽ không quan trọng so với điều đó Nhưng tôi sẽ thừa nhận, tôi đã không có câu trả lời thích đáng cho phần câu hỏi đó, ngoài những gì Kamil nhận xét bây giờ.
ilkkachu

@jpaugh, tôi nghĩ thậm chí sau đó bạn sẽ không thể tự cô lập hoàn toàn khỏi khả năng thực hiện một quy trình khác trên lõi "của bạn". Ví dụ: một trong đó thiết lập lại mối quan hệ của chính nó, hoặc thậm chí mã hạt nhân tự tiêu tốn thời gian không liên quan đến việc quản lý quy trình của bạn. Một lần nữa, tôi hoàn toàn đồng ý rằng trong thực tế, câu trả lời này là điều cần làm nhất để giải quyết phần lớn vấn đề, nhưng tôi sẽ thực sự thích thú khi đọc câu trả lời cho phần cuối cùng đó trong ngoặc đơn!
James Greenhalgh
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.