Passively-cooled CPU Thermals (Part 2)

In the first Passively-cooled CPU Thermals post I looked at how the completely fanless Streacom DB4 I built performed under various CPU loads.  A question over on Silent PC Review asked how the thermal curve looked when the CPU was unloaded.  Good question — let’s find out!

It seems logical that a passively-cooled computer that uses heat pipes and large slabs of aluminium will heat up and cool down differently than an air-cooled system with a (relatively) small fin stack.

When I performed the previous round of tests, I ended up with graphs like this:

Thermals 60m at 100%

Now, one thing that niggled away at the back of my mind was how the temperature seemed to spike at the start and then flatten off relatively quickly.  Given that I was sampling the temperature sensors at 5s intervals, I wasn’t sure if the sudden change in angle was just due to a lack of resolution, or because of something else.  Hmmm…

Anyway, the SPCR question gave me an excuse to run another test but instead of putting the CPU under load and heating the system up, this time I’d be unloading the CPU and cooling the system down.  I wondered if/how that would be different.

Test 5 — CPU unloaded from 100% at an ambient temperature of 20°C

The Ryzen 5 1600 was first placed under a 100% load (all 12 threads pegged at 100%) for about an hour until an equilibrium temperature was reached (60⁰C).  The load was then removed and the CPU temperature recorded:

Thermals 60m cooldownMy previous set of results used wider graphs, but when websites scale them
the text ends up a bit small and blurry, so this time I made the graph narrower.
Otherwise the testing and recording setup was identical.

The CPU cooled down from 60⁰C to 49⁰C almost instantly, and then gradually made its way down to 34⁰C over the course of an hour.  It would have cooled down a couple of degrees more, but I wasn’t prepared to wait — that sudden change in angle was even more pronounced and needed investigating.

Obviously 1 hour graphs sampled every 5s were too coarse to shed a whole lot of light on what was happening in those first few seconds, so I had to run some more granular tests.  I figured 1 minute sampled every 1s would do the trick.

Test 6 — CPU loaded to 100% for 60s at an ambient temperature of 20⁰C

First 60s heating up

Test 7 — CPU unloaded from 100% for 60s at an ambient temperature of 20⁰C

First 60s cooling down

Nope, it wasn’t a figment of my imagination.  The sudden change in angle is definitely there — both when heating up and cooling down.

Let’s put the results ‘side-by-side’:

First 60s up and down

What we’re seeing are two different response curves.  When the CPU is initially (un)loaded the temperature changes at ±1⁰C every 1s for about 8–9s.  It then flattens out dramatically and changes by ±1⁰C every 16–24s after that.  Huge difference.

Changes in thermal conductivity can usually be explained by changes in the material or media being used.  In this case we have a CPU, soldered to a copper IHS, plated in nickel, covered by a thin layer of TIM, covered by a copper shim, covered by TIM, clamped against an aluminium block with exposed copper heat pipes.

This image (from Streacom’s DB4 Manual) might make the stacking a bit clearer:

CPU Cooling Stack

If we ignore the thin layers of TIM, it’s pretty-much metal all the way through to the heat pipes before we reach the first medium that could possibly have a 16–24x lower thermal conductivity — the water inside the heat pipes themselves.

I suspect that the thermal mass between the heat pipes and the CPU can buffer about 8–9s worth of heat output, and that — due to high thermal conductivity — this mass heats up and cools down rather quickly.  The water in the heat pipes, however, needs to undergo a phase change (from liquid to vapour), travel to the end of the heat pipe, undergo another phase change (from vapour to liquid), and then flow back — a process that could easily be an order of magnitude slower at transferring heat.

Interesting stuff.

At the end of the day it doesn’t matter exactly how thermally conductive your cooling system is — as long as it’s conductive enough to get rid of all of the heat your CPU is producing without impacting performance (i.e. thermally throttling), it’s fine.

The previous tests (and now weeks of daily hammering) show that the DB4+LH6 combination is easily capable of cooling a stock Ryzen 5 1600 — no matter how heavily you load it or how long your jobs run for.  You can run a Ryzen 5 1600 at 100% load all day, every day, and it won’t even break a sweat.

AMmmD and Streacommm — I’m lovin’ it!  😉

Posted in Silent Computer | Tagged , , , , , , , , , , , | 15 Comments

Passively-cooled CPU Thermals

The Completely Silent Computer I built relies entirely on passive cooling.  Some folks are keen to know how well (or poorly) it works in the real world.  Can it adequately cool a loaded system, or does thermal throttling make it pointless?  Well, it’s time to find out.


As can be seen in these images, the Ryzen 5 1600 that I installed in the DB4 is cooled by heat pipes that transfer heat from the block on the CPU to spreaders attached to the aluminium walls of the case.  Since I installed the optional LH6 Cooling Kit, there are a total of six heat pipes that connect to three spreaders on two walls of the case.


The walls are 13mm-thick extruded aluminium plates.  They weigh a lot.  Heat conducts from the spreaders inside to the exterior surface.  Grooves that run the full height of the exterior walls provide a huge surface area that allows heat to be transferred to air that then flows up and out the top of the plates.


