<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>bablick.de</title>
	<atom:link href="https://bablick.de/feed/" rel="self" type="application/rss+xml" />
	<link>https://bablick.de</link>
	<description>Writing About Clusters, Curiosity, and Everything in Between.</description>
	<lastBuildDate>Sun, 16 Nov 2025 20:58:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.3</generator>

<image>
	<url>https://bablick.de/wp-content/uploads/2025/08/cropped-BablickLogo-1-32x32.png</url>
	<title>bablick.de</title>
	<link>https://bablick.de</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Spice Bread + Nutella: A Small Breakfast Revolution</title>
		<link>https://bablick.de/spice-bread-nutella-a-small-breakfast-revolution/</link>
		
		<dc:creator><![CDATA[Ernst Bablick]]></dc:creator>
		<pubDate>Sun, 16 Nov 2025 20:44:43 +0000</pubDate>
				<category><![CDATA[Kitchen]]></category>
		<category><![CDATA[Other]]></category>
		<category><![CDATA[Breakfast Ideas]]></category>
		<category><![CDATA[Coriander Seed]]></category>
		<category><![CDATA[German Baking]]></category>
		<category><![CDATA[Nutella]]></category>
		<category><![CDATA[Spice Bread]]></category>
		<guid isPermaLink="false">https://bablick.de/?p=188</guid>

					<description><![CDATA[Spice Bread + Nutella: How a Spontaneous Try Changed My Breakfast Life Sometimes culinary magic happens exactly when you least expect it. For me, it was a slice of German-style spice bread &#8212; a dark, gently sweet loaf flavored with warming spices like coriander seed, (cinnamon), and cloves (not to be confused with pumpkin spice...]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.33%"><figure class="wp-block-post-featured-image"><img fetchpriority="high" decoding="async" width="512" height="512" src="https://bablick.de/wp-content/uploads/2025/11/Korriander-Brot-Mit-Nutella-e1763325329509.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="Korriander-Brot-Mit-Nutella" style="object-fit:cover;" /></figure></div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:66.66%">
<h2 class="wp-block-heading">Spice Bread + Nutella: How a Spontaneous Try Changed My Breakfast Life</h2>



<p>Sometimes culinary magic happens exactly when you least expect it. For me, it was a slice of German-style spice bread &#8212; a dark, gently sweet loaf flavored with warming spices like coriander seed, (cinnamon), and cloves (not to be confused with pumpkin spice or gingerbread).<br>A jar of Nutella was sitting next to it, and after 40 years of eating Nutella only on white rolls or toast, I thought: Why not… just try it.</p>
</div>
</div>



<h3 class="wp-block-heading">And then it happened.</h3>



<p>The first bite was a surprising moment &#8212; almost ridiculously intense. </p>



<p>The sweet creaminess of Nutella melts into the warm, aromatic spices of the bread. The coriander <strong>seed</strong> (a citrusy, warm spice &#8212; <em>not cilantro</em>) adds a bright, unexpected lift that harmonizes beautifully with the chocolate-hazelnut sweetness.</p>



<p>It was as if my brain thought simultaneously:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><em>&#8220;I know this!&#8221;</em><br>and<br><em>&#8220;What on earth is this &#8212; and why is it so good?!&#8221;</em></p>
</blockquote>



<p>After four decades of breakfast routine, it felt like rediscovering something familiar. An upgrade to a memory. A tiny revolution on a slice of bread.</p>



<h3 class="wp-block-heading">Why It Works (Especially If You&#8217;ve Never Had German Spice Bread)</h3>



<ul class="wp-block-list">
<li><strong>Spice bread isn&#8217;t overly sweet.</strong><br>It&#8217;s closer to a rustic loaf with warm spices than to American-style sweet breads.</li>



<li><strong>Coriander seed is the secret weapon.</strong><br>It has a lemony, floral warmth &#8212; completely different from fresh cilantro.<br>In spice bread, it adds depth that plays surprisingly well with Nutella.</li>



<li><strong>Nutella gains complexity.</strong><br>Its sweetness and fat carry the spice notes, turning a childhood favorite into something almost gourmet.</li>
</ul>



<h3 class="wp-block-heading">Conclusion</h3>



<p>Spice bread with Nutella is no longer just an experiment &#8212; it&#8217;s here to stay.<br>And maybe it shows that shaking up old habits now and then is worth it.</p>



<p>If you&#8217;ve been eating the same breakfast for years:<br>Try something unexpected. Your personal &#8220;wow&#8221; moment might be waiting right next to the toaster.</p>



<h3 class="wp-block-heading">(A Note on Palm-Oil-Free Options)</h3>



<p>If you love the idea of this combination but prefer a palm-oil-free chocolate-hazelnut spread, there are some excellent alternatives out there. Brands like Rigoni di Asiago Nocciolata (Organic), Nutvia, Vego Chocolate Spread, or Milford Choco Nussa (Palm-oil-free version) offer rich, creamy spreads without palm oil.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How Binding Order and Range Shape Job Placement in Gridware Cluster Scheduler</title>
		<link>https://bablick.de/how-binding-order-and-range-shape-job-placement-in-gridware-cluster-scheduler/</link>
		
		<dc:creator><![CDATA[Ernst Bablick]]></dc:creator>
		<pubDate>Thu, 30 Oct 2025 23:31:32 +0000</pubDate>
				<category><![CDATA[HPC]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA["Cache and Memory Optimization"]]></category>
		<category><![CDATA["Cost Aware Scheduling"]]></category>
		<category><![CDATA["CPU Binding"]]></category>
		<category><![CDATA["Energy-Aware Scheduling"]]></category>
		<category><![CDATA["Gridware Cluster Scheduler"]]></category>
		<category><![CDATA[GCS]]></category>
		<category><![CDATA[NUMA]]></category>
		<category><![CDATA[OCS]]></category>
		<guid isPermaLink="false">https://bablick.de/?p=158</guid>

					<description><![CDATA[This article explains how the three binding options -bsort, -bstart, and -bstop control where and in which order jobs are bound to CPUs in Gridware Cluster Scheduler. Together, they define the scheduler’s fill-up pattern — how hardware resources are used, balanced, or reused across sockets, cores, and NUMA nodes. Understanding these options is essential for...]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.33%"><figure class="aligncenter wp-block-post-featured-image"><img decoding="async" width="512" height="512" src="https://bablick.de/wp-content/uploads/2025/10/Binding-Topilogy-Advanced-e1761865388777.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="Advanced Binding Topology" style="object-fit:cover;" /></figure></div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:66.66%">
<p>This article explains how the three binding options <code>-bsort</code>, <code>-bstart</code>, and <code>-bstop</code> control <strong>where and in which order jobs are bound to CPUs</strong> in Gridware Cluster Scheduler.</p>



<p>Together, they define the scheduler’s <strong>fill-up pattern</strong> — how hardware resources are used, balanced, or reused across sockets, cores, and NUMA nodes.</p>



<p>Understanding these options is essential for creating advanced scheduling strategies such as <strong>energy-aware, thermal, or cost-optimized job placement</strong>.</p>
</div>
</div>



<span id="more-158"></span>



<h2 class="wp-block-heading"><strong>Further Reading</strong></h2>



<p>If you missed the first two parts of this series, start there — they introduce the concepts of topology strings and binding basics that this article builds on:</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.33%">
<figure class="wp-block-image size-full"><img decoding="async" width="512" height="512" src="https://bablick.de/wp-content/uploads/2025/10/Brain-topology-e1761246631294.png" alt="hardware-topology" class="wp-image-128"/></figure>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:66.66%">
<p><a href="https://bablick.de/compute-nodes-with-heterogenious-topology-in-gridware-cluster-scheduler/" data-type="post" data-id="125">Compute Nodes with Heterogeneous Topology in Gridware Cluster Scheduler</a></p>
</div>
</div>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.33%">
<figure class="wp-block-image size-full"><img alt="Binding Topology" loading="lazy" decoding="async" width="512" height="512" src="https://bablick.de/wp-content/uploads/2025/10/Brain-Topology-Binding-e1761421460621.png" alt="" class="wp-image-135"/></figure>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:66.66%">
<p><a href="https://bablick.de/understanding-binding-in-gridware-cluster-scheduler/">Understanding Binding in Gridware Cluster Scheduler</a></p>
</div>
</div>



<h2 class="wp-block-heading"><strong>Why order and range matter</strong></h2>



<p>Imagine your cluster as a row of houses, each with several rooms. Jobs are like guests arriving to stay overnight.</p>



<p>Without a plan, guests will pick rooms at random. Some might share walls and benefit from proximity; others might end up in different houses entirely.</p>



<p>Binding order and range options give the scheduler a <em>plan</em> — a way to decide how the “houses” and “rooms” are filled:</p>



<ul class="wp-block-list">
<li><code>-bsort</code> defines <strong>which house or room type to consider first</strong>.</li>



<li><code>-bstart</code> sets <strong>where the first guest can enter</strong>.</li>



<li><code>-bstop</code> defines <strong>where the group must stop filling</strong>.</li>
</ul>



<p>It’s a simple idea — but it’s the foundation for consistent, balanced, and sometimes energy-efficient scheduling. This ensures that jobs don’t overlap or scatter unpredictably — they follow a defined parking pattern.</p>



<h2 class="wp-block-heading"><strong>1. Sorting with <code>-bsort</code></strong></h2>



<p>The <code>-bsort</code> option controls the <em>order</em> in which available CPU units are considered. It uses the same letters as topology strings (<code>S</code>, <code>C</code>, <code>E</code>, <code>N</code>, <code>X</code>, <code>Y</code>) but interprets them by utilization:</p>



<ul class="wp-block-list">
<li><strong>Uppercase</strong> letters (<code>S</code>, <code>C</code>, <code>N</code>…) mean <em>start with free resources</em>.</li>



<li><strong>Lowercase</strong> letters (<code>s</code>, <code>c</code>, <code>n</code>…) mean <em>start with already-used resources</em>.</li>
</ul>



<p>This simple mechanism lets administrators describe sophisticated fill-up patterns:</p>



<ul class="wp-block-list">
<li><code>-bsort "SC"</code> — Fill unutilized sockets and cores first.</li>



<li><code>-bsort "sC"</code> — Reuse partially filled sockets before opening a new one.</li>



<li><code>-bsort "nSyC"</code> — (GCS only) Use utilized NUMA nodes and 3rd Level Caches before starting opening new ones but empty sockets and cores are preferred within NUMA nodes and core groups.</li>
</ul>



<p>If no sort order is defined, the scheduler uses the hardware’s natural order as reported by HWLOC. This order is the default behavior in most competitive workload management systems and ensures predictable placement when the WLM lacks a possibility to specify preferences.</p>



<h2 class="wp-block-heading"><strong>2. Defining the range with <code>-bstart</code> and <code>-bstop</code></strong></h2>



<p>After sorting, the scheduler knows which binding units exist and in what order they should be considered. The next question is: <em>how much of that ordered list should be used?</em> That’s what <code>-bstart</code> and <code>-bstop</code> control.</p>



<p>You can think of the sorted topology as a long sequence of nodes — a string that lists sockets, cores, or cache domains in the order defined by <code>-bsort</code>. </p>



<p>With <code>-bstart</code> and <code>-bstop</code>, you mark a <strong>window</strong> inside that string to show where binding is allowed.</p>



<pre class="wp-block-code"><code>Start here → &#91;================] ← Stop here</code></pre>



<p>The brackets represent the usable part of the topology. Binding can happen only inside this bracketed region; everything outside it is ignored. This is especially useful when you want to reserve or exclude certain parts of a host — for example, to keep the first socket free for system services or to group jobs within a specific NUMA region.</p>



<p>Consider a dual-socket, quad-core host represented as:</p>



<pre class="wp-block-code"><code>SCCccSCCCC</code></pre>



<p>(lowercase <code>c</code> marks partially utilized cores)</p>



<ul class="wp-block-list">
<li><code>-bstart S -bstop s</code> → the scheduler begins binding at the first <strong>unutilized socket (<code>S</code>)</strong> and stops before the first <strong>partially used socket (<code>s</code>)</strong>, effectively limiting the job to the clean half of the machine. (SCCcc[SCCCC])</li>



<li><code>-bstart s -bstop S</code> → Reversing the range starts binding at the first <strong>used socket (<code>s</code>)</strong> and continues until the next <strong>free socket (<code>S</code>)</strong>  ([SCCcc]SCCCC)</li>
</ul>



<p>You can imagine this as managing a parking lot: <code>-bsort</code> arranges the parking spaces by preference, and <code>-bstart</code>/<code>-bstop</code> draw the lines around the section that is currently open for parking. Jobs will always stay within that section, preventing overlap and ensuring predictable placement.</p>



<h2 class="wp-block-heading"><strong>3. Real-world significance</strong></h2>



<p>At first glance, <code>-bsort</code>, <code>-bstart</code>, and <code>-bstop</code> may seem like low-level tweaks. In reality, they are the <strong>building blocks of enterprise scheduling strategy</strong>.</p>



<p>These options influence how load, heat, and power consumption are distributed across hardware, and they provide the basis for higher-level policies such as:</p>



<h3 class="wp-block-heading has-medium-font-size"><strong>Energy-Aware Scheduling</strong> – fill one socket or die before activating another.</h3>



<h3 class="wp-block-heading has-medium-font-size"><strong>Thermal &amp; Power-Density Balancing</strong> – distribute workloads evenly across nodes.</h3>



<h3 class="wp-block-heading has-medium-font-size"><strong>License- or Cost-Aware Placement</strong> – schedule on specific CPU&#8217;s first.</h3>



<h3 class="wp-block-heading has-medium-font-size"><strong>Cache &amp; Memory-Bandwidth Optimization</strong> – keep related processes close to shared caches or NUMA regions.</h3>



<p>In GCS, JSV (Job Submission Verifier) scripts can dynamically adjust these settings to enforce global policies across the cluster.</p>



<h2 class="wp-block-heading"><strong>4. Looking ahead</strong></h2>



<p>This post closes the “mechanics” phase of the binding series. In the next article, we’ll apply everything we’ve learned to <strong>real enterprise use cases</strong> — combining sorting, filtering, and range selection to implement:</p>



<ul class="wp-block-list">
<li>Energy-optimized cluster configurations</li>



<li>Thermal-balanced compute fabrics</li>



<li>Cost- and license-aware job scheduling</li>
</ul>



<p>What seems like three small options today will soon become the core tools for advanced resource optimization.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Qontrol – A Modern Web UI for Gridware Cluster Scheduler</title>
		<link>https://bablick.de/qontrol-a-modern-web-ui-for-gridware-cluster-scheduler/</link>
		
		<dc:creator><![CDATA[ernst.bablick]]></dc:creator>
		<pubDate>Mon, 27 Oct 2025 19:18:19 +0000</pubDate>
				<category><![CDATA[HPC]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA["Cluster Management"]]></category>
		<category><![CDATA["Gridware Cluster Scheduler"]]></category>
		<category><![CDATA["HPC-Gridware"]]></category>
		<category><![CDATA["qmon"]]></category>
		<category><![CDATA["Qontrol"]]></category>
		<category><![CDATA["scheduler"]]></category>
		<category><![CDATA["Web UI"]]></category>
		<guid isPermaLink="false">https://bablick.de/?p=155</guid>

					<description><![CDATA[With our latest announcement at HPC-Gridware, we’re introducing Qontrol — a completely new, web-based user interface for Gridware Cluster Scheduler. For many years, qmon was the graphical management tool for Grid Engine and its derivatives. Maintaining this legacy Motif-based application had become increasingly difficult — both technically and from a usability perspective.With Qontrol, we are...]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.33%"><figure class="wp-block-post-featured-image"><img loading="lazy" decoding="async" width="512" height="512" src="https://bablick.de/wp-content/uploads/2025/10/Qontrol-Dashboard-Overview-e1761592596433.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="Qontrol Web UI for GCS" style="object-fit:cover;" /></figure></div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:66.66%">
<p>With our latest announcement at <a href="https://hpc-gridware.com/introducing-qontrol-modern-web-ui-for-gridware-cluster-scheduler/">HPC-Gridware</a>, we’re introducing <strong>Qontrol</strong> — a completely new, web-based user interface for <strong>Gridware Cluster Scheduler</strong>.</p>
</div>
</div>



<span id="more-155"></span>



<p>For many years, <em>qmon</em> was the graphical management tool for Grid Engine and its derivatives. Maintaining this legacy Motif-based application had become increasingly difficult — both technically and from a usability perspective.<br>With <strong>Qontrol</strong>, we are starting fresh: a <strong>modern, responsive, browser-based</strong> interface designed to support administrators and users of large HPC environments.</p>



<p>Qontrol provides direct insight into cluster status, jobs, queues, and resource usage — all presented through a clean and flexible UI that can adapt to a wide range of display environments.<br>It is built to integrate seamlessly with existing <strong>Gridware Cluster Scheduler</strong> installations, requiring no additional client software.</p>



<p>The initial release focuses on <strong>monitoring and visualization</strong>, but we are actively working on <strong>interactive management capabilities</strong> and <strong>customizable dashboards</strong> for upcoming versions.</p>



<p>You can find the full introduction and feature overview in our main post:<br>👉 <a href="https://hpc-gridware.com/introducing-qontrol-modern-web-ui-for-gridware-cluster-scheduler/">Introducing Qontrol – A Modern Web UI for Gridware Cluster Scheduler</a></p>



<p>Stay tuned — this marks the beginning of a new generation of tools built around <strong>Gridware Cluster Scheduler</strong>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Knitting vs. Programming: Two Ways to Tangle Yourself in Loops</title>
		<link>https://bablick.de/knitting-vs-programming-two-ways-to-tangle-yourself-in-loops/</link>
		
		<dc:creator><![CDATA[ernst.bablick]]></dc:creator>
		<pubDate>Sat, 25 Oct 2025 23:18:21 +0000</pubDate>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[Knitting]]></category>
		<category><![CDATA[ProgrammerLife]]></category>
		<category><![CDATA[SowftareEngineering]]></category>
		<guid isPermaLink="false">https://bablick.de/?p=152</guid>

					<description><![CDATA[Some people knit sweaters. Others knit code. Both insist their hobby is “relaxing” — right up until they’re found muttering at a pile of tangled yarn or a stack trace at 3 a.m. As someone who’s dropped both stitches and database tables, I can confirm: knitting and programming are secretly the same hobby, just with...]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.33%"><figure class="wp-block-post-featured-image"><img loading="lazy" decoding="async" width="512" height="512" src="https://bablick.de/wp-content/uploads/2025/10/Knitting-Essentials-in-Orange-e1761434106518.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="Knitting and Programming" style="object-fit:cover;" /></figure></div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:66.66%">
<p>Some people knit sweaters. Others knit code. Both insist their hobby is “relaxing” — right up until they’re found muttering at a pile of tangled yarn or a stack trace at 3 a.m.</p>



<p>As someone who’s dropped both stitches <em>and</em> database tables, I can confirm: knitting and programming are secretly the same hobby, just with different kinds of thread.</p>
</div>
</div>



<span id="more-152"></span>



<h2 class="wp-block-heading">1. Patterns Are Just Algorithms in Yarn</h2>



<p>Knitting patterns are basically human-readable pseudocode:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>“K2, P2, repeat until despair.”</p>
</blockquote>



<p>It’s the same logic as:</p>



<pre class="wp-block-code"><code>for i in range(desperation):
    knit(2)
    purl(2)</code></pre>



<p>Both rely on precise syntax. One wrong parenthesis or missed yarn-over, and suddenly your scarf has the same structural integrity as early JavaScript.</p>



<p>And of course, every pattern says <em>“just repeat rows 1–12 until desired length”</em>, which is the same energy as a junior dev being told to <em>“just scale it horizontally.”</em></p>



<h2 class="wp-block-heading">2. Debugging: Frogging Your Way to Sanity</h2>



<p>In knitting, “frogging” means ripping your work back to fix a mistake. (Because you literally go <em>“rip it, rip it.”</em>)</p>



<p>In programming, that’s called <em>refactoring</em>, <em>reverting</em>, or sometimes <em>“throwing the whole repo away and pretending it never happened.”</em></p>



<p>Both involve denial, bargaining, and at least one existential sigh.</p>



<p>If you’ve ever thought, <em>“maybe no one will notice that mistake”</em>, congrats — you’ve reached Stage 4 of the debugging grief cycle.</p>



<h2 class="wp-block-heading">3. Version Control: The Knitter’s Project Bag</h2>



<p>Every knitter has at least three half-finished projects living in different tote bags, quietly judging them from the corner.</p>



<p>Programmers call these <em>side projects</em>.<br>Both groups say things like:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>“I’ll finish it one day.”</p>
</blockquote>



<p>They won’t.</p>



<p>Also, neither group understands what’s actually inside the bag/repo anymore. Opening it is like running <code>git log</code> on your own shame.</p>



<h2 class="wp-block-heading">4. Libraries, Frameworks, and Yarn Dependencies</h2>



<p>Knitting:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>“I just downloaded this new lace pattern library!”</p>
</blockquote>



<p>Programming:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>“I just installed 47 npm packages to print ‘Hello, World.’”</p>
</blockquote>



<p>Both involve dependencies that you don’t fully understand but somehow trust your life with.<br>The only difference is that knitters’ libraries don’t randomly break when someone unpublishes <em>left-pad</em>.</p>



<h2 class="wp-block-heading">5. The Compile Moment</h2>



<p>Knitting’s version of hitting “run” is <em>binding off</em>.<br>That’s the glorious instant when you hold up your finished sweater and realize… it’s two sizes too small.</p>



<p>It’s the textile equivalent of a program that works <em>on your machine</em>.</p>



<p>Both situations involve long pauses, quiet swearing, and a vow that next time, you’ll “read the pattern more carefully.” You won’t.</p>



<h2 class="wp-block-heading">6. Community &amp; Open Source</h2>



<p>Knitters have <strong>Ravelry</strong>, an online pattern-sharing platform with 9 million users.<br>Programmers have <strong>GitHub</strong>, an online pattern-sharing platform with 100 million users and roughly the same number of arguments about best practices.</p>



<p>Both communities are powered by generosity, obsession, and strong opinions about tools.<br>Circular needles vs. straight needles? Vim vs. VS Code? Same energy.</p>



<h2 class="wp-block-heading">7. The Joy (and Futility) of Creation</h2>



<p>At the end of the day, both crafts deliver the same hit of dopamine.<br>You start with nothing — just a string (of yarn or text) — and end up with something that exists because <em>you</em> made it.</p>



<p>It’s imperfect, a little weird, but undeniably yours.</p>



<p>And when someone asks, <em>“Wow, you made that yourself?”</em><br>You smile, nod, and think:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>“Yes. And I spent six hours debugging it because I missed a comma.”</p>
</blockquote>



<h2 class="wp-block-heading">Epilogue</h2>



<p>So the next time someone tells you knitting is old-fashioned, remind them it’s basically low-level parallel processing. And when someone says programming is too abstract, remind them: it’s just digital crochet with extra parentheses.</p>



<p>Either way, we’re all just trying to get our loops to run without tangling.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Understanding Binding in Gridware Cluster Scheduler</title>
		<link>https://bablick.de/understanding-binding-in-gridware-cluster-scheduler/</link>
		
		<dc:creator><![CDATA[ernst.bablick]]></dc:creator>
		<pubDate>Sat, 25 Oct 2025 20:13:16 +0000</pubDate>
				<category><![CDATA[HPC]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA["chiplet"]]></category>
		<category><![CDATA["core binding"]]></category>
		<category><![CDATA["Gridware Cluster Scheduler"]]></category>
		<category><![CDATA["parallel computing"]]></category>
		<category><![CDATA["scheduler"]]></category>
		<category><![CDATA["socket binding"]]></category>
		<category><![CDATA["thread binding"]]></category>
		<category><![CDATA[Binding]]></category>
		<category><![CDATA[NUMA]]></category>
		<guid isPermaLink="false">https://bablick.de/?p=133</guid>

					<description><![CDATA[Modern compute nodes have grown increasingly complex — featuring heterogeneous cores, multi-level caches, and intricate NUMA topologies. In the previous post, Compute Nodes with Heterogeneous Topology in Gridware Cluster Scheduler, we looked at how these topologies are detected and represented in Gridware Cluster Scheduler. This post explores binding — how the scheduler decides where exactly...]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.33%"><figure class="wp-block-post-featured-image"><img loading="lazy" decoding="async" width="512" height="512" src="https://bablick.de/wp-content/uploads/2025/10/Brain-Topology-Binding-e1761421460621.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="Binding Topology" style="object-fit:cover;" /></figure></div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:66.66%">
<p>Modern compute nodes have grown increasingly complex — featuring heterogeneous cores, multi-level caches, and intricate NUMA topologies. In the previous post, <a href="https://bablick.de/compute-nodes-with-heterogenious-topology-in-gridware-cluster-scheduler/"><em>Compute Nodes with Heterogeneous Topology in Gridware Cluster Scheduler</em></a>, we looked at how these topologies are detected and represented in <strong>Gridware Cluster Scheduler</strong>.</p>



<p>This post explores <strong>binding</strong> — how the scheduler decides <em>where</em> exactly a job runs within a node, and how users can control this behavior for optimal performance.</p>
</div>
</div>



<span id="more-133"></span>



<h2 class="wp-block-heading">Why Binding Matters</h2>



<p>In high-performance computing (HPC), <strong>resource binding</strong> defines how processes or threads are mapped to specific CPU resources. Effective binding ensures predictable performance by preventing multiple jobs from competing for the same core, cache, or memory subsystem. It also enhances bandwidth utilization for attached devices such as network interfaces, InfiniBand adapters, and GPUs by maintaining locality between compute tasks and their associated hardware resources..</p>



<p><strong>Gridware Cluster Scheduler</strong> treats binding as a <strong>first-class resource</strong>. Unlike traditional schedulers where binding was merely a hint, in Gridware Cluster Scheduler it is a <strong>hard requirement</strong> — a job will only start once the requested binding can be fulfilled.</p>



<h2 class="wp-block-heading">From Slots to Binding</h2>



<p>If you’ve read the previous post, you already know about the <strong>slot concept</strong> — where each slot represents a unit of computational capacity on a node. Here’s the full analogy that makes the difference between <em>slots</em> and <em>binding</em> concrete:</p>



<ul class="wp-block-list">
<li><strong>Slots = seats on an airplane.</strong> A compute node has a fixed number of slots, just as a plane has a fixed number of seats. Each sequential job and each task of a parallel job needs <strong>one slot</strong>, like each passenger needs <strong>one seat</strong>.</li>



<li><strong>Binding = weight-balanced placement and freight.</strong> Binding determines <em>where</em> the job runs within the node. In the airplane analogy, that’s like <strong>assigning specific rows/sections</strong> and <strong>placing freight in defined compartments</strong> to maintain balance. Similarly, binding pins tasks to <strong>threads, cores, sockets, dies (L3), or NUMA nodes</strong> so they benefit from nearby caches and memory and don’t interfere with other workloads.</li>
</ul>



<p>In short: slots define <strong>how many</strong>, binding defines <strong>where</strong> — the placement that preserves locality and stability.</p>



<h2 class="wp-block-heading">Binding Units and Amounts</h2>



<p>Binding behavior is primarily controlled with the <code>-bunit</code> and <code>-bamount</code> parameters during job submission.</p>



<h3 class="wp-block-heading">Define the Binding Level with <code>-bunit &lt;unit&gt;</code></h3>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:100%">
<figure class="wp-block-table"><table><thead><tr><th>Unit</th><th>Description</th></tr></thead><tbody><tr><td><strong>T</strong> or <strong>CT</strong></td><td>CPU thread of a power core</td></tr><tr><td><strong>ET</strong></td><td>CPU thread of an efficiency core</td></tr><tr><td><strong>C</strong></td><td>Power core (default)</td></tr><tr><td><strong>E</strong></td><td>Efficiency core</td></tr><tr><td><strong>S</strong> or <strong>CS</strong></td><td>All power cores of a socket</td></tr><tr><td><strong>ES</strong></td><td>All efficiency cores of a socket</td></tr><tr><td><strong>X</strong> or <strong>CX</strong></td><td>All power cores sharing the same L3 cache (chiplet/die)</td></tr><tr><td><strong>EX</strong></td><td>All efficiency cores sharing the same L3 cache</td></tr><tr><td><strong>Y</strong> or <strong>CY</strong></td><td>All power cores sharing the same L2 cache</td></tr><tr><td><strong>EY</strong></td><td>All efficiency cores sharing the same L2 cache</td></tr><tr><td><strong>N</strong> or <strong>CN</strong></td><td>All power cores of a NUMA node</td></tr><tr><td><strong>EN</strong></td><td>All efficiency cores of a NUMA node</td></tr></tbody></table></figure>
</div>
</div>



<p>Each unit level corresponds to a layer in the hardware hierarchy. </p>



<h3 class="wp-block-heading">Specify the Number of Units with <code>-bamount &lt;number&gt;</code></h3>



<p>The <strong>binding amount</strong> defines how many binding units should be assigned per slot (or per host).</p>



<pre class="wp-block-code"><code>qsub -pe mpi_8 16 -bunit C -bamount 2 ...</code></pre>



<p>This job requests 16 slots across two hosts. Each slot binds to <strong>two power cores</strong>, ideal for tasks starting two lightweight threads (or processes).</p>



<p>If the threads are tightly coupled, <strong>thread binding</strong> can be more suitable:</p>



<pre class="wp-block-code"><code>qsub -pe mpi_8 16 -bunit T -bamount 2 ...</code></pre>



<p>Binding threads instead of cores can enhance total cluster throughput by minimizing stalls from system calls, cache misses, and network delays, and by improving cache locality (especially for producer–consumer pairs). While each job may take up to twice as long to complete, the increased parallelism—running twice as many jobs simultaneously—often results in a net performance improvement of 5–10%.</p>



<p>Chiplet or die binding can be especially beneficial on modern CPUs where groups of cores share a common L3 cache. By aligning tasks to those chiplets, cache locality is preserved and cross-die memory traffic is minimized.</p>



<pre class="wp-block-code"><code>qsub ... -btype host -bunit X -bamount 1</code></pre>



<p>This command binds each job or task to all cores that share the same L3 cache. It ensures that the job exclusively uses that cache domain and its attached resources (e.g. GPU or I/O devices), preventing other jobs from interfering. Also this can result in a performance benefit even if the job might not use all cores of the die.</p>



<h2 class="wp-block-heading">Binding Types: Slot vs. Host</h2>



<p>Binding can be applied <strong>per slot</strong> (as we saw in previous examples) or <strong>per host</strong> using the <code>-btype</code> parameter.</p>



<ul class="wp-block-list">
<li><strong>Slot-based binding</strong> (default):<br>Each slot gets its own binding. This maximizes flexibility and is ideal for mixed workloads.</li>



<li><strong>Host-based binding</strong>:<br>Binding is applied collectively for all slots on a host, ensuring consistent placement but reducing flexibility.</li>
</ul>



<pre class="wp-block-code"><code>qsub -pe mpi_8 16 -btype host -bunit X -bamount 1 ...</code></pre>



<p>Here, the job get 16 slots (8 per host) and <strong>Gridware Cluster Scheduler</strong> binds each group to one die (L3-cache). This host-wide approach minimizes fragmentation and improves cache locality.</p>



<p>Once a job (or advance reservation) is scheduled, its actual binding can be inspected with <code>qstat</code> (or <code>qrstat</code>)</p>



<pre class="wp-block-code"><code>qstat -j &lt;job_id&gt;   # or  qrstat -ar &lt;ar_id&gt;
...
binding:               bamount=16,binstance=set,bstrategy=pack,btype=host,bunit=X
exec_binding_list 1:   host1=NSxccccccccXCCCCCCCC,host2=NSxccccccccXCCCCCCCC</code></pre>



<p>The first line shows the binding request; the second lists the binding actually applied per host (lower case letters in the topology string). In this example, all cores below the first L3 cache of the first socket were used.</p>



<h2 class="wp-block-heading">Binding Filters</h2>



<p>Sometimes certain cores or sockets should be left free — for example, one core per host reserved for system tasks. Binding filters, defined with <code>-bfilter</code>, make this possible.</p>



<p>A filter uses a <strong>topology string</strong> where lowercase letters mark excluded units.</p>



<p>Example:</p>



<pre class="wp-block-code"><code>qsub -bfilter ScCCCScCCC ...</code></pre>



<p>Here, the first core of each socket is masked and will not be used for binding. All other cores remain available.</p>



<p>Administrators can also define global filters by keyword:</p>



<pre class="wp-block-code"><code>qconf -sconf | grep binding_params
binding_params ... filter=first_core</code></pre>



<p>Global and job-specific filters are additive, and both restrictions apply simultaneously.</p>



<h2 class="wp-block-heading">Packed Binding (and What Comes Next)</h2>



<p>The <strong>packed binding strategy</strong> is the default in <strong>Gridware Cluster Scheduler</strong>.<br>It assigns available hardware units sequentially from left to right within a node’s topology string, ensuring that each host is filled efficiently while maintaining cache and NUMA locality.</p>



<p>Packed binding automatically groups tasks on nearby cores and within shared cache domains to reduce latency and memory contention.<br>If a host does not have enough free units to satisfy a job’s binding request, the scheduler simply skips that host.</p>



<p>What has been written so far is available in <strong>Open Cluster Scheduler (OCS)</strong>  and <strong>Gridware Cluster Scheduler (GCS)</strong>.</p>



<p>However, Gridware Cluster Scheduler introduces <a href="https://bablick.de/how-binding-order-and-range-shape-job-placement-in-gridware-cluster-scheduler/" data-type="post" data-id="158">extended binding control</a>. Packed binding can be refined through additional options — <strong><code>-bsort</code></strong>, <strong><code>-bstart</code></strong>, and <strong><code>-bstop</code></strong> — which let you influence the <strong>order</strong> and <strong>region</strong> of unit selection.</p>



<p>These <strong>advanced strategies</strong> are available <strong>only in Gridware Cluster Scheduler</strong> and will be discussed in detail in the <strong>next blog post</strong>.</p>



<p>🚀 <strong>Stay connected!</strong><br>Follow me on <strong><a href="https://x.com/ebablick" data-type="link" data-id="https://x.com/ebablick">X (Twitter)</a></strong> or join <strong>HPC-Gridware</strong> on <strong><a href="https://www.linkedin.com/company/hpc-gridware" data-type="link" data-id="https://www.linkedin.com/company/hpc-gridware">LinkedIn</a></strong> and <strong><a href="https://x.com/HPC_Gridware" data-type="link" data-id="https://x.com/HPC_Gridware">X (Twitter)</a></strong> for the latest release announcements, expert tips, and in-depth technical insights from our team.</p>



<p>🔧 <strong>Try it today:</strong> nightly builds featuring the latest <strong>OCS</strong> and <strong>GCS</strong> enhancements discussed in this post are now available from <strong><a href="https://hpc-gridware.com/download-main/" data-type="link" data-id="https://hpc-gridware.com/download-main/">HPC-Gridware</a></strong>.</p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Compute Nodes with Heterogeneous Topology in Gridware Cluster Scheduler</title>
		<link>https://bablick.de/compute-nodes-with-heterogenious-topology-in-gridware-cluster-scheduler/</link>
		
		<dc:creator><![CDATA[ernst.bablick]]></dc:creator>
		<pubDate>Thu, 23 Oct 2025 19:12:25 +0000</pubDate>
				<category><![CDATA[HPC]]></category>
		<category><![CDATA[Binding]]></category>
		<category><![CDATA[CPU]]></category>
		<category><![CDATA[Gridware]]></category>
		<category><![CDATA[NUMA]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Scheduling]]></category>
		<guid isPermaLink="false">https://bablick.de/?p=125</guid>

					<description><![CDATA[As CPUs evolve toward hybrid designs with mixed core types and increasingly complex memory hierarchies, HPC schedulers must also evolve.This post explains how Gridware Cluster Scheduler 9.1.0 meets that challenge—bringing detailed, topology-aware resource scheduling to modern heterogeneous compute nodes. Why Topology Awareness Matters In modern high-performance computing (HPC), CPU cores within a single socket may...]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.33%"><figure class="wp-block-post-featured-image"><img loading="lazy" decoding="async" width="512" height="512" src="https://bablick.de/wp-content/uploads/2025/10/Brain-topology-e1761246631294.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="Hardware Topology" style="object-fit:cover;" /></figure></div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:66.66%">
<p>As CPUs evolve toward hybrid designs with mixed core types and increasingly complex memory hierarchies, HPC schedulers must also evolve.<br>This post explains how <strong>Gridware Cluster Scheduler 9.1.0</strong> meets that challenge—bringing detailed, topology-aware resource scheduling to modern heterogeneous compute nodes.</p>
</div>
</div>



<span id="more-125"></span>



<h2 class="wp-block-heading">Why Topology Awareness Matters</h2>



<p>In modern high-performance computing (HPC), CPU cores within a single socket may differ in clock frequency, power characteristics, or cache layout. Meanwhile, memory hierarchies—NUMA nodes, multi-level caches, and chiplets—add new layers of complexity.</p>



<p>To schedule jobs efficiently, a cluster manager must understand and exploit this hardware topology.<br><strong>Gridware Cluster Scheduler 9.1.0</strong> introduces expanded binding and topology-awareness features to maximize performance and ensure predictable resource placement.</p>



<h2 class="wp-block-heading">Three Hardware Topologies from NVIDIA, AMD, and Intel</h2>



<p>To demonstrate the scheduler’s new capabilities, the following sections show real-world topology examples from <strong>NVIDIA</strong>, <strong>AMD</strong>, and <strong>Intel</strong> hardware.</p>



<h3 class="wp-block-heading">NVIDIA DGX Spark</h3>



<p>The <strong>NVIDIA DGX Spark</strong>—notable for its presentation by Jensen Huang to Elon Musk at SpaceX—uses a <strong>heterogeneous ARM architecture</strong> optimized for AI/ML workloads.<br>The system features <strong>20 ARM cores</strong> organized into <strong>five performance tiers</strong>, each with unique efficiency and frequency characteristics:</p>



<pre class="wp-block-code"><code>CPU-Type #4: efficiency=4, cpuset=0x00080000
  FrequencyMaxMHz = 4004
  LinuxCapacity   = 1024
CPU-Type #3: efficiency=3, cpuset=0x00078000
  FrequencyMaxMHz = 3978
  LinuxCapacity   = 1017
CPU-Type #2: efficiency=2, cpuset=0x000003e0
  FrequencyMaxMHz = 3900
  LinuxCapacity   = 997
CPU-Type #1: efficiency=1, cpuset=0x00007c00
  FrequencyMaxMHz = 2860
  LinuxCapacity   = 731
CPU-Type #0: efficiency=0, cpuset=0x0000001f
  FrequencyMaxMHz = 2808
  LinuxCapacity   = 718</code></pre>



<p>Using Intel’s terminology, this architecture could be viewed as <strong>10 Power cores</strong> and <strong>10 Efficiency cores</strong><br>(10 × ARM Cortex-X925 + 10 × ARM Cortex-A725). Each core has private L1/L2 caches, and groups of 10 share an L3 cache.</p>



<pre class="wp-block-code"><code>&gt; loadcheck -cb | grep Topology
Topology (GCS): NSXEEEEECCCCCXEEEEECCCCC</code></pre>



<p>Gridware Cluster Scheduler uses <strong>topology strings</strong> to represent such layouts.<br>Here: <code>N</code> = NUMA node, <code>S</code> = socket, <code>X</code> = L3 cache, <code>E</code> = Efficiency core, and <code>C</code> = Power core.</p>



<h3 class="wp-block-heading">Intel i9-14900HX</h3>



<p>While the <strong>Intel i9-14900HX</strong> isn’t typical for HPC clusters, it’s an ideal case study for <strong>hybrid core</strong> architectures.</p>



<pre class="wp-block-code"><code>&gt; loadcheck -cb | grep Topology
Topology (GCS): NSXCTTCTTCTTCTTCTTCTTCTTCTTYEEEEYEEEEYEEEEYEEEE</code></pre>



<ul class="wp-block-list">
<li><strong>Power cores (C)</strong>: Dual-threaded (<code>T</code>), each with its own L2 cache.</li>



<li><strong>Efficiency cores (E)</strong>: Single-threaded, grouped by four per L2 cache (<code>Y</code>).</li>



<li><strong>NUMA node (N)</strong> and <strong>socket (S)</strong>: Encompass both core types and a shared L3 cache (<code>X</code>).</li>
</ul>



<h3 class="wp-block-heading">AMD EPYC Zen5</h3>



<p>The <strong>AMD EPYC Zen5</strong> series (e.g., <code>AMD-Epyc-Zen5-c4d-highmem-384</code>) represents a <strong>chiplet-based homogeneous design</strong>.<br>Each core provides two hardware threads, and the L3 cache structure (<code>X</code>) maps directly to chiplets/dies.</p>



<pre class="wp-block-code"><code>&gt; loadcheck -cb | grep Topology
Topology (GCS): NSXCTTCTTCTTCTTCTTCTTCTTCTT XCTTCTTCTTCTTCTTCTTCTTCTT
                  XCTTCTTCTTCTTCTTCTTCTTCTT XCTTCTTCTTCTTCTTCTTCTTCTT
                  ... (repeated chiplet layout per socket)
                NSXCTTCTTCTTCTTCTTCTTCTTCTT XCTTCTTCTTCTTCTTCTTCTTCTT
                  XCTTCTTCTTCTTCTTCTTCTTCTT XCTTCTTCTTCTTCTTCTTCTTCTT
                  ... (repeated chiplet layout per socket)</code></pre>



<p>Each socket (<code>S</code>) corresponds to one NUMA node (<code>N</code>), while every core has a private L2 cache.</p>



<h2 class="wp-block-heading">Handling Heterogeneous Topologies in Gridware Cluster Scheduler</h2>



<p>Efficient scheduling means <strong>assigning tasks to the most suitable hardware</strong>.<br>If a parallel job spans both slow and fast cores, the slowest becomes a bottleneck. Similarly, crossing NUMA or cache boundaries increases latency.</p>



<p>Gridware Cluster Scheduler 9.1 introduces <strong>fine-grained binding control</strong>, allowing binding to:</p>



<ul class="wp-block-list">
<li><strong>Sockets</strong></li>



<li><strong>Cores</strong></li>



<li><strong>Threads</strong></li>



<li><strong>NUMA nodes</strong></li>



<li><strong>Chiplets/Dies (cache domains)</strong></li>
</ul>



<p>This ensures optimal locality and predictable performance, even on hybrid or asymmetric systems.</p>



<h3 class="wp-block-heading">Chiplet/Die Binding Example</h3>



<pre class="wp-block-code"><code>qsub -pe mpi 15 -btype host -bamount 2 -bunit X ...</code></pre>



<p>This example requests <strong>15 MPI tasks</strong>, all running on a single host. Using <code>-btype host</code>, binding is applied relative to the host topology. With <code>-bamount 2 -bunit X</code>, each job portion binds to <strong>two chiplets/dies</strong>, ensuring that cache boundaries are respected and minimizing cross-die interference.</p>



<p>💡 <em>In this setup, the job uses 15 out of 16 available cores. The scheduler keeps the remaining core idle to prevent contention.</em></p>



<h2 class="wp-block-heading">Summary</h2>



<p>With version 9.1.0, Gridware Cluster Scheduler becomes fully topology-aware, bridging the gap between modern heterogeneous hardware and intelligent workload scheduling.<br>By supporting multiple binding types (core, socket, thread, NUMA, chiplet/die), it ensures efficient resource utilization and predictable performance across diverse compute nodes.</p>



<p>We are currently in the QA phase of this release and welcome user feedback on these new features.<br>They are already included in our nightly builds for testing, and beta releases will be available soon.<br><a href="https://hpc-gridware.com/download-main/" data-type="link" data-id="https://hpc-gridware.com/download-main/">Download Gridware Cluster Scheduler</a></p>



<p>Stay tuned with HPC-Gridware for updates — we’ll share <a href="https://bablick.de/understanding-binding-in-gridware-cluster-scheduler/" data-type="post" data-id="133">more insights</a>, examples, and best practices as we approach the official release.</p>



<p>Follow me at <a href="https://x.com/ebablick" data-type="link" data-id="https://x.com/ebablick">X/Twitter</a> or follow us at HPC-Gridware (<a href="https://www.linkedin.com/company/hpc-gridware" data-type="link" data-id="https://www.linkedin.com/company/hpc-gridware">LinkedIn</a>, <a href="https://x.com/HPC_Gridware" data-type="link" data-id="https://x.com/HPC_Gridware">X/Twitter</a>) for release announcements, tips, and technical insights.</p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Turn Your Supernote into a Knowledge Hub with Obsidian</title>
		<link>https://bablick.de/turn-your-supernote-into-a-knowledge-hub-with-obsidian/</link>
		
		<dc:creator><![CDATA[ernst.bablick]]></dc:creator>
		<pubDate>Sat, 20 Sep 2025 21:53:03 +0000</pubDate>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[E-Ink]]></category>
		<category><![CDATA[Obsidian]]></category>
		<category><![CDATA[Supernote]]></category>
		<guid isPermaLink="false">https://bablick.de/?p=110</guid>

					<description><![CDATA[There are several ways to install Obsidian on a Supernote Device. Below are the steps I successfully followed from my Linux notebook: Enable Sideloading on the Supernote Install Google Platform Tools on Your Computer Connect Your Computer and Supernote Install F-Droid Install the Aurora Store via F-Droid Install Obsidian from the Aurora Store Open the...]]></description>
										<content:encoded><![CDATA[
<p>There are several ways to install Obsidian on a <a href="https://supernote.com/pages/supernote-manta" data-type="link" data-id="https://supernote.com/pages/supernote-manta">Supernote Device</a>. Below are the steps I successfully followed from my Linux notebook:</p>



<h2 class="wp-block-heading">Enable Sideloading on the Supernote</h2>



<ul class="wp-block-list">
<li>Open <em>Settings</em> on your Supernote and go to <em>Security and Privacy</em>.</li>



<li>Enable <em>Sideloading</em> by switching the toggle.</li>
</ul>



<h2 class="wp-block-heading">Install Google Platform Tools on Your Computer</h2>



<ul class="wp-block-list">
<li>Download the <em><a href="https://developer.android.com/tools/releases/platform-tools">SDK Platform Tools</a></em>.</li>



<li>Install them on your machine. On Linux, the package includes an application named <code>adb</code>, which is required.</li>
</ul>



<h2 class="wp-block-heading">Connect Your Computer and Supernote</h2>



<ul class="wp-block-list">
<li>Connect your Supernote to your computer.</li>



<li>Run the following command to verify the connection</li>
</ul>



<pre class="wp-block-code"><code>adb devices</code></pre>



<h2 class="wp-block-heading">Install F-Droid</h2>



<ul class="wp-block-list">
<li><a href="https://f-droid.org/">F-Droid</a> is an app store for Android devices (including the Supernote).</li>



<li>Download the <code>fdroid.apk</code> file and scan it with your preferred antivirus tool (e.g., <a href="https://www.virustotal.com/gui/home/upload">VirusTotal</a>).</li>



<li>Once verified, upload the APK to your Supernote:</li>
</ul>



<pre class="wp-block-code"><code>adb install &lt;path&gt;/F-Droid.apk</code></pre>



<h2 class="wp-block-heading">Install the Aurora Store via F-Droid</h2>



<ul class="wp-block-list">
<li>On first launch, <em>F-Droid</em> may take a while to load available apps (requires Wi-Fi).</li>



<li>Search for <em>Aurora</em> and install the <em>Aurora Store</em>. The Aurora Store is an open-source client for <em>Google Play</em> with a clean design and privacy features.</li>
</ul>



<h2 class="wp-block-heading">Install Obsidian from the Aurora Store</h2>



<p>Open the <em>Aurora Store</em> and download <em>Obsidian</em> to your Supernote.</p>



<h2 class="wp-block-heading">Customize Obsidian Settings</h2>



<ul class="wp-block-list">
<li>On first launch, create a new vault or sync an existing one.</li>



<li>For appearance, I recommend installing the <em>Minimal theme</em> under <em>Appearance</em>.</li>



<li>The theme also has a companion plugin called <em>Minimal Theme Settings</em>.</li>



<li>Switch the color scheme to <em>E-Ink</em> for an excellent reading and writing experience on the Supernote.</li>
</ul>



<p>✨ That’s it! You now have Obsidian running on your Supernote, optimized for its e-ink display.</p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Automatically Create, Rotate and Destroy Periodic ZFS Snapshots</title>
		<link>https://bablick.de/automatically-create-rotate-and-destroy-periodic-zfs-snapshots/</link>
		
		<dc:creator><![CDATA[ernst.bablick]]></dc:creator>
		<pubDate>Fri, 29 Aug 2025 21:48:12 +0000</pubDate>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[ZFS]]></category>
		<category><![CDATA[ZFS-Snapshots]]></category>
		<guid isPermaLink="false">https://bablick.de/?p=91</guid>

					<description><![CDATA[The main reason for moving my home directories to a ZFS file system is ZFS&#8217;s support for snapshots. I have found them quite handy on server systems when something has been accidentally deleted, a software upgrade has failed, or software has not done what it promised. A simple rollback to a previous state can help...]]></description>
										<content:encoded><![CDATA[
<p>The main reason for moving my home directories to a ZFS file system is ZFS&#8217;s support for snapshots. I have found them quite handy on server systems when something has been accidentally deleted, a software upgrade has failed, or software has not done what it promised. A simple rollback to a previous state can help undo changes and allow you to continue safely. ZFS-Auto-Snapshot is a tool that uses cron to automatically create, rotate and destroy snapshots in the background.</p>



<h2 class="wp-block-heading">How To Do</h2>



<p>Install the zfs-auto-snapshot package</p>



<pre class="wp-block-code"><code>sudo apt install zfs-auto-snapshot</code></pre>



<p>On Ubuntu and Debian, cron scripts are already in place to trigger the script.</p>



<p>Enabling or disabling automatic snapshots for a specific ZFS is done via ZFS properties. This property is inherited by all descendant datasets, so there is no need to set it manually for each one.</p>



<pre class="wp-block-code"><code>sudo zfs set com.sun:auto-snapshot=true zhome/home</code></pre>



<p>You should also specify where you don&#8217;t want to see snapshots.</p>



<pre class="wp-block-code"><code>sudo zfs set com.sun:auto-snapshot=false zhome/home/tstusr1
sudo zfs set com.sun:auto-snapshot=false zhome/home/tstusr2</code></pre>



<p>You can enable or disable frequent (every 15 minutes), hourly, daily, weekly or monthly snapshots. They are all enabled by default, so the first snapshot should appear soon.</p>



<pre class="wp-block-code"><code>zfs set com.sun:auto-snapshot:frequent=false zhome/home/tstusr
zfs set com.sun:auto-snapshot:daily=true ...
zfs set com.sun:auto-snapshot:monthly=true ...
...</code></pre>



<p>The following commands are helpful for listing, creating and destroying snapshots:</p>



<pre class="wp-block-code"><code>zfs list -t snapshot

zfs snapshot -r zpool/foo/bar@name

zfs destroy zpool/foo/bar@name</code></pre>



<p>To restore to a certain snapshot, ZFS will roll back <strong>all</strong> the files and delete all the newer snapshots, so be careful!</p>



<pre class="wp-block-code"><code>zfs rollback zpool/foo/bar@name -r</code></pre>



<p>ZFS itself does not support deleting large numbers of snapshots, but this command comes in handy for that purpose.</p>



<pre class="wp-block-code"><code>sudo zfs list -H -o name -t snapshot zhome/somedir | xargs -n1 zfs destroy</code></pre>



<p>ZFS rollbacks are permanent. They recover everything from the snapshot. If you only want to recover some files or directories, ZFS does not support this directly. However, there is a workaround: Clone the snapshot to a different location and mount the clone. Restore the required files and then delete the clone.</p>



<pre class="wp-block-code"><code>sudo zfs clone zhome/home/ebablick@zfs-auto-snap_frequent-2025-08-25-1845 \
         -o mountpoint=/mnt zhome/ebablick_clone_of_snapshot_2025-08-25-1845

copy /mnt/... /to/...

sudo zfs destroy zhome/ebablick_clone_of_snapshot_2025-08-25-1845 -r</code></pre>



<p>Take a look at the zfs-auto-snapshot(8) manual page. The tool itself offers a few interesting options for executing pre- and post-snapshot commands. The number of snapshots to keep can also be configured via command line arguments, which then need to be adapted for the cron jobs.</p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Open Cluster Scheduler and Gridware Cluster Scheduler v9.0.8 are Available</title>
		<link>https://bablick.de/open-cluster-scheduler-and-gridware-cluster-scheduler-v9-0-8-are-available/</link>
		
		<dc:creator><![CDATA[ernst.bablick]]></dc:creator>
		<pubDate>Thu, 28 Aug 2025 13:15:59 +0000</pubDate>
				<category><![CDATA[HPC]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[GCS]]></category>
		<category><![CDATA[Gridware]]></category>
		<category><![CDATA[OCS]]></category>
		<guid isPermaLink="false">https://bablick.de/?p=100</guid>

					<description><![CDATA[OCS and GCS v9.0.8 are now available. As usual, the packages can be downloaded from the HPC-Gridware download page, and the source code is available on the Cluster Scheduler GitHub project page. The list of fixed issues mentioned in the Release Notes can be found here: Improvement CS-739 qstat -j output should contain job state,...]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><a href="https://www.hpc-gridware.com/"><img alt="HPC-Gridware Logo" loading="lazy" decoding="async" width="292" height="73" src="https://bablick.de/wp-content/uploads/2025/08/NEW-HPC-GRIDWARE-BLACK-DEMO.png" alt="" class="wp-image-103" style="width:400px;height:auto"/></a></figure></div>


<p>OCS and GCS v9.0.8 are now available. As usual, the packages can be downloaded from the <a href="https://hpc-gridware.com/download-ocs-9-0-8/">HPC-Gridware download page</a>, and the source code is available on the <a href="https://github.com/hpc-gridware/clusterscheduler">Cluster Scheduler GitHub project page</a>.</p>



<p>The list of fixed issues mentioned in the <a href="https://www.hpc-gridware.com/download/11138/?tmstv=1756385425">Release Notes</a> can be found here:</p>



<h3 class="wp-block-heading">Improvement</h3>



<p><a href="https://hpc-gridware.atlassian.net/browse/CS-739">CS-739</a> qstat -j output should contain job state, start time, queue name, and host names</p>



<h3 class="wp-block-heading">Task</h3>



<p><a href="https://hpc-gridware.atlassian.net/browse/CS-1407">CS-1407</a> Add SUSE SLES 15 support in support matrix of release notes</p>



<p><a href="https://hpc-gridware.atlassian.net/browse/CS-1440">CS-1440</a> Add qtelemetry licenses to GCS 3rdparty licenses directory</p>



<p><a href="https://hpc-gridware.atlassian.net/browse/CS-1470">CS-1470</a> do memory testing on V90_BRANCH for the 9.0.8 release</p>



<h3 class="wp-block-heading">Sub-task</h3>



<p><a href="https://hpc-gridware.atlassian.net/browse/CS-1394">CS-1394</a> Add start_time of array jobs tasks to qstat -j</p>



<p><a href="https://hpc-gridware.atlassian.net/browse/CS-1395">CS-1395</a> Cleanup of job states and show states also in qstat -j output</p>



<p><a href="https://hpc-gridware.atlassian.net/browse/CS-1396">CS-1396</a> Show granted host information in qstat -j output</p>



<p><a href="https://hpc-gridware.atlassian.net/browse/CS-1404">CS-1404</a> Show granted queues in qstat -j output</p>



<p><a href="https://hpc-gridware.atlassian.net/browse/CS-1410">CS-1410</a> Show priority in qstat -j output even if it is the base priority</p>



<h3 class="wp-block-heading">Bug</h3>



<p><a href="https://hpc-gridware.atlassian.net/browse/CS-671">CS-671</a> qrsh truncates the command line and/or output at 927 characters</p>



<p><a href="https://hpc-gridware.atlassian.net/browse/CS-1019">CS-1019</a> sge_execd logs errors when running tightly integrated parallel jobs</p>



<p><a href="https://hpc-gridware.atlassian.net/browse/CS-1270">CS-1270</a> Installation script clears screen in case of an error which make issues harder to debug</p>



<p><a href="https://hpc-gridware.atlassian.net/browse/CS-1381">CS-1381</a> qacct complains &#8220;error: ignoring invalid entry in line 436&#8221; for accounting records with huge command line entry</p>



<p><a href="https://hpc-gridware.atlassian.net/browse/CS-1386">CS-1386</a> man page for sge_share_mon is missing</p>



<p><a href="https://hpc-gridware.atlassian.net/browse/CS-1403">CS-1403</a> sge_ckpt man-page is in wrong section (1 instead of 5)</p>



<p><a href="https://hpc-gridware.atlassian.net/browse/CS-1422">CS-1422</a> endless loop in protocol between sge_qmaster and sge_execd in certain job failure situations</p>



<p><a href="https://hpc-gridware.atlassian.net/browse/CS-1424">CS-1424</a> qmod -sj on own job fails on submit only host</p>



<p><a href="https://hpc-gridware.atlassian.net/browse/CS-1429">CS-1429</a> sge_qmaster can segfault on qdel -f</p>



<p><a href="https://hpc-gridware.atlassian.net/browse/CS-1434">CS-1434</a> clearing error state of a job leads to event callback error logging in qmaster messages file</p>



<p><a href="https://hpc-gridware.atlassian.net/browse/CS-1435">CS-1435</a> rescheduling of jobs requires manager rights, documented is &#8220;manager or operator rights&#8221;</p>



<p><a href="https://hpc-gridware.atlassian.net/browse/CS-1436">CS-1436</a> qmod man pages says it requires manager or operator privileges to rerun a job, but a job owner may rerun his own jobs as well</p>



<p><a href="https://hpc-gridware.atlassian.net/browse/CS-1451">CS-1451</a> option -out of examples/jobsbin//work is broken</p>



<p><a href="https://hpc-gridware.atlassian.net/browse/CS-1476">CS-1476</a> Go DRMAA does not set JoinFiles() correctly</p>



<p><a href="https://hpc-gridware.atlassian.net/browse/CS-1477">CS-1477</a> In Go DRMAA TransferFiles() does not set all values</p>



<p>Please let me or the <a href="https://www.hpc-gridware.com/contact/" data-type="link" data-id="https://www.hpc-gridware.com/contact/">HPC-Gridware team</a> know if you have any questions.</p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Additional LUKS Encrypted Devices on Encryped Debian Trixie</title>
		<link>https://bablick.de/additional-luks-encrypted-devices-on-encryped-debian-trixie/</link>
		
		<dc:creator><![CDATA[ernst.bablick]]></dc:creator>
		<pubDate>Sun, 24 Aug 2025 13:15:11 +0000</pubDate>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Encryption]]></category>
		<category><![CDATA[LUKS]]></category>
		<guid isPermaLink="false">https://bablick.de/?p=80</guid>

					<description><![CDATA[My notebook runs a fully encrypted version of Debian 13 (including the root filesystem and SWAP). Now it&#8217;s time to activate a second NVMe device. This should also be encrypted, but I don&#8217;t want to have to specify the passphrase for that device every time I reboot. Instead, the key file should be located on...]]></description>
										<content:encoded><![CDATA[
<p>My notebook runs a fully encrypted version of Debian 13 (including the root filesystem and SWAP). Now it&#8217;s time to activate a second NVMe device. This should also be encrypted, but I don&#8217;t want to have to specify the passphrase for that device every time I reboot. Instead, the key file should be located on the root partition of the first device.</p>



<h1 class="wp-block-heading">Setup Steps</h1>



<h2 class="wp-block-heading">Preparing the Device (Repartitioning)</h2>



<ul class="wp-block-list">
<li>The NVMe device name can change during a reboot of a Linux system. For example, what was previously <strong>/dev/nvme1n1</strong> could now be <strong>/dev/nvme0n1</strong>, or vice versa. The <strong>lsblk -f</strong> command is useful for distinguishing between devices that have already been used and those that have just been added.</li>
</ul>



<ul class="wp-block-list">
<li><strong>wipefs</strong> removes old partitions/signatures for a device</li>
</ul>



<pre class="wp-block-code has-small-font-size"><code><strong>sudo wipefs -a /dev/nvme1n1</strong>
/dev/nvme1n1: 8 bytes were erased at offset 0x00000200 (gpt): 45 46 49 20 50 41 52 54
/dev/nvme1n1: 8 bytes were erased at offset 0xe8e0db5e00 (gpt): 45 46 49 20 50 41 52 54
/dev/nvme1n1: 2 bytes were erased at offset 0x000001fe (PMBR): 55 aa
/dev/nvme1n1: calling ioctl to re-read partition table: Success</code></pre>



<ul class="wp-block-list">
<li>Although there are other tools that can manipulate partition tables, I still use <strong>fdisk</strong> to create a single large partition on the disk. The <strong>fdisk</strong> suggestions help to create a partition with the correct alignment, which prevents performance issues or error messages in the subsequent steps. The (g) command creates a new GPT. (p) prints the partition table. (n) triggers the creation of a new partition. (t) allows you to specify a partition type, and (w) makes the data persistent by writing the information to the disk.</li>
</ul>



<pre class="wp-block-code has-small-font-size"><code><strong>sudo fdisk /dev/nvme1n1</strong>
Command (m for help): <strong>g</strong>
Created a new GPT disklabel (GUID: AC0EB50D-4E46-46C7-892D-BEE19E49E76F).

Command (m for help): <strong>p</strong>
Disk /dev/nvme1n1: 931,51 GiB, 1000204886016 bytes, 1953525168 sectors
Disk model: Samsung SSD 990 EVO 1TB                 
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: AC0EB50D-4E46-46C7-892D-BEE19E49E76F

Command (m for help): <strong>n</strong>
Partition number (1-128, default 1):
Partition number (1-128, default 1): 
First sector (2048-1953525134, default 2048): 
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-1953525134, default 1953523711): 
Created a new partition 1 of type 'Linux filesystem' and of size 931,5 GiB.

Command (m for help): <strong>p</strong>
Disk /dev/nvme1n1: 931,51 GiB, 1000204886016 bytes, 1953525168 sectors
Disk model: Samsung SSD 990 EVO 1TB                 
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: AC0EB50D-4E46-46C7-892D-BEE19E49E76F
Device         Start        End    Sectors   Size Type
/dev/nvme1n1p1  2048 1953523711 1953521664 931,5G Linux filesystem

Command (m for help): <strong>w</strong>
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.</code></pre>



<h2 class="wp-block-heading">Encryption with LUKS/LUKS2</h2>



<ul class="wp-block-list">
<li>The new partition should be LUKS-encrypted. Rather than using device names such as /dev/nvme…, I would like to identify the partition by a UUID. To this end, I will generate a new ID with <strong>uuidgen</strong> to pass to <strong>cryptsetup</strong>. The passphrase for the encryption must be specified, and <strong>lsblk</strong> can be used to verify the result.</li>
</ul>



<pre class="wp-block-code has-small-font-size"><code><strong>uuidgen</strong>
168b9568-0540-40b8-b939-882be97eb6bb

<strong>cryptsetup luksFormat -q --type luks --sector-size 4096 --cipher aes-xts-plain64 --key-size 256 --uuid 168b9568-0540-40b8-b939-882be97eb6bb --pbkdf argon2i /dev/nvme1n1p1</strong>

<strong>lsblk -f</strong>
...</code></pre>



<ul class="wp-block-list">
<li>The partition can now be opened. I chose the <strong>/dev/disk/by-uuid/…</strong> path for the device, and the device name will also later be available by the name <strong>UUID</strong>, prefixed by &#8216;<strong>luks-</strong>&#8216;, as with the other partitions initially created by the Debian installer. The <strong>ls</strong> command on <strong>/dev/mapper</strong> shows that the partition is available after entering the correct passphrase.</li>
</ul>



<pre class="wp-block-code has-small-font-size"><code><strong>sudo cryptsetup luksOpen --persistent --allow-discards --perf-no_write_workqueue --perf-no_read_workqueue /dev/disk/by-uuid/168b9568-0540-40b8-b939-882be97eb6bb luks-168b9568-0540-40b8-b939-882be97eb6bb</strong>
Enter passphrase for /dev/disk/by-uuid/168b9568-0540-40b8-b939-882be97eb6bb:

<strong>ls -la /dev/mapper/</strong>
...
lrwxrwxrwx  1 root root       7 24. Aug 00:56 luks-168b9568-0540-40b8-b939-882be97eb6bb -&gt; ../dm-2
</code></pre>



<h2 class="wp-block-heading">Opening/Mounting the Device</h2>



<ul class="wp-block-list">
<li>Once a partition has been encrypted, it must be activated/opened during the boot process so that it can be used. For the root partition and SWAP of a Debian system, this is done early by GRUB, even before the OS is running. For other partitions, such as our new one, <strong>systemd</strong> will perform this task. This step must be enabled by installing the necessary package.</li>
</ul>



<pre class="wp-block-code"><code><strong>sudo apt install systemd-cryptsetup</strong></code></pre>



<ul class="wp-block-list">
<li>Systemd also asks for a passphrase during the boot process, but I want a separate key file that <strong>systemd</strong> can automatically use to open the encrypted device.</li>



<li><strong>dd</strong> creates a key file containing random data. Access permissions for this file are restricted using the <strong>chmod</strong> command. The key is then added to the list of authorized keys that can access the device, which requires entering the initial passphrase. Finally, the status is dumped so that it can be verified.</li>
</ul>



<pre class="wp-block-code has-small-font-size"><code><strong>sudo dd if=/dev/urandom of=/crypto_keyfile_home.bin bs=512 count=8</strong>
<strong>
sudo chmod 600 /crypto_keyfile_home.bin</strong>
<strong>
sudo cryptsetup luksAddKey /dev/nvme1n1p1 /crypto_keyfile_home.bin</strong>
<strong>
sudo cryptsetup luksDump /dev/nvme1n1p1</strong></code></pre>



<ul class="wp-block-list">
<li>In order for <strong>systemd</strong> to recognize the new device, the <strong>/etc/crypttab</strong> file must be updated with a new entry (in one line).</li>
</ul>



<pre class="wp-block-code" style="font-size:13px"><code><strong>sudo vi /etc/crypttab</strong>
...
luks-168b9568-0540-40b8-b939-882be97eb6bb UUID=168b9568-0540-40b8-b939-882be97eb6bb	/crypto_keyfile_home.bin luks,discard,keyscript=/bin/cat</code></pre>



<ul class="wp-block-list">
<li>After rebooting, the <strong>ls</strong> command should show that all three encrypted devices are ready.</li>
</ul>



<pre class="wp-block-code has-small-font-size"><code><strong>ls -la /dev/mapper/</strong>
....
lrwxrwxrwx  1 root root       7 23. Aug 16:29 luks-011bd881-8ec3-4a12-91df-52e1928539fb -&gt; ../dm-1
lrwxrwxrwx  1 root root       7 24. Aug 00:56 luks-168b9568-0540-40b8-b939-882be97eb6bb -&gt; ../dm-2
lrwxrwxrwx  1 root root       7 23. Aug 16:29 luks-45cabb59-0bb5-4737-b6c9-6007657d7a27 -&gt; ../dm-0</code></pre>



<ul class="wp-block-list">
<li>The device can now be formatted and mounted …</li>
</ul>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Hibernation with Debian 13 Trixie on TUXEDO Stellaris 17</title>
		<link>https://bablick.de/hibernation-with-debian-13-trixie-on-tuxedo-stellaris-17/</link>
		
		<dc:creator><![CDATA[ernst.bablick]]></dc:creator>
		<pubDate>Sun, 11 Aug 2024 21:44:10 +0000</pubDate>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[Suspend]]></category>
		<category><![CDATA[SuspendToDisk]]></category>
		<category><![CDATA[Tuxedo]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<guid isPermaLink="false">https://bablick.de/?p=35</guid>

					<description><![CDATA[Since more than a year I use the TUXEDO Stellaris 17 Intel Gen6 Notebook for daily development. Ubuntu 24.04 is working there quite well. Thanks to TUXEDO, the hardware support if great but one thing what made me cringe was the lack of hibernation support and sporadic wake-ups can be frustrating and dangerous if the...]]></description>
										<content:encoded><![CDATA[
<p>Since more than a year I use the <a href="https://www.tuxedocomputers.com/en/TUXEDO-Stellaris-17-Gen6.tuxedo">TUXEDO Stellaris 17 Intel Gen6 Notebook</a> for daily development.</p>



<p>Ubuntu 24.04 is working there quite well. Thanks to TUXEDO, the hardware support if great but one thing what made me cringe was the lack of hibernation support and sporadic wake-ups can be frustrating and dangerous if the notebook should sleep in the bag when you are on the go.</p>



<p>The default Ubuntu 24.04 (and also TUXEDO&#8217;s adapted <a href="https://www.tuxedocomputers.com/en/TUXEDO-OS_1.tuxedo">TUXEDO OS</a>) does not setup a SWAP partition of the correct size which makes hibernation impossible. Even if you do this setup yourself you will find out that modes like SuspendThenHibernate will cause the system never to hibernate due to the unnecessary wake-up calls.</p>



<p>The frustration with hibernation was the main reason to give <a href="https://www.debian.org/devel/debian-installer/index.de.html">Debian 13 Trixie</a> a try to find out if this distributions also has such issues.</p>



<h1 class="wp-block-heading">Necessary Steps</h1>



<p>I can already summarize that not only was the default installation a success, but hibernation also works perfectly. Minor configuration steps were necessary on Debian 13 Trixie.</p>



<ul class="wp-block-list">
<li>The default installation on NVMe was problem-free. Debian supports LUKS encryption of partitions, including the SWAP partition, which contains the complete extract of the working memory in hibernation mode.</li>



<li>The SWAP partition automatically has the size of the RAM—more precisely, it is even slightly larger so that the contents of the RAM still fit in the partition despite the LUKS header. A manual hibernation test after installation confirmed that hibernation is working.</li>
</ul>



<pre class="wp-block-code has-small-font-size"><code><strong>sudo systemctl hibernate</strong></code></pre>



<ul class="wp-block-list">
<li>After restarting the notebook, the system wakes up again, asks for the encryption password, boots Linux, and continues where it left off.</li>



<li>The file <strong>/etc/systemd/sleep.conf</strong> contains the default settings for <strong>systemd</strong>, which is responsible for suspend and hibernate. I have adjusted the settings slightly to suit my needs:</li>
</ul>



<pre class="wp-block-code has-small-font-size"><code><strong>sudo vi /etc/systemd/sleep.conf</strong>

&#91;Sleep]
AllowSuspend=yes
AllowHibernation=yes
AllowSuspendThenHibernate=yes
AllowHybridSleep=yes
#SuspendState=mem standby freeze
#HibernateMode=platform shutdown
#MemorySleepMode=
HibernateDelaySec=30m
HibernateOnACPower=yes
#SuspendEstimationSec=60min</code></pre>



<ul class="wp-block-list">
<li>In particular, the <strong><a href="https://manpages.debian.org/unstable/systemd/systemd-sleep.conf.5.en.html">HibernateDelaySec</a></strong> is set to <strong>30m</strong>. In combination with my Gnome settings, this means that Gnome dims the screen after 10 minutes. After 15 minutes, the notebook is suspended for 30 minutes. During this time, touching the touch pad or pressing a key is enough to wake it up, but if you don&#8217;t do this, the notebook wakes up on its own after the time has elapsed, only to hibernate.</li>



<li>The Gnome shutdown menu does not yet include the option to trigger &#8216;hibernate&#8217;, &#8216;suspend then hibernate&#8217;, or &#8216;hybrid sleep&#8217; from the graphical user interface. However, this can be quickly remedied with a Gnome shell extension called <strong><a href="https://extensions.gnome.org/extension/755/hibernate-status-button/">Hibernate Status Button</a></strong>.</li>
</ul>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><a href="https://extensions.gnome.org/extension/755/hibernate-status-button/"><img alt="Hibernate Status Button Dialog" loading="lazy" decoding="async" width="609" height="1024" src="https://bablick.de/wp-content/uploads/2024/08/HibernateStatusButton-609x1024.png" alt="" class="wp-image-52" style="width:362px;height:auto" srcset="https://bablick.de/wp-content/uploads/2024/08/HibernateStatusButton-609x1024.png 609w, https://bablick.de/wp-content/uploads/2024/08/HibernateStatusButton-178x300.png 178w, https://bablick.de/wp-content/uploads/2024/08/HibernateStatusButton-768x1292.png 768w, https://bablick.de/wp-content/uploads/2024/08/HibernateStatusButton-913x1536.png 913w, https://bablick.de/wp-content/uploads/2024/08/HibernateStatusButton.png 1064w" sizes="auto, (max-width: 609px) 100vw, 609px" /></a></figure></div>


<ul class="wp-block-list">
<li>If you&#8217;re wondering what <strong>hybrid</strong> means: In this mode, the memory dump is written before the notebook is suspended and is available when a reboot is required, for example, if the battery runs out during sleep mode.</li>



<li>When you close the lid of a laptop, Debian Trixie automatically puts the laptop into sleep mode. If you would prefer something else to be triggered instead, this can be changed in <strong>/etc/systemd/logind.conf</strong>.</li>
</ul>



<pre class="wp-block-code has-small-font-size"><code><strong>sudo vi /etc/systemd/logind.conf</strong>

HandleLidSwitch=suspend-then-hibernate
HandleLidSwitchExternalPower=suspend-then-hibernate
...</code></pre>



<p></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
