2010-09-22 41 views
10

Có lệnh nào hay cách nào khác để sử dụng CPU hiện tại hoặc trung bình CPU (đối với môi trường đa bộ xử lý) trong Linux?Xác định sử dụng CPU

Tôi đang sử dụng Linux nhúng trong một hệ thống nhỏ. Về cơ bản, tôi cần xác định mức sử dụng CPU, để nếu nó cao, thay vào đó tôi có thể chuyển một tiến trình mới sang bộ điều khiển khác trong hệ thống, thay vì thực hiện trên bộ xử lý chính, có thể bận làm một quá trình quan trọng hơn.

Câu hỏi này không chỉ đơn thuần là ưu tiên quy trình, bộ điều khiển khác có thể xử lý đầy đủ quy trình mới, chỉ khi bộ xử lý chính không bận, tôi muốn nó thực hiện.

+0

Bạn có thể muốn sử dụng các lệnh tác vụ để buộc trình lên lịch Linux thực hiện điều đó cho bạn; bạn có thể giới hạn (các) tác vụ cốt lõi nào có thể chạy trên đó. Tôi giả sử bạn đang sử dụng SMP ở đây. – MarkR

+0

Tại sao bạn lại lặp lại câu trả lời của huseyinalb và sau đó tự chọn? Điều này có vẻ như một số nỗ lực để trò chơi hệ thống danh tiếng. – Amoss

+0

Tôi có được danh tiếng gì khi trả lời câu hỏi của riêng mình? –

Trả lời

6

Bạn cần phải lấy mẫu các giá trị trong /proc/stat tại hai lần, và tính toán việc sử dụng trung bình trong thời điểm đó. (Việc sử dụng tức thời không mang lại nhiều ý nghĩa - nó sẽ luôn là 100% trên một máy tính lõi đơn, vì mã đo lường sử dụng của bạn đang chạy bất cứ khi nào có vẻ).

3

Hệ thống tệp/proc có tất cả các loại thông tin thú vị. Hãy xem man proc để biết thêm thông tin.

+0

bạn có thể cụ thể hơn về việc sử dụng lệnh nào không? –

2

Chỉ sử dụng hàng đầu nếu có. Bạn có thể sử dụng chế độ này ở chế độ không tương tác:

top -n 1 

Nếu bạn muốn một thứ gì đó cụ thể thì chỉ cần grep xuất. Các chi tiết chính xác sẽ phụ thuộc vào cách lệnh hàng đầu của bạn định dạng đầu ra của nó, nhưng ví dụ:

top -n 1 | grep 'Load' 
+0

Không chính xác, điều đó sẽ cho bạn thời gian tải trung bình không giống với việc sử dụng CPU. (trước đây được trích xuất từ ​​/ proc/loadavg trong khi thứ hai từ/proc/stat) [xem man proc] – tsotso

+0

Không, đó là chính xác. Các * ví dụ * mà tôi đã cho lấy trung bình tải, nhưng * phương pháp * cũng có thể kéo ra sử dụng CPU.Trên OSX và linux, định dạng hơi khác nhau, nhưng trên cả hai hệ thống, nó là dòng bên dưới tải giúp dễ dàng lọc ra. – Amoss

9
cat /proc/stat 

bạn sẽ thấy một cái gì đó như thế này

cpu 178877 11039 58012 5027374 22025 2616 1298 0 0 
cpu0 122532 8808 34213 2438147 10881 1050 448 0 0 
cpu1 56344 2230 23799 2589227 11143 1565 850 0 0 

Đơn giản chỉ cần lấy số tiền của ba số đầu tiên và chia chúng với số tiền bốn số nguyên đầu tiên

4 số đầu tiên là người sử dụng, đẹp, hệ thống và thời gian không hoạt động

lưu ý: Điều này mang lại mức trung bình tổng thể. Nếu bạn muốn lấy trung bình tự phát, bạn nên lấy hai mẫu và trừ chúng ra khỏi nhau trước khi chia.

+0

Đây có phải là về% hoặc một số yếu tố không? Ý tôi là, giá trị tối đa có thể ở đây là 100 hay 1? –

20

Câu trả lời cho câu hỏi sau khi tìm kiếm và mày mò nhiều:

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    long double a[4], b[4], loadavg; 
    FILE *fp; 
    char dump[50]; 

    for(;;) 
    { 
     fp = fopen("/proc/stat","r"); 
     fscanf(fp,"%*s %Lf %Lf %Lf %Lf",&a[0],&a[1],&a[2],&a[3]); 
     fclose(fp); 
     sleep(1); 

     fp = fopen("/proc/stat","r"); 
     fscanf(fp,"%*s %Lf %Lf %Lf %Lf",&b[0],&b[1],&b[2],&b[3]); 
     fclose(fp); 

     loadavg = ((b[0]+b[1]+b[2]) - (a[0]+a[1]+a[2]))/((b[0]+b[1]+b[2]+b[3]) - (a[0]+a[1]+a[2]+a[3])); 
     printf("The current CPU utilization is : %Lf\n",loadavg); 
    } 

    return(0); 
} 

Tôi nhận được các giá trị tương tự như những báo cáo của System Monitor.

+0

wont đọc tệp siêu chậm? – j0h

+0

Không, j0h, đây là tệp procfs. Đó không phải là một hệ thống tập tin bình thường. PS: Xin lỗi vì đã necro, nhưng tôi phải trả lời. – ArsenArsen

+0

Tại sao dài gấp đôi và không dài int? – RicoRico