Vents have been machined into the inside of each plate — one towards the bottom and one towards the top — which allow cool air to be drawn into the case, and hot air to flow out.


That’s about it.  Hot air rises due to buoyancy, flows out of the case, creating a negative pressure zone inside the case, which then sucks cool air in through the bottom and sides of the case.  Rinse.  Repeat.  Doesn’t get much simpler.  Totally passive.

Enough ‘theory’ — let’s put this thing to the test!

I searched around a bit and ended up installing a nice little program called Psensor because it would let me produce some clear graphs of how system load affects CPU and GPU temperatures over time.

Note:  This post only deals with CPU thermals.  GPU thermals will come later.

In a passively-cooled system, instantaneous temperatures aren’t actually that useful.  The walls of the case will initially soak up a lot of heat and then radiate/convect some of that heat back into the case, which will heat up the internal components.  What that means is that it takes a lot longer to reach an equilibrium temperature in a passively-cooled system than it does in an air-cooled system (or even a water-cooled system).

To establish a baseline, I monitored CPU temperatures from the moment the computer was turned on, and let it idle for a couple of hours.

Test 0 — CPU idling at an ambient temperature of 20⁰C

Thermals 120m at IDLE

At idle, the 3.2GHz (stock base clock) Ryzen 5 1600 (with 6 cores and 12 threads) — housed in the completely passively-cooled DB4 — reached a temperature of 31⁰C.  That’s 11⁰C above ambient.

If I’d left the test running for a couple more hours the CPU temperature probably would have gotten 1⁰C warmer, but my house was heating up at the same time and the increase in ambient temperature would have impacted on the results — so I didn’t bother extending the test.  Let’s accept 12⁰C above ambient.

Having established a baseline, I then decided to give the CPU a variety of fixed workloads and let them run for as long as it took for the CPU temperature to stabilise.  That ended up being about an hour.

Test 1 — CPU loaded to 25% at an ambient temperature of 21⁰C

Thermals 60m at 25%

At 25% load, the 3.2GHz Ryzen 5 1600  — housed in the passively-cooled DB4 — reached an equilibrium temperature of 47⁰C.  That’s 26⁰C above ambient.  No thermal throttling occurred.

The hottest part of the hottest exterior wall was 37⁰C (as measured with an IR thermometer).  Very warm to the touch, but nothing at all to be worried about — cats would love it.

Test 2 — CPU loaded to 50% at an ambient temperature of 20⁰C

Thermals 60m at 50%

At 50% load, the Ryzen 5 1600 — housed in the passively-cooled DB4 — reached an equilibrium temperature of 52⁰C.  That’s 32⁰C above ambient.  No thermal throttling occurred.

The hottest part of the hottest exterior wall was 40⁰C.  Toasty — borderline hot even — but I was able to press my hand firmly against it for as long as I liked without feeling any discomfort.

Test 3 — CPU loaded to 75% at an ambient temperature of 22⁰C

Thermals 60m at 75%

At 75% load, the Ryzen 5 1600 — housed in the DB4 — reached an equilibrium temperature of 58⁰C.  That’s 36⁰C above ambient.  No thermal throttling occurred.

The hottest part of the hottest exterior wall was 42⁰C.  Hot, and if I pressed my hand firmly against it for more than about 10s it became uncomfortable.

Test 4 — CPU loaded to 100% at an ambient temperature of 22⁰C

Thermals 60m at 100%

At 100% load, the Ryzen 5 1600 in the DB4 reached an equilibrium temperature of 60⁰C.  That’s 38⁰C above ambient.  No thermal throttling occurred.

The hottest part of the hottest exterior wall remained 42⁰C.  Hot to touch, and uncomfortable after a while, but not painful.

So, the first set of real-world results are in!

If we normalise the results for an ambient temperature of 20⁰C then we have the following equilibrium temperatures for a stock 3.2GHz Ryzen 5 1600 in a Streacom DB4 with the optional LH6 Cooling Kit installed:

  • Idle (0%):  32⁰C
  • 25% load:  46⁰C
  • 50% load:  52⁰C
  • 75% load:  56⁰C
  • 100% load:  58⁰C

For the folks that can’t get enough charts:

Thermal Results 1


So, what do these results tell us?

  1. The most obvious thing is that either the Ryzen 5 1600 is a very efficient CPU, the DB4+LH6 is a very effective cooling combination, or both!  To max out at 58⁰C under full load is excellent for a completely passively-cooled system — much better that what I was expecting.
  2. There will clearly be no problem running compute-heavy overnight jobs on this system.  A 100% load for 4–6 hours at a time should be a walk in the park.
  3. Ryzen CPUs thermally throttle north of 90⁰C and shut down at 95⁰C so there is ample room for overclocking the Ryzen 5 1600 to 1600X levels, upgrading to the new Ryzen 5 2600 (and moderately overclocking that), or even stepping up to something like a Ryzen 7 2700 (although I doubt you’d get more than a light overclock out of that).
  4. If a Ryzen 5 1600 or 2600 gives you as much performance as you need (and the 1600 does for me), then I’m confident you could get away with just the stock cooling solution that ships with the DB4 — no need to get the optional LH6 Cooling Kit like I did.  Four heat pipes and a single spreader would provide adequate cooling, but your CPU temps would be noticeably higher (probably in the high 60s or low 70s).
  5. Exterior wall temperatures can get hot, and even uncomfortable after extended contact, but never painful and certainly not dangerous.  No need to worry about the safety of pets or small children (if you have them) — at least not with a stock Ryzen 5 1600 (or 2600).  If you overclock or put in a Ryzen 7 2700 then you’d want to monitor the exterior temperatures yourself to see if they ever climb to hazardous levels.


