Cách giải thích đúng cách tải hệ thống trên bộ xử lý 4 lõi 8 luồng


13

Như chúng ta đã biết, tải 1,00 trên một bộ xử lý có nghĩa là có tải 100% . Tương tự, tải trọng 4,00 trên lõi tứ sẽ là 100% .

Làm thế nào tôi nên giải thích tải trên bộ xử lý 4 lõi 8 luồng? Khi nào tôi đạt được dung lượng tối đa của CPU? Ở mức 4 hay 8,00 ?

Câu trả lời:


17

Không chắc chắn, nhưng chủ yếu là trên 1.00*n_cpu.

Tải có nghĩa như sau: nếu có nhiều quy trình trên một hệ thống cpu đơn, chúng đang chạy dường như song song. Nhưng nó không phải là sự thật. Điều gì thực tế xảy ra: hạt nhân cho 1/100 giây cho một quá trình, và sau đó phá vỡ hoạt động của nó bằng một ngắt. Và đưa ra 1/100 giây tiếp theo cho một quá trình khác.

Thực tế câu hỏi, "quá trình nào sẽ có khoảng thời gian 1/100 giây tiếp theo của chúng tôi?", Sẽ được quyết định bởi một phương pháp phỏng đoán phức tạp. Nó được đặt tên là lập kế hoạch nhiệm vụ .

Tất nhiên, các quy trình bị chặn, ví dụ như họ đang chờ dữ liệu của họ những gì họ đang đọc từ đĩa, được miễn lập lịch tác vụ này.

Tải trọng nói gì: có bao nhiêu quá trình hiện đang chờ khung thời gian 1/100 giây tiếp theo của chúng. Tất nhiên, nó là một giá trị trung bình. Điều này là do bạn có thể thấy nhiều số trong a cat /proc/loadavg.

Tình hình trong một hệ thống đa cpu phức tạp hơn một chút. Có nhiều cpus, có khung thời gian có thể được cung cấp cho nhiều quy trình. Điều đó làm cho nhiệm vụ lên lịch một chút - nhưng không quá nhiều - phức tạp hơn. Nhưng tình hình là như vậy.

Hạt nhân rất thông minh, nó cố gắng chia sẻ tài nguyên hệ thống để đạt hiệu quả tối ưu và nó ở gần đó (có những điều tối ưu hóa nhỏ, ví dụ như sẽ tốt hơn nếu một quá trình sẽ được chạy trong thời gian dài nhất có thể trên cùng cpu vì cân nhắc bộ nhớ đệm, nhưng chúng không quan trọng ở đó). Điều này là do nếu chúng ta có tải 8, điều đó có nghĩa là: thực sự có 8 quy trình đang chờ cho lát cắt thời gian tiếp theo của chúng. Nếu chúng ta có 8 cpus, chúng ta có thể cung cấp các lát cắt thời gian này cho từng cpus một, và do đó hệ thống của chúng ta sẽ sử dụng tối ưu.

Nếu bạn thấy a top, bạn có thể thấy rằng số lượng các quy trình đang chạy thực tế thấp đến mức đáng ngạc nhiên: chúng là các quy trình được đánh dấu Rở đó. Ngay cả trên một hệ thống không thực sự khó, nó thường ở dưới 5. Điều này một phần là do các quá trình chờ dữ liệu của chúng từ các đĩa hoặc từ mạng cũng bị treo (được đánh dấu Sở trên cùng). Tải chỉ hiển thị việc sử dụng cpu.

Cũng có các công cụ để đo tải đĩa, imho chúng ít nhất cũng quan trọng như giám sát sử dụng cpu, nhưng bằng cách nào đó nó không được biết đến nhiều ở đây trong thế giới sysadmin chuyên nghiệp của chúng tôi.


Các công cụ Windows thường phân chia tải với số lượng thực tế của cpus. Điều này khiến một số quản trị viên hệ thống windows chuyên nghiệp sử dụng tải hệ thống theo nghĩa chia này. Họ không đúng và có lẽ sẽ hạnh phúc hơn sau khi bạn giải thích điều này với họ.


CPU đa lõi thực tế là nhiều CPU trên cùng một chip silicon. Không có sự khác biệt.

Trong trường hợp CPU siêu phân luồng có một tác dụng phụ thú vị: tải một cpu làm cho các cặp siêu phân luồng của nó chậm hơn. Nhưng điều này xảy ra ở một lớp sâu hơn những gì mà lập lịch tác vụ thông thường xử lý, mặc dù nó có thể (và nên) ảnh hưởng đến các quyết định di chuyển quy trình của bộ lập lịch.

