Tại sao cpuinfo_cur_freq và / Proc / cpuinfo báo cáo các số khác nhau?


13

Khi tôi làm

sudo watch -n1 cat /sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_cur_freq

Tôi nhận được 1,8 - 2,7 GHz. Nó không bao giờ vượt quá 2.7.

Và khi tôi làm

watch -n1 "cat /proc/cpuinfo | grep MHz"

Tôi nhận được 768 MHz - 1,8 GHz. Nó không bao giờ vượt quá 1,8.

Có ai biết điều gì sắp tới không?

Câu trả lời:


14

Hầu hết các CPU hiện nay đều có khả năng điều chỉnh tốc độ của chúng để giúp tiết kiệm mức sử dụng pin / năng lượng. Nó thường được gọi là nhân rộng tần số CPU . Tốc độ thời gian thực của CPU được báo cáo bởi điều này:

$ sudo cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq

Tốc độ CPU tuyệt đối (tối đa) đang được báo cáo bởi điều này:

$ cat /proc/cpuinfo

Cụ thể dòng này:

model name  : Intel(R) Core(TM) i5 CPU       M 560  @ 2.67GHz

Dòng hiển thị cpu MHz không hiển thị tốc độ tối đa của CPU của bạn. Giá trị này là tốc độ hiện tại của bạn. Trên hệ thống đa lõi như i7 hoặc i5, bạn có thể thấy điều này với lệnh này:

$ cat /proc/cpuinfo |grep MHz
cpu MHz     : 1199.000
cpu MHz     : 1199.000
cpu MHz     : 1199.000
cpu MHz     : 2667.000

Tuy nhiên, bạn có thể thấy tốc độ (tối đa) tuyệt đối với lệnh này:

$ lscpu 
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
CPU(s):                4
Thread(s) per core:    2
Core(s) per socket:    2
CPU socket(s):         1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 37
Stepping:              5
CPU MHz:               2667.000
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              3072K
NUMA node0 CPU(s):     0-3

LƯU Ý: số lõi mà nó có, NUMAS node0 CPU(s)là 4, tức là 0,1,2 và 3.

CPU mở rộng & quản trị?

Chế độ mà hệ thống của bạn đang ở được gọi là thống đốc tỷ lệ. Tương tự như một thống đốc trên một chiếc xe hơi. Bạn có thể xem những cái nào có sẵn với lệnh này:

$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
powersave ondemand userspace performance 

Bạn cũng có thể xem cái nào đang hoạt động:

$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
ondemand

LƯU Ý: Các lệnh tôi đang hiển thị chỉ bao gồm cpu thứ nhất , cpu0. Bạn có thể thay thế trong một *đường dẫn để xem tất cả các lõi hoặc bạn có thể thấy có chọn lọc cpu1, v.v.

Bạn có thể thấy tốc độ CPU tối đa và tối thiểu có sẵn cho hồ sơ của thống đốc của bạn:

$ sudo cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq
2667000
$ sudo cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_min_freq 
1199000

Chi tiết hơn có sẵn trong bài viết này, có tiêu đề: nhân rộng tần số CPU trong Linux với cpufreq .

Vậy còn cpuinfo_cur_freq thì sao?

Tham số này có liên quan nhiều hơn đến đặc điểm kỹ thuật của CPU và cấu hình hiện tại của nó, thay vì bất kỳ thứ gì hữu ích liên quan đến cách CPU hiện đang hoạt động. Đối với hoạt động từ xa thực tế, tôi sẽ sử dụng các bộ điều chỉnh scaling_*hạt nhân.

Thí dụ

Tôi kết hợp các kịch bản sau đây để hiển thị cột CPU Lõi để có thể dễ dàng hơn để xem các bộ điều chỉnh Kernel khác nhau trông như thế nào:

#!/bin/bash

nthCore=$(lscpu|grep node0|cut -d"-" -f2)

for i in /sys/devices/system/cpu/cpu0/cpufreq/{cpuinfo,scaling}_*; do
  pname=$(basename $i)
  [[ "$pname" == *available* ]] || [[ "$pname" == *transition* ]] || \
  [[ "$pname" == *driver* ]]    || [[ "$pname" == *setspeed* ]] && continue
  echo "$pname: "
  for j in `seq 0 $nthCore`;do
    kparam=$(echo $i | sed "s/cpu0/cpu$j/")
    sudo cat $kparam
  done
done | paste - - - - - | column -t

Khi bạn chạy nó, bạn nhận được đầu ra sau đây:

$ ./cpuinfo.bash
cpuinfo_cur_freq:  2667000   2667000   2667000   2667000
cpuinfo_max_freq:  2667000   2667000   2667000   2667000
cpuinfo_min_freq:  1199000   1199000   1199000   1199000
scaling_cur_freq:  2667000   2266000   1333000   2667000
scaling_governor:  ondemand  ondemand  ondemand  ondemand
scaling_max_freq:  2667000   2667000   2667000   2667000
scaling_min_freq:  1199000   1199000   1199000   1199000

Bạn có thể thấy rằng scaling_cur_freqđiều chỉnh được hiển thị chậm trong lõi # 1 & 2.


Nếu đó là sự thật, sẽ không /proc/cpuinfobáo cáo giống như cpuinfo_cur_freq? Rõ ràng là không! Trọng tâm của câu hỏi của tôi vẫn chưa được giải quyết. Tôi đã phát hiện ra công cụ này có vẻ như bằng cách nào đó báo cáo "tần số thực", nhưng tôi không chắc nó hoạt động chính xác. Nó cung cấp một số nguồn cho thuật toán của nó, nhưng không thực sự cung cấp một lời giải thích tuyệt vời cho sự khác biệt.
wulftone

Các dòng như /sys/devices/system/cpu/cpu1/cpufreq/cpuinfo_cur_freqđang hiển thị tốc độ tối đa, mặc dù tên của chúng có nghĩa là tốc độ hiện tại, đây là ngắt kết nối mà bạn đang hỏi, phải không? Hệ thống của tôi cho họ thấy theo cách này là tốt.
slm

Khi bạn bật thang đo tần số, bạn nên sử dụng tần số này để có được tần số cpu thực tế:/sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq
slm

2
Lưu ý: Kể từ Kernel 4.13, cat /proc/cpuinfo | grep MHzkhông còn trả về tốc độ xung nhịp hiện tại . Tại Kernel Bugzilla, họ nói đó là cố ý. Xem bugzilla.kernel.org/show_orms.cgi?id=197009 . Nó cũng đề cập ở đây: phoronix.com/...
Marc.2377

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.