With the benefit of this real-world testing and hindsight, would I do anything differently if I was building a passively-cooled DB4 system today?  Yep, sure would.

  • I’d get a Ryzen 5 2600 — a little bit more performance for about the same heat.
  • I wouldn’t bother buying the optional LH6 Cooling Kit — it would be overkill for even a moderately-overclocked 2600.
  • Not having to fit the longer LH6 heat pipes would mean that pretty-much all of the component-clearance issues would disappear, and I’d have many more motherboards to choose from.  I’d pick one with two NVMe M.2 slots to cut down on cable clutter.

Apart from that, everything else would stay the same.

Future plans

  • Conduct some load tests on the GPU in isolation.
  • Torture-test the DB4 by doing things like:
    • Loading both the CPU and GPU to 100% at the same time.
      • Not very realistic, but a ‘worst-case’ scenario that deserves to be tested — For Science!
    • Blocking vents while the system is under load.

If you have any questions about the results or methodology above, or you’d like a certain type of thermal test performed, just ask in the comments.

Auf Wiedersehen!

Posted in Silent Computer | Tagged , , , , , , , , , , , , | 9 Comments

Does Pinnacle Ridge change anything?

With AMD’s 2nd Generation Ryzen processors now released and tested, I figured it was worth reviewing the Completely Silent Computer article and seeing if I would have done anything differently if I were building the system today.  The short answer is ‘yes’.

In 2017 AMD released the 1st Generation of Ryzen CPUs with the codename “Summit Ridge”, based on the 14nm Zen microarchitecture:


  • Ryzen 3 1200, 1300X
  • Ryzen 5 1400, 1500X, 1600, 1600X
  • Ryzen 7 1700, 1700X, 1800X

I chose a Ryzen 5 1600 for my system because it has adequate performance for my needs, good performance per Watt, and runs quite cool (65W TDP).

In 2018-02 AMD released the 1st Generation of Ryzen APUs with the codename “Raven Ridge”, also based on the 14mm Zen microarchitecture:

  • Ryzen 3 2200G
  • Ryzen 5 2400G

Just recently, in 2018-04, AMD released the 2nd Generation of Ryzen CPUs with the codename “Pinnacle Ridge”, based on the 12mm Zen+ microarchitecture:

  • Ryzen 5 2600, 2600X
  • Ryzen 7 2700, 2700X


The Ryzen 5 2600 is the natural successor to the 1600 and delivers a minor (~8%) performance boost whilst still staying within the 65W TDP.

Like the 1600, the 2600 has its Integrated Heat Spreader (IHS) soldered onto the die, so the thermal conductivity will not degrade over time as it does with Thermal Interface Material (TIM, which is basically thermal paste) — a good thing if you plan on keeping your CPU for a long time.

The 2600 offers a little bit of upside, with no downside, so yeah — if I were building the system today a 2600 would definitely have gone in.

That’s about the only change I would have made.


PS:  Selecting components and upgrades is always a process of elimination.  For those that are curious, here’s some of the thinking that goes on ‘behind the scenes’…

Both Summit Ridge and Pinnacle Ridge Ryzen 7s are overkill for my needs:

  • This computer simply doesn’t need eight cores — I don’t generate enough work to keep them all busy.
  • Idle cores still consume power and produce heat — both of which are undesirable in an energy-efficient and passively-cooled system with a relatively small (240W) PSU.
  • A (hypothetical) R7 2700X + GTX 1050 Ti GPU combination could draw as much as (105+75=) 180W of power from a 12V rail that can only supply 168W (14A) max… so would not even be electrically stable.

The Raven Ridge APUs are interesting but had/have issues:

  • They didn’t exist when I purchased my system.
  • Linux support for APU graphics was likely to be patchy in the first few months — something I just didn’t want to have to deal with.
  • They use TIM between the IHS and the die — not solder.
    • They won’t cool as easily to start with.
    • Cooling will actually get worse over time as the TIM degrades — resulting in higher temps, thermal throttling, and possibly even a shortened lifespan.
  • Their GPU performance is on-par with a GT 1030.  I was rocking a GTX 1060 prior to the Intel Meltdown/Spectre debacle and — based on that reference point — predicted that even R5 2400G graphics performance (Vega 11) would be inadequate for my needs.
  • With 4 Cores and 4 Threads the R3 2200G simply isn’t powerful enough, but with 4 Cores and 8 Threads the R5 2400G is borderline acceptable (SMT matters for the computation I do).

