ทำไม cpuinfo_cur_freq และ / proc / cpuinfo รายงานตัวเลขต่างกัน


13

เมื่อฉันทำ

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

ฉันได้รับ 1.8 - 2.7 GHz ไม่เคยสูงกว่า 2.7

และเมื่อฉันทำ

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

ฉันได้รับ 768 MHz - 1.8 GHz มันไม่เคยสูงกว่า 1.8

ใครรู้ว่าเกิดอะไรขึ้น

คำตอบ:


14

ขณะนี้ CPU ส่วนใหญ่มีความสามารถในการปรับความเร็วเพื่อช่วยในการประหยัดพลังงานแบตเตอรี่ โดยทั่วไปแล้วมันเรียกว่าความถี่ CPU ปรับ ความเร็วของ CPU แบบเรียลไทม์รายงานโดย:

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

ความเร็ว CPU แบบสัมบูรณ์ (สูงสุด) กำลังถูกรายงานโดยสิ่งนี้:

$ cat /proc/cpuinfo

บรรทัดนี้โดยเฉพาะ:

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

บรรทัดที่แสดงcpu MHz ไม่แสดงความเร็วสูงสุดของ CPU ของคุณ ค่านี้เป็นความเร็วปัจจุบันของคุณ บนระบบมัลติคอร์เช่น i7 หรือ i5 คุณสามารถเห็นสิ่งนี้ได้ด้วยคำสั่งนี้:

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

อย่างไรก็ตามคุณสามารถดูความเร็วสูงสุด (สูงสุด) ด้วยคำสั่งนี้:

$ 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

หมายเหตุ: จำนวนแกนที่มีNUMAS node0 CPU(s)คือ 4 คือ 0,1,2 และ 3

การปรับซีพียูและการควบคุม

โหมดที่ระบบของคุณใช้อยู่เรียกว่าเครื่องปรับขนาด คล้ายกับผู้ว่าการรถ คุณสามารถดูว่าอันไหนใช้ได้กับคำสั่งนี้:

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

นอกจากนี้คุณยังสามารถดูว่าอันใดที่เปิดใช้งานอยู่ในปัจจุบัน:

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

หมายเหตุ:คำสั่งฉันแสดงเฉพาะ ได้แก่ ซีพียู cpu01, คุณสามารถแทนที่ใน*ในเส้นทางเพื่อดูแกนทั้งหมดหรือคุณสามารถเลือกดูcpu1เป็นต้น

คุณสามารถดูความเร็ว CPU สูงสุด & ต่ำสุดที่ใช้ได้สำหรับโปรไฟล์ของผู้ว่าการของคุณ:

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

รายละเอียดเพิ่มเติมมีอยู่ในบทความนี้หัวข้อ: การปรับความถี่ของ CPU ในลินุกซ์กับ cpufreq

แล้ว cpuinfo_cur_freq ล่ะ

พารามิเตอร์นี้เกี่ยวข้องกับสเปคของ CPU มากขึ้นและมีโปรไฟล์ใดบ้างในปัจจุบันมากกว่าสิ่งใดที่มีประโยชน์เกี่ยวกับการทำงานของ CPU ในปัจจุบัน สำหรับ telemetry ที่ใช้งานจริงฉันจะใช้scaling_*เคอร์เนลที่ปรับได้

ตัวอย่าง

ฉันวางสคริปต์ต่อไปนี้เข้าด้วยกันเพื่อแสดงคอลัมน์ CPU Cores ดังนั้นมันจะง่ายกว่าที่จะดูว่า Kernel tunables ต่างๆนั้นมีลักษณะอย่างไร:

#!/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

เมื่อคุณรันมันคุณจะได้ผลลัพธ์ต่อไปนี้:

$ ./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

คุณสามารถเห็นได้ว่าscaling_cur_freqtunable กำลังแสดงการชะลอตัวใน core # 1 & 2


หากเป็นเช่นนั้นจริงจะไม่/proc/cpuinfoรายงานเหมือนกันcpuinfo_cur_freqหรือ มันไม่ชัดเจน! หัวใจของคำถามของฉันยังคงไม่ได้รับการแก้ไข ฉันได้เปิดเผยเครื่องมือนี้ซึ่งดูเหมือนว่าจะรายงาน "ความถี่ที่แท้จริง" อย่างใดอย่างหนึ่ง แต่ฉันไม่แน่ใจว่ามันทำงานได้อย่างถูกต้อง มันให้บางแหล่งที่มาสำหรับอัลกอริทึมของมัน แต่ไม่ได้ให้คำอธิบายที่ดีสำหรับความคลาดเคลื่อน
wulftone

เส้นอย่างเช่น/sys/devices/system/cpu/cpu1/cpufreq/cpuinfo_cur_freqแสดงความเร็วสูงสุดถึงแม้ว่าชื่อจะบอกถึงความเร็วปัจจุบันนี่คือการปลดการเชื่อมต่อที่คุณถามใช่ไหม ระบบของฉันแสดงวิธีนี้เช่นกัน
slm

เมื่อคุณเปิดใช้งานการปรับมาตราส่วนคุณควรใช้สิ่งนี้เพื่อรับความถี่ cpu จริง:/sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq
slm

2
หมายเหตุ: เนื่องจาก Kernel 4.13,cat /proc/cpuinfo | grep MHzไม่ส่งกลับความเร็วสัญญาณนาฬิกาปัจจุบัน ที่ Kernel Bugzilla พวกเขาบอกว่ามันตั้งใจ ดูbugzilla.kernel.org/show_bug.cgi?id=197009 มีการกล่าวถึงที่นี่: phoronix.com/…
Marc.2377

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.