Nhưng theo quan điểm hiện tại của chúng tôi - điều quyết định tải hệ thống - điều đó cũng không quan trọng.


4

Vì siêu phân luồng không thực sự là lõi thứ 2, nó sẽ không bao giờ lấy lõi đến 200% nhưng nó sẽ vượt quá 100% cho một khối lượng công việc nhất định.

Vì vậy, tải tối đa của bạn ở đâu đó không xác định trong khoảng từ 4 đến 6

(tất nhiên điều này có thể tăng lên cao hơn khi quá tải vì nó thực sự tính các quy trình có thể chạy được, đặc biệt là khi họ đang chờ IO)


4

Tải trung bình không có nghĩa là những gì bạn nghĩ nó có nghĩa. Đây không phải là về việc sử dụng CPU ngay lập tức, mà là có bao nhiêu quá trình đang chờ để chạy. Thông thường đó là vì rất nhiều thứ muốn CPU, nhưng không phải lúc nào cũng vậy. Thủ phạm phổ biến là một quá trình chờ IO - đĩa hoặc mạng.

Hãy thử chạy ps -e vvà tìm kiếm các cờ trạng thái quá trình.

state    The state is given by a sequence of characters, for example, "RWNA". The      first character indicates the run state of the process:
D    Marks a process in disk (or other short term, uninterruptible) wait.
I    Marks a process that is idle (sleeping for longer than about 20 seconds).  
L    Marks a process that is waiting to acquire a lock.
R    Marks a runnable process.
S    Marks a process that is sleeping for less than about 20 seconds.
T    Marks a stopped process.
W    Marks an idle interrupt thread.
Z    Marks a dead process (a "zombie").

Đây là từ pstrang chủ, vì vậy bạn tìm thấy chi tiết hơn ở đó - RDcác quy trình có thể được quan tâm đặc biệt.

Bạn có thể kết thúc với tải trọng 'gai' trung bình vì tất cả các loại lý do, vì vậy chúng không thực sự là thước đo tốt cho bất cứ điều gì khác ngoài 'hệ thống này có bận không'. Việc sa lầy vào trung bình tải ánh xạ tới các lõi CPU sẽ không giúp ích gì cho bạn.


3

Trên hệ thống Linux, không chỉ các quy trình trong hàng đợi có thể chạy được tính để tải mà còn cả các quy trình ở trạng thái ngủ không bị gián đoạn, wikipedia , khiến tải tăng đột biến khi bạn có nhiều quy trình đang chờ đĩa.


Tôi không biết điều đó, sẽ ghi nhớ nó!
Bartek Szablowski

2

Tôi đã thực hiện một số thử nghiệm trên hệ thống Xeon 24 lõi của chúng tôi (2 ổ cắm x 12 lõi). Tải tối đa là 48,0 trong trường hợp này do cách Linux thiết lập siêu phân luồng.

Tuy nhiên, bạn không nhận được tương đương với 48 lõi thông lượng. Những gì tôi đã quan sát là bạn nhận được khoảng 90% thông lượng trong 24 bộ xử lý logic đầu tiên, tức là nếu tải chạy đến 24.0. Sau đó, bạn nhận được thông lượng bổ sung khoảng 10% cho 24 bộ xử lý logic còn lại (tải chạy đến 48.0). Một cách nghĩ khác là nếu bạn chạy 48 luồng trên 24 lõi, bạn sẽ nhận được mức tăng khoảng 10-20% nếu bạn kích hoạt siêu phân luồng so với không. Nó không tăng 100% như những người tiếp thị sẽ ngụ ý.

Ví dụ: một cách để kiểm tra quan sát này là có một quy trình chạy 48 luồng (giả sử sử dụng TBB hoặc mô hình luồng được điều khiển bằng tay), sau đó chạy

time numactl --physcpubind=0-23  ./myprocess

và sau đó chạy

time numactl --physcpubind=0-47  ./myprocess

Cái sau sẽ chạy trong khoảng 10-20% thời gian ít hơn. Nếu quy trình của bạn bị chặn I / O cao, thì kết quả có thể khác.

Cái trước sẽ vô hiệu hóa siêu phân luồng bằng cách chỉ cho phép các luồng chạy trên một bộ xử lý logic duy nhất (của mỗi lõi), trong khi cái sau sẽ cho phép siêu phân luồng bằng cách cho phép các luồng chạy trên 2 bộ xử lý logic (của mỗi lõi).

Tải trong cả hai trường hợp nên được báo cáo là 48.0 ... mà bạn có thể thấy là rất sai lệch.

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.