I’m confident that eventually AMD’s APUs will offer the performance I need for this system.  I like the idea of having an APU in the DB4 — I really do — but it needs to be performant.  Currently they aren’t capable of replacing my DGPU.  It will be interesting to see how things develop on this front.

Posted in Silent Computer | Tagged , , , , , , , , , , , | 8 Comments

Mute Trolls on Wowhead

Play World of Warcraft?  Use Wowhead to do your research?  Participate in discussions on their forums?  Sick of the trolls that live there?  Wish there was some way you could make their posts just… disappear?  Well, there is.

jungletrollTo start with, it is unfortunate that Wowhead doesn’t have an official way to block/mute other users. If they did, I would simply use that. I’ve read a number of old threads in various forums where the feature has been proposed, but moderators and community managers have nixed the idea mainly because they seem to think that the incidence of trolling is quite low and that they have things under control. As a result, there’s no sign that such a feature is likely to be implemented in the near future.


My approach to solving the problem was to use a userscript manager called Tampermonkey. Basically, it’s a web browser add-on that you install, that lets you write Javascript code, and have that code run on certain web pages when you visit them.

So, specifically, my “Mute Trolls” script — which is only about 27 lines long — runs when any Wowhead forum topic page has loaded, scans the page for the usernames of any trolls I have identified, then traverses the document object model and removes any and all posts made by those trolls. It does this within a few milliseconds of the page loading, so I never see their posts — at all.


If you can’t see their posts, then you won’t respond to their posts, and you won’t give the trolls the one thing they truly crave — attention. Trolls get attention by writing inflammatory, illogical and provocative things. The mere act of replying to a troll gives them what they want. It doesn’t matter what you write — it’s that you respond. The only way to deal with trolls is to starve them of attention. To ignore them. Having all of their posts automatically hidden from view makes that very, very easy.

Here is the script for your copy-pasting pleasure:

// ==UserScript==
// @name         Mute Trolls
// @namespace
// @version      0.1
// @description  hide posts by trolls
// @author       Me
// @match*
// @grant        none
// ==/UserScript==

