Skip to content

Instantly share code, notes, and snippets.

@nknytk
Last active February 14, 2021 07:22
Show Gist options
  • Save nknytk/424c50b38ad16e9059e4aef6014da5ec to your computer and use it in GitHub Desktop.
Save nknytk/424c50b38ad16e9059e4aef6014da5ec to your computer and use it in GitHub Desktop.
熱伝導シートでGPD Pocketをファンレス化する

まとめ

GPD Pocketの内部に熱伝導シートを貼り筐体から熱を発散させることで、CPUファンを完全に停止して無音化しても温度上昇を抑え安全に運用できる。

目的

GPD PocketにUbuntu 20.04を導入したところ、負荷とは無関係にCPUファンが一定の速度で回り続けており、音が気になる。
CPUファンを完全に停止して無音化したい。ただし、熱による処理性能の低下は防ぎたい。

実施内容

  • CPUファン停止
    • 筐体の裏蓋を外し、CPUファンのコネクタを抜いて完全にファンを止める
    • OSからCPUファンを認識できておらず、回転数制御ができなかったため
  • 絶縁熱伝導シート追加
    • 筐体の裏蓋を外し、CPUとチップセットに熱伝導シートを貼る
    • 熱伝導シートを筐体の裏蓋に接触させ、筐体から排熱する

裏蓋を開けてCPUファンのコネクタを外し、チップセット放熱用のシートを剥がす。 before

下記のように合計3枚の熱伝導シートを貼る。 after

裏蓋と熱伝導シートを密着させるためネジに力を加えて締め込んでおり、ネジとネジ穴が長期使用に耐えられるかどうかが懸念点である。

使用したもの

ハードウェア

  • GPD Pocket
    • CPUにAtom x7-Z8750を搭載した初期モデル
  • 絶縁熱伝導シート
  • 裏蓋開閉用の小型プラスドライバー

ソフトウェア

負荷時のCPU温度測定のため、sysbenchlm-sensorsを使用

$ sudo apt install sysbench lm-sensors

排熱性能の確認

sysbenchによりCPU全コアを100%で稼働させ、15分間の連続負荷によるCPU温度上昇と、負荷が終わった後5分間での温度低下を確認した。計測時の室温は20℃であった。 Figure_1

無対策でCPUファンを停止した場合、CPUファン稼働時と比べてCPU温度が大きく上がり夏場での連続使用に不安を覚える状態となった。一方、熱伝導シートを追加した場合はCPUファンを完全に停止してもCPU温度が上がらず、問題なく使用できる。
熱伝導シートによるファンレス排熱時は負荷時の温度上昇・無負荷時の温度低下どちらも緩やかになっており、筐体の熱容量の大きさにより温度変化が抑えられている様子が伺える。より長時間にわたって高負荷をかけた場合は排熱できなくなる可能性があるが、そのような使用方法は予定しておらず、現実には問題にならないと考えている。

sysbench cpu --threads=4 --time=900 run > perf.log & disown
python3 -u temp.py 1200 | tee temp.log
""" 計測結果のグラフ化に使用したスクリプト """
from datetime import datetime
import sys
from matplotlib import rcParams
import matplotlib.pyplot as plt
rcParams['font.family'] = 'sans-serif'
rcParams['font.sans-serif'] = ['Hiragino Maru Gothic Pro', 'Yu Gothic', 'Meirio', 'Takao', 'IPAexGothic', 'IPAPGothic', 'VL PGothic', 'Noto Sans CJK JP']
def main():
x1, y1 = parse_file('temp.log.1')
x2, y2 = parse_file('temp.log.2')
x3, y3 = parse_file('temp.log')
plt.plot(x1, y1, label='CPUファン稼働(購入時の状態)')
plt.plot(x2, y2, label='CPUファン強制停止')
plt.plot(x3, y3, label='CPUファン強制停止 + 熱伝導シート')
plt.title('CPU温度(℃): sysbench 4スレッド900秒 + 無負荷300秒')
plt.xlabel('経過時間(秒)')
plt.ylabel('CPU温度(℃)')
plt.legend()
plt.grid()
plt.show()
def parse_file(filename):
x = []
y = []
with open(filename) as fp:
fields = fp.readline().split(' ')
time_start = datetime.strptime(fields[0], '%H:%M:%S')
x.append(0)
y.append(float(fields[2]))
for row in fp:
fields = row.strip().split(' ')
timestamp = datetime.strptime(fields[0], '%H:%M:%S')
x.append((timestamp - time_start).seconds)
y.append(float(fields[2]))
return x, y
if __name__ == '__main__':
main()
import subprocess
import sys
from time import sleep, time
from datetime import datetime
import json
""" CPU温度と周波数を計測、記録する """
def main():
duration = int(sys.argv[1])
starttime = time()
while time() - starttime < duration:
now = datetime.now().strftime("%H:%M:%S")
temps = coretemp()
freqs = cpufreq()
avgtemp = sum(temps)/len(temps)
maxtemp = max(temps)
avgfreq = round(sum(freqs)/len(freqs), 2)
maxfreq = max(freqs)
print(now, avgtemp, maxtemp, avgfreq, maxfreq)
sleep(3)
def coretemp():
sensorlog = json.loads(subprocess.check_output(["sensors", "-j", "coretemp-isa-0000"]))
coretemp = sensorlog["coretemp-isa-0000"]
temperatures = [
coretemp["Core 0"]["temp2_input"],
coretemp["Core 1"]["temp3_input"],
coretemp["Core 2"]["temp4_input"],
coretemp["Core 3"]["temp5_input"]
]
return temperatures
def cpufreq():
freqs = []
with open("/proc/cpuinfo") as fp:
for row in fp:
if row.startswith("cpu MHz"):
freqs.append(float(row.strip().split(":")[1]))
return freqs
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment