{"id":13,"date":"2026-03-19T14:26:52","date_gmt":"2026-03-19T14:26:52","guid":{"rendered":"https:\/\/netguide.io\/tools\/?p=13"},"modified":"2026-03-19T14:26:53","modified_gmt":"2026-03-19T14:26:53","slug":"ceph-capacity-calculator","status":"publish","type":"post","link":"https:\/\/netguide.io\/tools\/en\/ceph-capacity-calculator\/","title":{"rendered":"Ceph Capacity Calculator"},"content":{"rendered":"\n<div class=\"wp-ceph-pro-container\">\n    <h3 class=\"wp-ceph-title\">Advanced Ceph Capacity Planner<\/h3>\n\n    <div class=\"wp-ceph-tabs\">\n        <button id=\"btn-simple\" class=\"active\" onclick=\"setCalcMode('simple')\">Simple Mode<\/button>\n        <button id=\"btn-manual\" onclick=\"setCalcMode('manual')\">Manual Mode (Per Node)<\/button>\n    <\/div>\n\n    <div class=\"wp-ceph-grid\">\n        <div class=\"wp-ceph-input-group\">\n            <label>Disk Unit Basis<\/label>\n            <select id=\"wp-unit\" onchange=\"calculateCeph()\">\n                <option value=\"1000\">Decimal (TB = 1000 GB)<\/option>\n                <option value=\"1024\">Binary (TiB = 1024 GiB)<\/option>\n            <\/select>\n        <\/div>\n        <div class=\"wp-ceph-input-group\">\n            <label>Redundancy Mode<\/label>\n            <select id=\"wp-mode\" onchange=\"toggleCephMode()\">\n                <option value=\"replica\">Replication<\/option>\n                <option value=\"ec\">Erasure Coding (EC)<\/option>\n            <\/select>\n        <\/div>\n    <\/div>\n\n    <div id=\"section-simple\">\n        <div class=\"wp-ceph-grid\">\n            <div class=\"wp-ceph-input-group\">\n                <label>Number of Nodes<\/label>\n                <input type=\"number\" id=\"wp-nodes\" value=\"3\" min=\"1\" oninput=\"calculateCeph()\">\n            <\/div>\n            <div class=\"wp-ceph-input-group\">\n                <label>OSDs per Node<\/label>\n                <input type=\"number\" id=\"wp-osds\" value=\"1\" min=\"1\" oninput=\"calculateCeph()\">\n            <\/div>\n            <div class=\"wp-ceph-input-group\">\n                <label>Size per Disk (TB\/TiB)<\/label>\n                <input type=\"number\" id=\"wp-size\" value=\"1\" min=\"0.1\" step=\"0.1\" oninput=\"calculateCeph()\">\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <div id=\"section-manual\" style=\"display:none;\">\n        <label style=\"font-size:11px; font-weight:bold; color: #666;\">NODE CONFIGURATION:<\/label>\n        <div id=\"manual-nodes-container\"><\/div>\n        <button class=\"wp-ceph-add-btn\" onclick=\"addManualNode()\">+ Add Node<\/button>\n    <\/div>\n\n    <div id=\"wp-replica-settings\" class=\"wp-ceph-settings-box\">\n        <label style=\"display:block; font-size:12px; font-weight:bold; margin-bottom:5px;\">Replication Factor<\/label>\n        <input type=\"number\" id=\"wp-replica-factor\" value=\"3\" min=\"1\" oninput=\"calculateCeph()\" style=\"width:100%; padding:8px; border:1px solid #ccc; border-radius:4px;\">\n    <\/div>\n\n    <div id=\"wp-ec-settings\" class=\"wp-ceph-settings-box\" style=\"display:none;\">\n        <div class=\"wp-ceph-grid\">\n            <div class=\"wp-ceph-input-group\"><label>Data Chunks (k)<\/label><input type=\"number\" id=\"wp-ec-k\" value=\"4\" oninput=\"calculateCeph()\"><\/div>\n            <div class=\"wp-ceph-input-group\"><label>Coding Chunks (m)<\/label><input type=\"number\" id=\"wp-ec-m\" value=\"2\" oninput=\"calculateCeph()\"><\/div>\n        <\/div>\n    <\/div>\n\n    <div class=\"wp-ceph-checkbox-group\">\n        <input type=\"checkbox\" id=\"wp-accept-degraded\" onchange=\"calculateCeph()\">\n        <label for=\"wp-accept-degraded\">Accept degraded PGs (Not recommended &#8211; ignores recovery reserve)<\/label>\n    <\/div>\n\n    <div class=\"wp-ceph-results\">\n        <div class=\"wp-ceph-res-item\"><span>Raw Capacity (Marketing TB):<\/span><span id=\"res-raw-tb\">0 TB<\/span><\/div>\n        <div class=\"wp-ceph-res-item\"><span>Raw Capacity (Ceph TiB):<\/span><span id=\"res-raw-tib\">0 TiB<\/span><\/div>\n        <div class=\"wp-ceph-res-item wp-ceph-total\"><span>Usable Capacity (Net):<\/span><span id=\"res-usable\">0 TiB<\/span><\/div>\n        <div class=\"wp-ceph-res-item\"><span id=\"safe-label\">Safe Capacity (80% + N-1 Reserve):<\/span><span id=\"res-safe\" class=\"wp-ceph-safe-val\">0 TiB<\/span><\/div>\n        <div class=\"wp-ceph-res-item\"><span>Efficiency:<\/span><span id=\"res-eff\" style=\"font-weight:bold; color: #46b450;\">0 %<\/span><\/div>\n    <\/div>\n\n    <style>\n        .wp-ceph-pro-container { max-width: 100%; background: #fff; padding: 20px; border: 1px solid #ddd; border-radius: 10px; font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif; color: #333; box-shadow: 0 2px 10px rgba(0,0,0,0.05); }\n        .wp-ceph-title { margin: 0 0 15px 0; color: #2271b1; font-size: 1.4rem; border-bottom: 1px solid #eee; padding-bottom: 10px; }\n        .wp-ceph-tabs { display: flex; gap: 5px; margin-bottom: 15px; }\n        .wp-ceph-tabs button { flex: 1; padding: 10px; border: 1px solid #ccc; background: #f7f7f7; cursor: pointer; font-size: 13px; border-radius: 5px; transition: 0.2s; }\n        .wp-ceph-tabs button.active { background: #2271b1; color: #fff; border-color: #2271b1; font-weight: bold; }\n        .wp-ceph-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(130px, 1fr)); gap: 12px; margin-bottom: 10px; }\n        .wp-ceph-input-group label { display: block; font-size: 11px; font-weight: bold; margin-bottom: 4px; text-transform: uppercase; color: #666; }\n        .wp-ceph-input-group input, .wp-ceph-input-group select { width: 100%; padding: 8px; border: 1px solid #ccc; border-radius: 4px; font-size: 14px; }\n        .wp-ceph-settings-box { background: #f0f6fb; padding: 15px; border-radius: 6px; margin: 15px 0; border: 1px solid #d1e1ef; }\n        .wp-ceph-checkbox-group { margin: 15px 0; font-size: 12px; display: flex; align-items: flex-start; gap: 10px; color: #d63638; line-height: 1.4; }\n        .wp-ceph-checkbox-group input { margin-top: 3px; }\n        .wp-ceph-results { margin-top: 20px; border-top: 2px solid #eee; padding-top: 15px; }\n        .wp-ceph-res-item { display: flex; justify-content: space-between; margin-bottom: 8px; font-size: 14px; }\n        .wp-ceph-total { font-weight: bold; font-size: 18px; color: #2271b1; margin: 12px 0; border-top: 1px solid #eee; border-bottom: 1px solid #eee; padding: 8px 0; }\n        .wp-ceph-safe-val { color: #d63638; font-weight: bold; }\n        .manual-node-row { display: grid; grid-template-columns: 1fr 1fr 40px; gap: 8px; margin-bottom: 8px; align-items: end; padding: 8px; background: #f9f9f9; border-radius: 4px; }\n        .wp-ceph-add-btn { background: #46b450; color: #fff; border: none; padding: 8px 15px; border-radius: 4px; cursor: pointer; font-size: 13px; margin-top: 5px; font-weight: bold; }\n        .btn-del { background: #d63638; color: #fff; border: none; border-radius: 4px; cursor: pointer; height: 35px; font-size: 18px; }\n    <\/style>\n\n    <script>\n        let calcMode = 'simple';\n        let manualNodes = [{osds: 10, size: 12}, {osds: 10, size: 12}, {osds: 10, size: 12}];\n\n        function setCalcMode(m) {\n            calcMode = m;\n            document.getElementById('btn-simple').className = (m === 'simple' ? 'active' : '');\n            document.getElementById('btn-manual').className = (m === 'manual' ? 'active' : '');\n            document.getElementById('section-simple').style.display = (m === 'simple' ? 'block' : 'none');\n            document.getElementById('section-manual').style.display = (m === 'manual' ? 'block' : 'none');\n            if(m === 'manual') renderManualNodes();\n            calculateCeph();\n        }\n\n        function addManualNode() {\n            manualNodes.push({osds: 10, size: 12});\n            renderManualNodes();\n            calculateCeph();\n        }\n\n        function removeNode(i) {\n            manualNodes.splice(i, 1);\n            renderManualNodes();\n            calculateCeph();\n        }\n\n        function renderManualNodes() {\n            const container = document.getElementById('manual-nodes-container');\n            container.innerHTML = '';\n            manualNodes.forEach((node, i) => {\n                const div = document.createElement('div');\n                div.className = 'manual-node-row';\n                div.innerHTML = `\n                    <div class=\"wp-ceph-input-group\"><label>OSDs<\/label><input type=\"number\" value=\"${node.osds}\" oninput=\"manualNodes[${i}].osds=parseFloat(this.value);calculateCeph()\"><\/div>\n                    <div class=\"wp-ceph-input-group\"><label>Size<\/label><input type=\"number\" value=\"${node.size}\" oninput=\"manualNodes[${i}].size=parseFloat(this.value);calculateCeph()\"><\/div>\n                    <button class=\"btn-del\" onclick=\"removeNode(${i})\">\u00d7<\/button>\n                `;\n                container.appendChild(div);\n            });\n        }\n\n        function toggleCephMode() {\n            const mode = document.getElementById('wp-mode').value;\n            document.getElementById('wp-replica-settings').style.display = (mode === 'replica') ? 'block' : 'none';\n            document.getElementById('wp-ec-settings').style.display = (mode === 'ec') ? 'block' : 'none';\n            calculateCeph();\n        }\n\n        function calculateCeph() {\n            const unit = parseFloat(document.getElementById('wp-unit').value);\n            const mode = document.getElementById('wp-mode').value;\n            const acceptDegraded = document.getElementById('wp-accept-degraded').checked;\n            \n            let rawDecimalTotal = 0;\n            let largestNodeRaw = 0;\n\n            if (calcMode === 'simple') {\n                const n = parseFloat(document.getElementById('wp-nodes').value) || 0;\n                const o = parseFloat(document.getElementById('wp-osds').value) || 0;\n                const s = parseFloat(document.getElementById('wp-size').value) || 0;\n                rawDecimalTotal = n * o * s;\n                largestNodeRaw = o * s;\n                \/\/ If input was TiB, convert to decimal base for standard math\n                if (unit === 1024) { rawDecimalTotal = rawDecimalTotal * (Math.pow(1024,4) \/ Math.pow(1000,4)); }\n            } else {\n                manualNodes.forEach(node => {\n                    let nodeRaw = (node.osds || 0) * (node.size || 0);\n                    rawDecimalTotal += nodeRaw;\n                    if(nodeRaw > largestNodeRaw) largestNodeRaw = nodeRaw;\n                });\n                if (unit === 1024) { rawDecimalTotal = rawDecimalTotal * (Math.pow(1024,4) \/ Math.pow(1000,4)); }\n            }\n\n            \/\/ Convert to TiB for Internal Ceph Logic\n            const rawTiB = unit === 1000 ? rawDecimalTotal * (Math.pow(1000,4) \/ Math.pow(1024,4)) : (rawDecimalTotal \/ (Math.pow(1024,4) \/ Math.pow(1000,4)));\n            const largestNodeTiB = unit === 1000 ? largestNodeRaw * (Math.pow(1000,4) \/ Math.pow(1024,4)) : (largestNodeRaw \/ (Math.pow(1024,4) \/ Math.pow(1000,4)));\n\n            let usableTiB = 0;\n            let efficiency = 0;\n\n            if (mode === 'replica') {\n                const f = parseFloat(document.getElementById('wp-replica-factor').value) || 1;\n                usableTiB = rawTiB \/ f;\n                efficiency = (1 \/ f) * 100;\n            } else {\n                const k = parseFloat(document.getElementById('wp-ec-k').value) || 1;\n                const m = parseFloat(document.getElementById('wp-ec-m').value) || 1;\n                usableTiB = rawTiB * (k \/ (k + m));\n                efficiency = (k \/ (k + m)) * 100;\n            }\n\n            \/\/ Safe Capacity Logic\n            let safeTiB = usableTiB * 0.8; \n            if (!acceptDegraded && rawTiB > 0) {\n                const recoveryReserve = (largestNodeTiB \/ rawTiB) * usableTiB;\n                safeTiB = (usableTiB - recoveryReserve) * 0.8;\n                document.getElementById('safe-label').innerText = \"Safe Capacity (80% + N-1 Reserve):\";\n            } else {\n                document.getElementById('safe-label').innerText = \"Safe Capacity (80% Fill Ratio):\";\n            }\n\n            const locale = 'en-US';\n            document.getElementById('res-raw-tb').innerText = (rawTiB * (Math.pow(1024,4) \/ Math.pow(1000,4))).toLocaleString(locale, {minimumFractionDigits: 1, maximumFractionDigits: 1}) + \" TB\";\n            document.getElementById('res-raw-tib').innerText = rawTiB.toLocaleString(locale, {minimumFractionDigits: 1, maximumFractionDigits: 1}) + \" TiB\";\n            document.getElementById('res-usable').innerText = usableTiB.toLocaleString(locale, {minimumFractionDigits: 1, maximumFractionDigits: 1}) + \" TiB\";\n            document.getElementById('res-safe').innerText = Math.max(0, safeTiB).toLocaleString(locale, {minimumFractionDigits: 1, maximumFractionDigits: 1}) + \" TiB\";\n            document.getElementById('res-eff').innerText = efficiency.toFixed(1) + \" %\";\n        }\n\n        calculateCeph();\n    <\/script>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Explanation of Settings<\/h2>\n\n\n\n<p>To ensure your Ceph cluster planning is successful, it is important to understand the technical parameters used in this calculator:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Unit Basis (TB vs. TiB):<\/strong> Hard drive manufacturers use decimal Terabytes (Base 1000). However, Ceph and operating systems calculate in binary Tebibytes (Base 1024). A &#8220;12 TB&#8221; drive provides only about <strong>10.9 TiB<\/strong> of raw capacity in Ceph.<\/li>\n\n\n\n<li><strong>Redundancy Mode:<\/strong> * <strong>Replication:<\/strong> Creates full copies of your data (Standard: 3x). Highly performant and simple, but expensive (33% efficiency).\n<ul class=\"wp-block-list\">\n<li><strong>Erasure Coding (EC):<\/strong> Breaks data into chunks ($k$) and adds parity chunks ($m$). Much higher efficiency (often > 60%), but requires more CPU resources.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>N-1 Reserve:<\/strong> In a healthy cluster, there must always be enough free space to allow the data from the largest node to be redistributed to the remaining servers in the event of a failure (Self-Healing).<\/li>\n\n\n\n<li><strong>Safe Fill Ratio (80%):<\/strong> Ceph should never be filled to 100%. At 85% (&#8220;Nearfull&#8221;), performance drops drastically. At 95% (&#8220;Full&#8221;), Ceph stops all write operations to prevent data corruption.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">What is Ceph?<\/h2>\n\n\n\n<p>Ceph is an <strong>open-source software-defined storage solution<\/strong> designed to run on standard hardware (commodity servers). Instead of buying a single, expensive storage filer, Ceph connects many individual servers (nodes) into one massive storage pool.<\/p>\n\n\n\n<p>The core advantages of Ceph are:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>No Single Point of Failure:<\/strong> If a server or a disk fails, the data remains available.<\/li>\n\n\n\n<li><strong>Unlimited Scalability:<\/strong> You can add new nodes at any time while the system is running.<\/li>\n\n\n\n<li><strong>Self-Healing:<\/strong> The system detects errors automatically and restores the desired redundancy without manual intervention.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Best Practices for Maximum Efficiency<\/h2>\n\n\n\n<p>Planning a cluster is always a balance between cost (efficiency), security, and performance.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">How many nodes are required?<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Replication (3x):<\/strong> You need <strong>at least 3 nodes<\/strong>. With only 2 nodes, a single failure would leave you with no copy to &#8220;heal&#8221; the cluster back to health.<\/li>\n\n\n\n<li><strong>Erasure Coding:<\/strong> The rule of thumb is <strong>$k + m + 1$ nodes<\/strong>. For an EC 4+2 profile (4 data chunks, 2 parity chunks), you should plan for at least 7 nodes. This way, one entire server can fail, and Ceph still has enough &#8220;targets&#8221; to redistribute the data in a $4+2$ scheme.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Efficiency Comparison<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><td><strong>Strategy<\/strong><\/td><td><strong>Min. Nodes (Recommended)<\/strong><\/td><td><strong>Efficiency (Net\/Raw)<\/strong><\/td><td><strong>Security<\/strong><\/td><\/tr><\/thead><tbody><tr><td><strong>Replica 3x<\/strong><\/td><td>3<\/td><td>33.3%<\/td><td>High (Fast recovery)<\/td><\/tr><tr><td><strong>EC 2+1<\/strong><\/td><td>4<\/td><td>66.7%<\/td><td>Medium (1 failure tolerated)<\/td><\/tr><tr><td><strong>EC 4+2<\/strong><\/td><td>7<\/td><td>66.7%<\/td><td>Very High (2 failures tolerated)<\/td><\/tr><tr><td><strong>EC 8+3<\/strong><\/td><td>12<\/td><td>72.7%<\/td><td>Extremely High<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Tips for Building Your Cluster<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Uniform OSD Sizes:<\/strong> Whenever possible, use hard drives of the same size. Ceph fills OSDs based on percentage. If you mix sizes (e.g., 4 TB and 12 TB), the small drives will fill up much faster, which can block the entire cluster.<\/li>\n\n\n\n<li><strong>Network Bandwidth:<\/strong> <strong>10 GbE networking<\/strong> is the absolute minimum for Ceph. In the event of a disk failure, Ceph must copy terabytes of data across the network. A 1 GbE network would become an immediate bottleneck and cripple your application performance.<\/li>\n\n\n\n<li><strong>OSD Distribution:<\/strong> Aim for about 10 to 15 OSDs (disks) per node. Having too many disks in a single server increases risk: if that one server fails, the network must compensate for a massive amount of data all at once.<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Advanced Ceph Capacity Planner Simple Mode Manual Mode (Per Node) Disk Unit Basis Decimal (TB = 1000 GB)Binary (TiB = [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[8],"tags":[],"class_list":["post-13","post","type-post","status-publish","format-standard","hentry","category-uncategorized-en"],"_links":{"self":[{"href":"https:\/\/netguide.io\/tools\/wp-json\/wp\/v2\/posts\/13","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/netguide.io\/tools\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/netguide.io\/tools\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/netguide.io\/tools\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/netguide.io\/tools\/wp-json\/wp\/v2\/comments?post=13"}],"version-history":[{"count":1,"href":"https:\/\/netguide.io\/tools\/wp-json\/wp\/v2\/posts\/13\/revisions"}],"predecessor-version":[{"id":15,"href":"https:\/\/netguide.io\/tools\/wp-json\/wp\/v2\/posts\/13\/revisions\/15"}],"wp:attachment":[{"href":"https:\/\/netguide.io\/tools\/wp-json\/wp\/v2\/media?parent=13"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/netguide.io\/tools\/wp-json\/wp\/v2\/categories?post=13"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/netguide.io\/tools\/wp-json\/wp\/v2\/tags?post=13"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}