這次入手 i7 迷你旗艦,滿滿的 RAM 跟又快又大的 SSD 是重點,我選了號稱能 7GB/s 讀寫的 2TB PCIe gen4 M.2 SSD。

一試果然驚人,實測最高速飆上 6.5GB/s!

但高速是有代價的,溫度也非常驚人! 裝機搬移資料連續 Copy 了數十 GB 資料,溫度飆上 70 度,電腦附贈的 SSD 散熱片壓不住啊!

之前研究過 SSD 壽命問題(延伸閱讀:SSD、USB 行動碟擺很久沒用資料會消失?),我知道快閃記憶體寫入次數有限,而且高溫會增加資料遺失機率及縮短壽命。SSD 晶片有過熱保護,溫度太高時(例如:超過 70 度)會限速降溫,官方規格的運作溫度上限是 85 度,理論上不用太擔心。但這是機率問題,溫度愈高壞掉機率就愈高,即便有保固換新,資料遺失及重建系統都是麻煩事。

要降低 SSD 溫度,正常人的思路會去找可以塞進小機殼但效果更強的散熱片(甚至有自帶小風扇的款式),花點小錢搞定,省時省事。

但大家都知道我不是正常人,發現 SSD 溫度偏高後便啟動了「智慧型輔助散熱系統」專案,打算用 ESP 開發板(延伸閱讀:也來玩物聯網:窮人的原子彈 - ESP 開發板) 監控迷你電腦的 CPU 及 SSD 溫度,視需要啟動外部風扇側吹輔助降溫。而第一步,是要設法取得 CPU 及 SSD 的溫度數據。

說實話,這個 Side Project 也是好玩與練功居多,免費軟體 CrystalDiskInfo 可常駐工作列顯示 SSD 溫度:

試過放小風扇側吹,SSD 溫度就能穩穩降到 32 度的漂亮數字,順便連 CPU 一起降溫。小風扇一支 300 元有找,除了聲音稍大跟技術含量偏低,稱得上是理想的解決方案。

不過,怎麼想都覺得土砲智慧式散熱裝置是個難度不高又實用有趣的點子,DIY 的成就感無價! Let's Go。

要怎麼用程式取得 CPU 跟 SSD 的溫度呢?

著名的開源工具 Open Hardware Monitor 可以顯示 CPU 頻率、溫度、電壓、記憶體、主板等各項資料,其中有包含 SSD 溫度。


圖片來源

幸運的是 Open Hardware Monitor 是用 C# 開發的,還有人 Fork 包成程式庫,支援 .NET 4.7 跟 .NET 6 - LibreHardwareMonitor

參考專案首頁的範例,三兩下就完成這個一秒顯示一次 SSD 與 CPU 溫度的簡單程式:(程式需使用管理者權限執行)

using System.Text.RegularExpressions;
using LibreHardwareMonitor.Hardware;

Dictionary<string, string> watchList = new Dictionary<string, string>
{
    // /inetlcpu/0/temperature/12 為感測器識別碼,各機器不同,事先查詢設定好
    ["/intelcpu/0/load/0"] = "CPU Load %",
    ["/intelcpu/0/temperature/12"] = "CPU CurrTemp",
    ["/intelcpu/0/temperature/25"] = "Core MaxTemp",
    ["/intelcpu/0/temperature/26"] = "Core AvgTemp",
    ["/nvme/0/temperature/0"] = "SSD CurrTemp",
    ["/nvme/0/temperature/6"] = "SSD  MaxTemp"
};

var cancelSource = new CancellationTokenSource();
var task = Monitor(cancelSource.Token);
Console.ReadKey();
cancelSource.Cancel();
await task.ConfigureAwait(false);

async Task Monitor(CancellationToken cancellation)
{
    Computer computer = new Computer
    {
        IsCpuEnabled = true,
        IsGpuEnabled = false,
        IsMemoryEnabled = false,
        IsMotherboardEnabled = false,
        IsControllerEnabled = false,
        IsNetworkEnabled = false,
        IsStorageEnabled = true
    };
    computer.Open();
    var firstRun = true;
    Console.Clear();
    while (!cancellation.IsCancellationRequested)
    {
        computer.Accept(new UpdateVisitor());
        Console.CursorLeft = Console.CursorTop = 0;
        Console.WriteLine($"==== {DateTime.Now:HH:mm:ss} ====");
        foreach (IHardware hardware in computer.Hardware)
        {
            // Convert To ValueTuple
            foreach (var sensor in hardware.Sensors
                .Select(o => new { Id = o.Identifier.ToString(), o.Value })
                .Where(o => watchList.ContainsKey(o.Id)))
            {
                if (firstRun)
                {
                    Console.WriteLine(
                        $"{watchList[sensor.Id],12}: {sensor.Value:n1}  ");
                }
                else
                {
                    Console.CursorLeft = 14;
                    Console.WriteLine($"{sensor.Value:n1}");
                }
            }
        }
        firstRun = false;
        try
        {
            await Task.Delay(1000, cancellation);
        }
        catch (TaskCanceledException)
        {

        }
    }
    computer.Close();
}

public class UpdateVisitor : IVisitor
{
    public void VisitComputer(IComputer computer) => computer.Traverse(this);
    public void VisitHardware(IHardware hardware)
    {
        hardware.Update();
        foreach (IHardware subHardware in hardware.SubHardware)
            subHardware.Accept(this);
    }
    public void VisitSensor(ISensor sensor) { }
    public void VisitParameter(IParameter parameter) { }
}

這樣,我們就具備了讀取 CPU 及 SSD 溫度的能力,可以開始搞些有趣應用,例如:長期記錄溫度變化建立基準值(Baseline)、實驗負載與溫度關連、觀察不同散熱方法成效、設定目標控制外掛風扇控溫... 等,後面再來慢慢研究。

Example of reading SSD and CPU temperature with C#.


Comments

Be the first to post a comment

Post a comment