{"id":18,"date":"2026-03-26T16:02:31","date_gmt":"2026-03-26T16:02:31","guid":{"rendered":"https:\/\/kr0311.com\/projects\/?p=18"},"modified":"2026-03-26T21:32:13","modified_gmt":"2026-03-26T21:32:13","slug":"the-day-12000-photos-fought-back","status":"publish","type":"post","link":"https:\/\/kr0311.com\/projects\/the-day-12000-photos-fought-back\/","title":{"rendered":"The Day 12,000 Photos Fought Back"},"content":{"rendered":"\n<p>I didn\u2019t plan for this to turn into a full system stress test.<br><br>What started as a simple job \u2013 organising an iCloud photo dump \u2013 quickly escalated into one of the most revealing (and slightly chaotic) moments I\u2019ve had with my homelab.<br><br>This post sits later in my homelab journey, once everything was already built and running smoothly. And honestly\u2026 it ended up being the perfect accidental test of the entire stack.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\uddf1 The Setup<\/h2>\n\n\n\n<p class=\"is-style-default\">At this point in my setup:<br>&#8211; Proxmox host (R730) running multiple VMs<br>&#8211; TrueNAS handling storage (ZFS)<br>&#8211; A Lubuntu VM used as a utility machine<\/p>\n\n\n\n<p>All running locally on the same host \u2014 no external bottlenecks, no excuses.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83c\udfaf The Task<\/h2>\n\n\n\n<p>The task was simple (or so I thought):<\/p>\n\n\n\n<p>Take ~12,000 photos and videos dumped into a single folder and organise them into a clean structure:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Sorted by: YYYY\/MM<\/pre>\n\n\n\n<p>Nice and tidy. Easy job\u2026 right?<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u26a0\ufe0f The First Mistake<\/h2>\n\n\n\n<p>I opened Rapid Photo Downloader and immediately selected the source folder\u2026<\/p>\n\n\n\n<p>Bad idea.<br><br>It instantly started scanning all 12,000 files, generating thumbnails, and confidently creating folder structures I never asked for.<br><br>Before I\u2019d even touched the settings.<br><br>At this point, I wasn\u2019t organising files anymore \u2014 I was watching chaos unfold in real time.<br><br>This resulted in a mess of incorrectly named folders that I then had to clean up manually.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd27 Reset &amp; Proper Approach<\/h2>\n\n\n\n<p>After admitting defeat (and undoing the damage via CLI), I tried again \u2014 properly this time.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Set destination first<\/li>\n\n\n\n<li>Configure folder structure (Year\/Month)<\/li>\n\n\n\n<li>Disable thumbnails generation<\/li>\n\n\n\n<li>THEN select source<\/li>\n<\/ol>\n\n\n\n<p>Amazing what happens when you do things in the right order.<\/p>\n\n\n\n<p>This made a huge difference in both performance and stability.<\/p>\n\n\n\n<p>After fixing the setup, the structure looked like this:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"576\" height=\"355\" src=\"https:\/\/kr0311.com\/projects\/wp-content\/uploads\/2026\/03\/Picture1.png\" alt=\"\" class=\"wp-image-22\" srcset=\"https:\/\/kr0311.com\/projects\/wp-content\/uploads\/2026\/03\/Picture1.png 576w, https:\/\/kr0311.com\/projects\/wp-content\/uploads\/2026\/03\/Picture1-300x185.png 300w\" sizes=\"auto, (max-width: 576px) 100vw, 576px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\ude80 When It Started Working&#8230; Properly<\/h2>\n\n\n\n<p>As soon as the job started correctly, things got interesting.<\/p>\n\n\n\n<p>Both the processing VM and storage VM started ramping up almost immediately.<br><br>The Lubuntu VM handling the sorting began chewing through memory and CPU, while TrueNAS kicked into gear, aggressively caching and handling I\/O like it had something to prove.<br><br>Lubuntu VM under load on the first attempt (before I gave it 12GB RAM):<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"576\" height=\"331\" src=\"https:\/\/kr0311.com\/projects\/wp-content\/uploads\/2026\/03\/Picture2.png\" alt=\"\" class=\"wp-image-23\" srcset=\"https:\/\/kr0311.com\/projects\/wp-content\/uploads\/2026\/03\/Picture2.png 576w, https:\/\/kr0311.com\/projects\/wp-content\/uploads\/2026\/03\/Picture2-300x172.png 300w\" sizes=\"auto, (max-width: 576px) 100vw, 576px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">\u2699\ufe0f What Was Actually Happening<\/h2>\n\n\n\n<p>This workload turned out to be far more demanding than expected:<br><br>&#8211; Thousands of small file operations<br>&#8211; Metadata (EXIF) parsing per file<br>&#8211; Constant read\/write operations<br>&#8211; Directory creation and file moves<br><br>Individually, each operation is tiny.<br><br>At this scale? Not so much.<br><br>This is pretty much a worst-case scenario for storage systems \u2014 lots of small, repetitive operations that don\u2019t scale nicely.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udcbe TrueNAS Behaviour<\/h2>\n\n\n\n<p>At the same time, TrueNAS started ramping up.<br><br>RAM usage shot up close to 100%, which might look alarming at first \u2014 but this is exactly what you want.<br>ZFS uses available memory for ARC cache, improving performance during heavy workloads.<br>Disk I\/O spiked as files were being read, moved, and rewritten across the dataset.<br><br>TrueNAS under heavy load:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"576\" height=\"251\" src=\"https:\/\/kr0311.com\/projects\/wp-content\/uploads\/2026\/03\/Picture3.png\" alt=\"\" class=\"wp-image-24\" srcset=\"https:\/\/kr0311.com\/projects\/wp-content\/uploads\/2026\/03\/Picture3.png 576w, https:\/\/kr0311.com\/projects\/wp-content\/uploads\/2026\/03\/Picture3-300x131.png 300w\" sizes=\"auto, (max-width: 576px) 100vw, 576px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\udde0 Meanwhile\u2026 The Host<\/h2>\n\n\n\n<p>And then there\u2019s the part that made me laugh.<br><br>Despite all of this activity\u2026<br>The Proxmox host itself barely broke a sweat.<br>CPU usage hovered around ~9%, and overall system resources were largely untouched.<br>It was basically sat there like:<br><br>\u201cIs that it?\u201d<br><br>This highlighted an important point:<br>The workload wasn\u2019t limited by compute power \u2014 it was limited by I\/O and per-file operations.<br><br>Meanwhile, the host:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"576\" height=\"208\" src=\"https:\/\/kr0311.com\/projects\/wp-content\/uploads\/2026\/03\/Picture4.png\" alt=\"\" class=\"wp-image-25\" srcset=\"https:\/\/kr0311.com\/projects\/wp-content\/uploads\/2026\/03\/Picture4.png 576w, https:\/\/kr0311.com\/projects\/wp-content\/uploads\/2026\/03\/Picture4-300x108.png 300w\" sizes=\"auto, (max-width: 576px) 100vw, 576px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\udde9 Conclusion<\/h2>\n\n\n\n<p>What started as a simple photo organisation task turned into a full-stack test of my homelab.<br><br>It validated:<br>&#8211; VM resource allocation<br>&#8211; Storage performance under load<br>&#8211; ZFS caching behaviour<br>&#8211; Overall system headroom<br><br>And more importantly\u2026<br><br>It proved the setup could handle real-world workloads without falling over \u2014 even if the VMs themselves looked like they were fighting for their lives at times.<\/p>\n\n\n\n<p>Also, a valuable lesson was learned:<\/p>\n\n\n\n<p>\ud83d\udc49 Configure first<br>\ud83d\udc49 Select 12,000 files second<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>What started as a simple photo organisation task quickly turned into a full system stress test across my homelab stack.<\/p>\n","protected":false},"author":1,"featured_media":35,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[8,12,10,13,9,15,16,11,18,14],"class_list":["post-18","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-experiments-incidents","tag-data-management","tag-file-organisation","tag-homelab","tag-linux","tag-photo-management","tag-proxmox","tag-real-world-test","tag-truenas","tag-unexpected-issues","tag-zfs"],"_links":{"self":[{"href":"https:\/\/kr0311.com\/projects\/wp-json\/wp\/v2\/posts\/18","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kr0311.com\/projects\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kr0311.com\/projects\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kr0311.com\/projects\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/kr0311.com\/projects\/wp-json\/wp\/v2\/comments?post=18"}],"version-history":[{"count":5,"href":"https:\/\/kr0311.com\/projects\/wp-json\/wp\/v2\/posts\/18\/revisions"}],"predecessor-version":[{"id":31,"href":"https:\/\/kr0311.com\/projects\/wp-json\/wp\/v2\/posts\/18\/revisions\/31"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kr0311.com\/projects\/wp-json\/wp\/v2\/media\/35"}],"wp:attachment":[{"href":"https:\/\/kr0311.com\/projects\/wp-json\/wp\/v2\/media?parent=18"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/kr0311.com\/projects\/wp-json\/wp\/v2\/categories?post=18"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kr0311.com\/projects\/wp-json\/wp\/v2\/tags?post=18"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}