Saturday, November 27, 2004

Thermal Throttling ของซีพียู

&

วันก่อนระหว่างลองคอมไพล์ Kernel 2.6.9 ให้ Samurai ไปเจอตัวเลือกน่าสนใจ "check for P4 thermal throttling interrupt" (CONFIG_X86_MCE_P4THERMAL=y) สงสัยว่าเหมือนกับ Speed Step ของพวก Notebook หรือเปล่า น่าสนใจว่าเดี๋ยวนี้ P4 ตั้งโต๊ะก็มีแบบนี้ด้วย

ปรากฏว่าเลือกตัวเลือกนี้แล้วก็เห็นผลทันตา บูทด้วย Kernel ใหม่ แล้วคอมไพล์โปรแกรมอะไรหนักๆสักหน่อย จะขึ้นข้อความใน Log และบนจอของผู้ใช้ทุกคนเลย ว่า

Nov 22 20:41:55 samurai kernel: CPU0: Temperature above threshold
Nov 22 20:41:55 samurai kernel: CPU1: Temperature above threshold
Nov 22 20:41:55 samurai kernel: CPU1: Running in modulated clock mode
Nov 22 20:41:55 samurai kernel: CPU0: Running in modulated clock mode
พอดีมี HyperThread ก็เลยขึ้นแยกกันของ CPU0/1 แต่จริงๆแล้วมีตัวเดียว สงสัยว่าทำอย่างไรจึงไปขึ้นบนจอทุกคนด้วย ไปเจอคำตอบในไฟล์ /etc/syslog.conf เขียนไว้ว่า
*.emerg                         *
แล้วพอดีข้อความ "Temperature above threshold" นี่ถูกส่งออกมาที่ระดับ "emerg" ดูได้ใน linux-2.6.9/arch/i386/kernel/cpu/mcheck/p4.c

หลังจากนั้นเมื่อไม่มีโหลดสักพัก ข้อความว่าทุกอย่างกลับคืนสู่สภาวะปกติจะปรากฏขึ้นดังนี้

Nov 22 20:42:00 samurai kernel: CPU0: Temperature/speed normal
Nov 22 20:42:00 samurai kernel: CPU1: Temperature/speed normal

ประเมินปัญหา

อยากรู้ว่าเครื่องจะช้าลงแค่ไหน ลองดูใน /proc/acpi/processor/CPU1/throttling แล้วเห็นในอยู่สถานะ T0 คือ ปกติ ตลอด ไม่ได้บอกว่าช้าลง

# cat /proc/acpi/processor/CPU1/throttling 
state count:             8
active state:            T0
states:
   *T0:                  00%
    T1:                  12%
    T2:                  25%
    T3:                  37%
    T4:                  50%
    T5:                  62%
    T6:                  75%
    T7:                  87%
ตกลงเลยเอาโปรแกรม PiBench ฉบับ Java มาแก้ ให้วนลูปทำซ้ำไปเรื่อยๆ และแสดงเวลาแต่ละครั้งออกมา ถ้าเวลาเพิ่มขึ้นเรื่อยๆก็แสดงว่าซีพียูทำงานช้าลง

ได้ผลดังนี้

Pi 3.1415926445762157 Time:1862 at 1862
Pi 3.1415926445762157 Time:1857 at 3721
...
Pi 3.1415926445762157 Time:1865 at 26012
Pi 3.1415926445762157 Time:1885 at 27897
Pi 3.1415926445762157 Time:1912 at 29809
Pi 3.1415926445762157 Time:1936 at 31746
Pi 3.1415926445762157 Time:1951 at 33697
Pi 3.1415926445762157 Time:1958 at 35655
Pi 3.1415926445762157 Time:1991 at 37646
Pi 3.1415926445762157 Time:1992 at 39638
Pi 3.1415926445762157 Time:2002 at 41640
...
Pi 3.1415926445762157 Time:2194 at 107595
Pi 3.1415926445762157 Time:2200 at 109796
Pi 3.1415926445762157 Time:2202 at 111999
Pi 3.1415926445762157 Time:2207 at 114206
คือ เริ่มต้นใช้เวลาประมาณ 1.8 วินาทีต่อการคำนวนหนึ่งครั้ง แต่จะเริ่มช้าลงเมื่อเวลาผ่านไปประมาณ 27 วินาที จนไปคงที่ ที่ประมาณ 2.2 วินาทีต่อการคำนวนหนึ่งครั้ง คือ ช้าลงไปประมาณ 18%

เอาข้อมูลไปวาดกราฟได้ ดังนี้ (แกนนอนคือเวลาที่ผ่านไป แกนตั้งคือเวลาที่ใช้ในการคำนวนหนึ่งรอบ)

เห็นชัดว่าช้าลงจริง