(function() {
  'use strict';
  var i,j;
  var trolls = ["Troll#1"];
  var vtp = [];
  var links = [];
  while (trolls.length > 0) {
    var troll = trolls.pop();
    var tas = document.querySelectorAll('[href="/user='+troll+'"]');
    for (i = 0; i < tas.length; i++) {
  var vars = document.getElementsByTagName("var");
  for(j = 0; j < vars.length; j++) {
    for (i = 0; i < links.length; i++) {
      if (vars[j].contains(links[i])) {
  while (vtp.length > 0) {
    var trollPost = vtp.pop();
    var tbd = trollPost.parentNode.parentNode.parentNode;

I developed the script in Firefox 58 on Ubuntu. It should run on Firefox 57+, Chrome 62+ and Safari 11+ but I haven’t tested — and won’t test — compatibility across browsers (because 1) I don’t use those platforms and 2) this isn’t a ‘product’ that I’m selling to cover the time/cost of performing such testing).

If this script doesn’t work for you on a particular OS/Browser combination please post a comment below to let others know.  Maybe someone else out there is running on the same platform, can manage to get it working, and can share their workaround/fix.

Final note: The script just hides posts made by trolls so you don’t see them. It only modifies the pages loaded in your web browser. It doesn’t touch the server in any way. The troll’s posts still exist. Others can still see them. If someone else quotes a troll, you will see the quoted text. The script, again, is only 27 lines long. It was hacked together in an afternoon. It solves my problem. I don’t need anything more complex right now. It may or may not be adequate for your needs. If it isn’t then you can extend it yourself and make it do whatever you want it to do.

PS:  To get the above script to work, the process should be as easy as:

  1. Go to
  2. Download and install Tampermonkey for your specific browser
  3. The Tampermonkey icon icon694 should now appear in your toolbar
  4. Select and copy the above Mute Trolls script
  5. Click on the Tampermonkey icon and select “Create a new script…” from the menu
  6. Select and delete all of the default code that appears in your “<New userscript>”
  7. Paste the code from your clipboard
  8. Select File > Save from the Editor tab
  9. Open a new browser tab and go to a Wowhead forum where known trolls live
  10. Open up a topic in which a known troll has posted
  11. Make note of some of the troll’s posts
  12. Switch back to the Tampermonkey tab
  13. Replace Troll#1 with the exact name of your troll — case matters
  14. Select File > Save from the Editor tab
  15. Switch to your Wowhead forum topic tab
  16. Reload the tab
  17. All of the troll’s posts should disappear
  18. If the forums you use are infested with trolls, simply add more troll names (comma separated, within “quotes”) to the list as needed (e.g. [“Troll#1”, “Troll#2”, “Troll#3”])
  19. If you delete a troll’s name, make sure you delete the corresponding comma as well — the list should not start with a comma, end with a comma, or have two commas in a row


Posted in Stuff | Tagged , , , , , , , , , , , | Leave a comment

Completely Silent Computer

I’ve been trying to make my computers quieter for nearly three decades.  Custom liquid cooling loops, magnetically-stabilised fluid-dynamic bearings, acoustic dampeners, silicone shock absorbers, you name it.  Well, last week I finally managed to build a completely silent computer.  Without further ado…


Say hello to the Streacom DB4 — a 26x26x27cm case that doesn’t have a single fan.  Indeed, it doesn’t have any moving parts at all.  It’s totally silent — 0dB.

If you strip away the top and four (13mm-thick extruded aluminium) side walls, you see a minimal chassis, and a central mounting plate for a mini-ITX motherboard (oriented with I/O pointing down through the bottom of the case).


At the time I selected components for the system, there were only four mini-ITX motherboards for me to choose from:

  • ASUS ROG Strix B350-I Gaming
  • Gigabyte AB350N-Gaming-WiFi ITX
  • MSI B350I Pro AC
  • ASRock Fatal1ty AB350 Gaming-ITX/ac

(Astute readers will notice they are all AMD (Socket AM4) motherboards.  The whole Meltdown/Spectre debacle rendered my previous Intel system insecure and unsecurable so that was the final straw for me — no more Intel CPUs.)

I ended up getting the ASRock AB350 Gaming-ITX/ac motherboard:


Although any mini-ITX motherboard can — theoretically — be mounted in the DB4, the whole case is designed to be passively-cooled by using heat pipes to transfer the heat generated by the CPU and GPU to the side panels where it can be radiated and convected away.  Careful analysis of the routes the CPU heat pipes would need to take, and clearances required by them, revealed that certain motherboards simply wouldn’t work — components were in the way.

  • The Gigabyte has the ATX power connector at the top of the board for some reason, so that was a massive, insurmountable obstacle.
  • The Asus has a solid bank of SoC VRM caps that the heatpipes would have literally rested on.  Anyone that knows anything about capacitors and heat knows that would have been a recipe for disaster.
  • The MSI has a huge SoC VRM heatsink that would have posed an insurmountable obstacle to one (maybe even two) of the heatpipes.

The ASRock was the only motherboard that could fit the DB4 and (optional) LH6 Cooling Kit heat pipes without much in the way of drama.  All of that will probably make a lot more sense when you see the heatpipes installed:


To fully appreciate the minute clearances involved, here it is from another angle:

DB4eYep, literally fractions of a millimetre of clearance in some places.

The DB4 comes with the hardware necessary to shift heat from the CPU to one of the side panels via four heatpipes and a single heat spreader.  In this configuration a 65W CPU can be supported.  By adding the LH6 Cooling Kit, you can connect the CPU to two side panels via six heatpipes and three heat spreaders, and support a 105W CPU.

In such a passively-cooled system, the heat dissipation figures limit the CPUs that can be installed.  For reference:

  • Ryzen 5 2400G 4C8T 3.6GHz — 46-65W
  • Ryzen 5 1600 6C12T 3.2GHz — 65W
  • Ryzen 5 1600X 6C12T 3.6GHz — 95W
  • Ryzen 7 1700 8C16T 3.0GHz — 65W
  • Ryzen 7 1700X 8C16T 3.4GHz — 95W
  • Ryzen 7 1800X 8C16T 3.6GHz — 95W

So a stock DB4 can only support up to a 2400G/1600/1700 — forget overclocking — whilst a DB4+LH6 can support even a 1600X/1700X/1800X — with a little bit of room for overclocking.

Unlike Intel — who only support their sockets for as long as it takes you to unwrap the box — AMD supports their sockets for much longer.  The AM4 will be supported until 2020.  Thus my cunning plan was to start off 2018 with a CPU that can be comfortably cooled by the DB4+LH6, overclock, stress test and monitor thermals for a couple of years, then — if the advantages would be tangible and I feel the need — throw in a more efficient CPU when the last AM4 CPUs come off the production line in 2020, then cruise for the next half-decade or so.

All of that led me to install a 65W Ryzen 5 1600.  Since I have a B350 motherboard, I have the ability to overclock the CPU to 1600X/95W levels without much of an issue.


Note:  If you are happy sitting within the 65W thermal envelope, and are not overclocking anything, you could forego the LH6 Cooling Kit.  Because the DB4 heat pipes are shorter than the LH6 ones, and don’t go over the edge of the motherboard, pretty-much all of the component obstruction issues that eliminated the Gigabyte, Asus and MSI motherboards from consideration would no longer apply.  Something to keep in mind if you don’t need the speed but do want some of the features that one or more of those boards may have (but which the ASRock does not).

As far as memory goes, I went with a Corsair Vengeance LPX CMK32GX4M2Z2400C16 32GB (2x16GB) DDR4 kit.


I’ve never had a problem with Corsair Vengeance LPX RAM.  This specific kit was on the QVL for the motherboard and an overclocker was able to push his kit to 3200MHz on exactly the same motherboard as I have, so I was confident that I could get a nice memory overclock with minimal effort — subject to the silicon lottery, of course.  Since this machine isn’t for gaming, and isn’t running an APU, really high memory speeds aren’t as important to me as large amounts of RAM.


SSDs are the only totally silent storage option, and I got rid of my last HDD more than seven years ago, so this system was always going to have SSDs.  The only question was “Which ones?”

Since the motherboard has an M.2 slot on the back, I decided to go with a 1TB Samsung 960 Evo NVMe for the main drive and a 1TB Samsung 860 Evo SATA for the backup drive.

I would have preferred two NVMe drives (to cut down on cable clutter), but the ASRock motherboard only has one M.2 slot.  The Asus motherboard, on the other hand, has two slots but (as mentioned before) that is not compatible with the LH6 Cooling Kit.  Ah well — compromises of some sort often need to be made.

For what I will be doing with this computer, fast transfer rates and a life expectancy of at least seven years is what I am after from these drives.  I only really need ~600GB of space, so by over-provisioning a couple of hundred gigs I can let wear-levelling do its thing and make seven years an easy target to hit.

Even though this system is not meant to be a gaming rig, there’s no harm in putting in the best GPU you can without blowing the thermals.  The GPU Cooling Kit allows up to a 75W GPU to be modded and cooled via heat pipes and spreader to a single wall.  That pretty-much limits you to the GTX 1050 Ti and below if you prefer Nvidia cards — like I do.

The GPU I wanted was the MSI GeForce GTX 1050 Ti Aero ITX OC 4GB but my parts supplier ran out of them literally as I was assembling my online order.  With no idea when supplies would be restored (thanks to the cryptocurrency mining craze), I went with my second preference of an ASUS Phoenix GeForce GTX 1050 Ti 4GB:


Whilst both GPUs fit into the space, the MSI was a few centimetres shorter than the Asus.  None of the dual-fan 1050 Ti GPUs had even the remotest chance of fitting.

After removing the fan, shroud and heatsink I cleaned up the GPU itself, applied fresh thermal paste, then fitted the GPU Cooling Kit:


The final step was to pop heat sinks onto each of the four VRAM chips:


Power testing of a wide range of 1050 Ti cards reveals that they do indeed pull the full 75W when under load, so I’m at the limits of the GPU Cooling Kit and there’s no room for overclocking the GPU (even if I wanted to).

To power all this I installed a Streacom ZF240 Fanless 240W ZeroFlex PSU:


I researched the power draws of the various components and worked out that the power budgets on all rails — except the 12V rail — had plenty of headroom.  The 12V rail can theoretically hit ~85% of the 168W max capacity if both the CPU and GPU are running at 100%.  Normally I prefer to leave myself a lot more headroom than that, but since this system is not meant for gaming, and I can’t actually think of any other scenarios where I’m likely to max out both at the same time, I’m not really concerned.  (If it does become an issue then I can install a SFX PSU with minimal effort and buy myself more headroom.)

Over the years I’ve also come to appreciate PSU efficiency curves, and recognise that ‘idling’ systems with large PSUs is a horrible waste of energy.  To get the most out of your PSU you should size it so that your typical usage falls in the 25-75% range.  The ZF240 has an efficiency rating of 93% and I think my selection of components will let it achieve such levels on a regular basis — given my historic and anticipated usage patterns.

Low power consumption is an especially important issue if you plan on going off-grid.  Since that’s a goal we have in the 2–4 year time frame, and this computer will be used much longer than that, it makes sense to aim for high efficiency and low power consumption at the same time.


Final remarks…

The pursuit of silence can be costly and this build certainly was — ending up just shy of AU$3,000.  If cryptocurrency miners weren’t inflating prices all over the place, it probably could have come in closer to $2,400 — still a fair bit, but not eye-watering.  Nonetheless, the price is less than each of my last three systems and it manages to achieve what none of them ever did:  Complete and utter silence.

This computer makes no noise when it starts up.  It makes no noise when it shuts down.  It makes no noise when it idles.  It makes no noise when it’s under heavy load.  It makes no noise when it’s reading or writing data.  It can’t be heard in a regular room during the day.  It can’t be heard in a completely quiet house in the middle of the night.  It can’t be heard from 1m away.  It can’t be heard from 1cm away.  It can’t be heard — period.  It’s taken nearly 30 years to reach this point, but I’ve finally arrived.  The journey is over and it feels great.

If you are after a silent — not just quiet, but silent — daily driver, then I strongly recommend a passively-cooled case, heat pipes and solid state drives.  Eliminate the moving parts (e.g. fans, HDDs) and you eliminate the noise — it’s not that complicated.  It also doesn’t need to be really expensive (my system requirements were not ‘average’ so please don’t infer from this post that all DB4-based systems are as expensive).  Silence (and a perfectly respectable computer) can easily be had for half the price.

That’s about it, methinks.  If you have any questions or would like more details (about any aspect of this build) to be added to the post, fire away in the comments.


Posted in Silent Computer | Tagged , , , , , , , , , , , , , , , , | 136 Comments

Perl and OpenGL on Ubuntu

Want to write a Perl program that uses OpenGL for graphical output?  Running Ubuntu?  Can’t work out how to install what you need to get even a basic program working?  This is your lucky day.  Read on.


Perl is the duct tape of the Internet.  Most folk think you’re restricted to using Perl on the command line — and don’t know that it can quite happily drive a graphical user interface.  Even fewer realise that you can build high FPS OpenGL applications using it.  Better yet, you can develop it all on Ubuntu (or any Linux distro for that matter) and fully embrace Free and Open Source Software (FOSS) in the process.

For someone new to the scene, however, setting your system up so that you have the right toolchain in place can be a bit daunting.  The same applies to those who have been away from the scene for a while and are a bit rusty.  This post is for you.

What follows is a step-by-step guide for installing everything you need onto a regular Ubuntu system so that you can start developing OpenGL applications with Perl.

I can verify that this process works on Ubuntu 16.04 (which includes Perl 5.22).

Let’s get cracking…

Mesa implements a translation layer between a graphics API such as OpenGL and the graphics hardware drivers in the operating system kernel.

$ sudo apt-get install build-essential libgl1-mesa-dev

At least one of these — GLEW, SDL2, GLM, FreeType — will come in handy down the line, so may as well install them now.

$ sudo apt-get install libglew-dev libsdl2-dev libsdl2-image-dev libglm-dev libfreetype6-dev

cpanminus is a standalone, minimalist, dependency-free, zero-config script to get, unpack, build and install modules from CPAN.

$ sudo cpan App:cpanminus

OpenGL::Modern provides Perl bindings to the OpenGL graphics APIs using the OpenGL Extension Wrangler (GLEW) library.

$ sudo cpanm OpenGL::Modern

Note:  All of the remaining steps can be completed with a single, convoluted, one-line command.  That command will be given at the end.  You’ll need to verify and update it though, so keep reading.

The Graphics Library Framework (GLFW) is a lightweight utility library that gives programmers the ability to create and manage windows and OpenGL contexts, as well as handle joystick, keyboard and mouse input.  Hover over the “Source Package” link on the GLFW download site and make sure that the version number and URI are up-to-date before executing the following commands.

$ wget

Unpack the archive and enter the directory that gets created.

$ unzip
$ cd glfw-3.2.1

The GLFW author uses CMake because it makes his job easier, so we need to install that and some other packages to proceed.

$ sudo apt-get install cmake xorg-dev libglu1-mesa-dev

Use CMake and make to build and install the GLFW.

$ sudo cmake -G "Unix Makefiles"
$ sudo make
$ sudo make install

That’s it!

Now, you’ll notice that you have to type in the version number a few different times.  We can set the number in a variable and then reduce the last 7 steps into a one-liner.  Here it is for your copying and pasting pleasure (but remember to check the version and URI first):

version="3.2.1" && wget "${version}/glfw-${version}.zip" && unzip glfw-${version}.zip && cd glfw-${version} && sudo apt-get install cmake xorg-dev libglu1-mesa-dev && sudo cmake -G "Unix Makefiles" && sudo make && sudo make install

Assuming everything went according to plan, right towards the end a small window titled “Simple Example” should have popped up briefly on your screen with a rotating OpenGL triangle in it.  That’s the sign that everything is working.



Finally, the purpose of this post is not to try teach you how to program in Perl or OpenGL.  There are millions of other web pages out there that can help you do that.  I personally, however, appreciate having a simple little skeleton of a program to get me started.  Figuring that you might appreciate one as well, I prepared one for you.


use OpenGL::GLFW qw(:all);
use OpenGL::Modern qw(:all);

my $errorCallback = sub {
    my ( $error, $description ) = @_;
    print STDERR "Error $error: $description\n";
glfwSetErrorCallback( $errorCallback );

glfwInit() or die "glfwInit failed, $!\n";

my $window = glfwCreateWindow(960,540,"Blank Slate",NULL,NULL);
unless ( defined $window ) {
    die "glfwCreateWindow failed, $!\n";
glfwMakeContextCurrent( $window );

my $keyCallback = sub {
    my ( $window, $key, $scancode, $action, $mods ) = @_;
    if ( $key == GLFW_KEY_ESCAPE && $action == GLFW_PRESS ) {
        glfwSetWindowShouldClose( $window, GLFW_TRUE );
glfwSetKeyCallback( $window, $keyCallback );

glewInit() == GLEW_OK or die "glewInit failed, $!\n";

glfwSwapInterval( 1 );
glClearColor( 0, 0.5, 0, 1);

while ( !glfwWindowShouldClose( $window ) ) {
    glClear( GL_COLOR_BUFFER_BIT );
    # draw stuff here
    glfwSwapBuffers( $window );

glfwDestroyWindow( $window );

Copy and paste it into a file using your favourite editor, save and close it, chmod+x it and then run it.

All that the program basically does is:

  • set an error handler so that if anything goes wrong you get some feedback
  • initialise a bunch of stuff
  • create a window that can be moved, resized, maximised and minimised
  • bind a callback to the window to trap key presses
  • enter a loop that just continuously clears the (double-buffered) window until either the ESC key is pressed or the window is closed
  • clean up


It took me about nine hours to go from zero to having a basic working program.  There seemed to be no “Perl and OpenGL on Ubuntu” quick start guide on the Web for complete noobs like me.  Working out the steps required was a frustrating process.  Hopefully this guide will make your life a little easier.


PS:  Getting up to speed would have been a lot harder without the help of Chris Marshall on the Perl OpenGL mailing list on SourceForge, and the great folks on StackOverflow.  Cheers!

Posted in Stuff | Tagged , , , , , , , | Leave a comment

Chassis Intruded! Fatal Error… System Halted.

Got an ASUS motherboard?  Are you having problems booting sometimes?  Do messages regarding ‘chassis intrusion’ get displayed on your screen, and stop the boot process, even though no-one has opened the case?  There might be a simple solution.

Chassis Intruded!
Fatal Error... System Halted.

The first time I got the above message I was a bit surprised.  I’m the only one that uses my computer, there are no kids in the house, and the case hadn’t been opened for months.  Pressing the Reset button resulted in a clean boot, so I wasn’t worried.  Computers do strange things sometimes and reboots make most of the problems go away.

But, it happened again a few weeks later, and again, and again…  Ultimately, a pattern emerged:  Whenever the power was cut to the computer for an extended period of time, the intrusion message would come up.

Sometimes I power off my computer from the wall for a few hours when a thunderstorm is rolling through.  Sometimes the LEDs on my stupid Steelseries keyboard will stay on even after the system has shut down, so I terminate power using the switch on the Power Supply Unit (PSU).  Sometimes I turn off power at the PSU when cleaning coolers and fans, installing solid state drives, and otherwise maintaining or tweaking the system.  Sometimes I go camping and power down the whole house (except the fridge) from the fuse box.

Opening the case wasn’t causing the error.  Physically cutting off power to the system was.


The only hunch I had was that it might have something to do with the battery.

Every motherboard has a small clock in it that keeps track of the time.  When the computer is connected to an AC outlet on a wall, the clock is powered by that.  When the power is physically cut (by turning it off at the wall or on the back of the PSU) then the clock is powered by a small battery on the motherboard instead.  If the battery is nearing the end of its life, and there isn’t enough power to keep the clock running, the clock will drift or reset, and when your computer starts up you are greeted with an operating system message telling you that your clock may be incorrect.  I’ve seen that happen many, many times over the years.

Even though I wasn’t seeing any clock symptoms here, I reasoned that something like a chassis intrusion system would need to monitor at least something while the power was disconnected, and if the battery was weak there may not be enough power for that circuit to operate properly.  Enough power for the clock, yes, but not enough for intrusion detection.  (Or it could be some obscure but related value stored in CMOS that was being wiped.)

So, whilst driving past Bunnings one day I popped in and picked up a pack of four CR2032 3V Lithium batteries for about $6.  When I got home I popped the case open, replaced the old battery with a new one, and closed it back up.  Only took a few minutes.  That night I shut down and terminated power to the system completely using the switch on the PSU.  The power was completely cut for over eight hours overnight.

In the morning I reconnected the power and booted the machine — everything worked perfectly.  No error message.  Nor has there been an error message for the days weeks months since (even though I’ve had to cut power a number of times for various reasons).

Problem.  Solved.  🙂

If you are in the same situation — getting chassis intrusion messages when you boot, or clock errors, or any other symptom that seems to occur after cutting power to your system — then spend a couple of bucks and replace your motherboard battery before trying anything else.  It could be the fastest and cheapest hardware fix you ever get to perform.

Happy booting!

PS:  My motherboard is an ASUS Maximus IV Extreme-Z and was purchased in 2011.  Lots of other ASUS motherboards have the chassis intrusion feature, so I suspect will behave the same way when the battery starts to die.  Also, motherboards from other vendors like MSI, ASRock and Biostar probably have a similar feature on at least some of their boards.  I don’t consider this problem/fix to be motherboard-specific, or even vendor-specific.

PPS:  Motherboard batteries should last at least 3 years in a typical system that spends the vast majority of its time plugged into an AC outlet.  They will discharge faster in systems that are physically disconnected from external power frequently and/or for extended periods of time (e.g. because you use one of those ‘energy saving’ powerboards that cut power off completely when you press a button on a remote, or you’re in the habit of turning off your system at the PSU because it’s the only way you can get all of those motherboard LEDs to turn off at night so you can get to sleep, or the system is put into storage due to changing circumstances).  I’ve had batteries last over 8 years in servers that are continuously powered and running.

PPPS:  I tested the old battery with a multimeter.  The voltage of the cell was 2.26V.  This is well below the 3.0V ‘normal’ level, and getting quite close to the 2.0V threshold at which the performance of a CR2032 cell falls off a cliff.  It would seem that 2.26V is still enough for the clock circuitry to function normally, but not enough for the intrusion detection circuitry.

Posted in Stuff | Tagged , , , , , , , , | 2 Comments