ลองจนสนุกพอแล้วชักเริ่มเกิดอาการเครียด พัดลมตัวเบ้อเริ่ม ที่ใช้ก็เป็นอันที่แถมมากับ CPU ในกล่องสีส้มของ Intel ทำไมยังระบายความร้อนไม่พอ ? Intel ไม่น่าจะให้มาต่ำกว่าความต้องการ แถมอากาศในห้องก็เย็นประมาณ 20C ไม่ได้ OverClock ด้วยซ้ำไป มันน่าจะมีอะไรผิดปกติ

นึกได้ว่าตอนกดยึดพัดลมให้ติดกับ Motherboard เขาบอกให้กดทั้งสี่มุมจนได้ยินเสียงคลิก ตอนประกอบได้ยินเสียงแค่สองมุม อีกสองมุมกดแรงมากแล้วยังไม่ได้ยินอะไร ก็เลยคิดว่าติดดีแล้ว เพราะตอนแรกสอดสองมุมนี้เข้าไปก่อน

เลือดขึ้นหน้าเปิดเครื่องออกมาใหม่ กดอีกสองมุมที่เหลือแรงสุดๆ Motherboard งอแทบติดตัวกล่อง ได้ยินเสียง ติ้ก ไม่รู้ติ้กเพราะยึดติด หรือติ้ก Motherboard หัก

ปรากฏว่าได้ผลแฮะ ข้อความ Thermal Interrupt หายไปจากจอไม่โผล่ขึ้นมาให้เห็นอีกเลย และกราฟก็ดูสวยขึ้น

แต่ถ้ายังอยากให้เครื่องช้าลง สามารถสั่งได้โดย

echo 5 > /proc/acpi/processor/CPU1/throttling 
ตัวเลขที่ใช้ได้ ก็ 0-7 ดังที่แสดงออกมาตอน cat หรืออยากได้กราฟแบบนี้อีกก็ถอดไฟพัดลมออกได้

คิดว่ายังโชคดีที่ซื้อ Pentium 4 มา เคยได้ยินว่าถ้าเป็นแบบนี้กับ Athlon ละก็ ไหม้ ไปเลย ไม่รู้ว่ารุ่นใหม่ๆดีขึ้นแล้วหรือยัง

ปัญหาบนเครื่อง Notebook

เอาไปลองกับ P4 ใน Notebook ของ SONY บ้าง รุ่นนี้ SONY เอา P4-2.6 สำหรับ Desktop มายัดใสตัวถัง Notebook หนักกว่า 3Kg เอาไว้ตั้งโต๊ะแทน Desktop คงไม่มีใครหิ้วไปหิ้วมา

ผลออกมาเกินคาด รันโปรแกรมไว้ 1 ชม. ความเร็วลดลงไปเหลือประมาณ 1/2 ของความเร็วปกติ แปลว่าระบบระบายความร้อนของ SONY Notebook พวกนี้ทำมาชุ่ยๆ มิน่าวันก่อนรันโปรแกรมแปลงไฟล์รายการทีวีที่อัดไว้เป็น DIVX หรือ Import รูปเยอะๆเข้ามาด้วย ACDSee/Picasa ตั้ง Priority ไว้ที่ IDLE ต่ำสุดๆแล้วยังรู้สึกว่าเครื่องโหลดไปเยอะ ที่แท้ไม่ใช่เพราะ CPU Time ถูกแย่งไปอย่างเดียว ความเร็วของ CPU ยังลดลงไปอีกด้วย

ถ้าเป็นรุ่นบางๆเบาๆ เคยเจอมาหลายรุ่นแล้ว (เช่น TOSHIBA PORTEGE เก่าๆ) ถือว่าช่วยไม่ได้ ก็มันบางและเบานี่ แต่นี่รุ่นหนาหนัก น่าจะทำมาให้ดีหน่อย สรุปว่าอย่าเอา Notebook ไปทำงานหนัก

โปรแกรม

ตัวโปรแกรม JHuiBench2.java

import java.util.*;

class JHuiBench2 {
    public static void main(String[] args) {
        int i,j;
        long t0 = (new Date()).getTime();

        while(true) {
        double x=0;
        long t1 = (new Date()).getTime();
        for(i=1;i<300000000;i+=4) {
            x += 1.0/i - 1.0/(i+2);
        }
        long t2 = (new Date()).getTime();
        System.out.println("Pi "+(x * 4.0)+" Time:"+(t2-t1)+" at "+(t2-t0));
        }
    }
}
รันโดย
javac JHuiBench2.java
java JHuiBench2 > out.txt &
tail -f out.txt 
ปล่อยไว้นานพอแล้วก็ Kill ทิ้ง แล้วเอามาวาดกราฟโดยใช้ gnuplot ผ่านสคริปต์ plot.sh โดยเรียก plot.sh out.txt
$ cat plot.sh
#!
gnuplot <<EOF
set terminal png
set output '$1.png'
plot [0:][0:] '$1' using 2:1 'Pi %*lf Time:%lf at %lf' t "Time (msec)" with lines   

EOF
จะได้ out.txt.png ออกมา

หมายเหตุ: "&" บรรทัดแรกสุดเอาไว้หลอก Planet

No comments: