{"id":10482,"date":"2026-09-21T07:20:00","date_gmt":"2026-09-21T05:20:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/?p=10482"},"modified":"2026-10-26T13:45:35","modified_gmt":"2026-10-26T12:45:35","slug":"why-prometheus-uses-too-much-memory-on-a-raspberry-pi-finding-excessive-time-series","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/why-prometheus-uses-too-much-memory-on-a-raspberry-pi-finding-excessive-time-series\/","title":{"rendered":"Why Prometheus Uses Too Much Memory on a Raspberry Pi: Finding Excessive Time Series"},"content":{"rendered":"<p>The number of exporters alone is insufficient for sizing a Raspberry Pi running Prometheus. Time-series count, scrape frequency, queries and retention all matter. Each time series is identified by its metric name and the complete combination of label values.<\/p>\n<p>The number of distinct combinations is called cardinality. The product of the label value counts is an upper bound, not an automatically reached total: some combinations may never occur. Adding a label with one fixed value does not multiply the count. A label with many changing values can nevertheless impose substantial costs.<\/p>\n<figure class=\"lw-diagram\">\n<img decoding=\"async\" alt=\"Example upper bound: 3 \u00d7 5 \u00d7 8 \u00d7 40 \u00d7 2,400 = 11,520,000 combinations. Only combinations actually exposed create series.\" height=\"580\" loading=\"lazy\" src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/quality-10482-20261024.png\" width=\"1120\"\/>\n<figcaption>Example upper bound: 3 \u00d7 5 \u00d7 8 \u00d7 40 \u00d7 2,400 = 11,520,000 combinations. Only combinations actually exposed create series.<\/figcaption>\n<\/figure>\n<h2>Value counts and turnover need separate attention<\/h2>\n<p>A label needs a controlled value set and a purpose. For <code>method<\/code> and <code>status<\/code>, actual counts depend on the application and instrumentation. HTTP specifies neither exactly five methods nor exactly twelve status values. Unknown methods can, for example, map to a common fallback value.<\/p>\n<p>Raw paths such as <code>\/wp-admin<\/code>, <code>\/.env<\/code> or <code>\/product\/12345<\/code> can create additional series if instrumentation copies every path into a label. Another request with the same complete label combination creates no additional series. Stored data are also subject to retention rather than remaining forever.<\/p>\n<table style=\"width:100%;border-collapse:collapse\"><thead><tr><th>Label<\/th><th>Typical source of values<\/th><th>Cardinality control<\/th><\/tr><\/thead><tbody><tr><td>job \/ instance<\/td><td>Targets and configuration<\/td><td>Inventory and target count<\/td><\/tr><tr><td>method \/ status<\/td><td>Application and protocol<\/td><td>Allowed values and fallback<\/td><\/tr><tr><td>handler \/ route<\/td><td>Route templates<\/td><td>Fixed route set; unknown fallback<\/td><\/tr><tr><td>path (raw)<\/td><td>Request paths<\/td><td>Normalization at the source<\/td><\/tr><tr><td>user_id \/ email<\/td><td>Individual identifiers<\/td><td>Omission from aggregate metrics<\/td><\/tr><tr><td>container_id \/ pod<\/td><td>Runtime instances<\/td><td>Current count and turnover<\/td><\/tr><\/tbody><\/table>\n<p>Churn means series appearing and disappearing, for example as pod identifiers change. If ten old series disappear and ten new series appear, the total stays the same despite twenty changes. A constant number of simultaneously present series can hide high churn. Old series remain relevant in the affected blocks during retention; with a stable turnover rate and bounded retention, the total does not have to keep growing every week.<\/p>\n<h2>Assessing resources without a fixed per-series allowance<\/h2>\n<p>Many series consume memory, CPU, storage and network capacity. Current series data and indexes, processing the write-ahead log (WAL) used for recovery, and large queries all contribute. A fixed kilobyte allowance per series is not a reliable capacity guarantee: label sizes, samples, versions and query loads vary. RAM, CPU or storage can become the first constraint on a Pi.<\/p>\n<p>Memory exhaustion can cause an out-of-memory (OOM) termination and a restart loop. This is a possible failure sequence, not a diagnosis established by a broken dashboard. Process memory, host headroom, restarts, logs and changes in series count need examination together.<\/p>\n<h2>Targeted queries for unusual series counts<\/h2>\n<p>The following PromQL examples initially limit the investigation to the example job <code>app<\/code>. An unrestricted scan across all metrics can add load to an already struggling Pi. The second query counts only present, nonempty <code>path<\/code> values; with no matching series, this PromQL expression returns no result rather than an automatically supplied zero.<\/p>\n<figure style=\"--cbb-digits:1\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"plain\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Text<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-plain\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\">topk(10, count by (__name__)({job=\"app\", __name__=~\".+\"}))\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">count(count by (path) (http_requests_total{job=\"app\", path!=\"\"}))\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">prometheus_tsdb_head_series\n<\/span><span class=\"cbb-line\">delta(prometheus_tsdb_head_series&#91;1h&#93;)<\/span><\/code><\/pre><\/figure><p>The head metrics require Prometheus self-scraping; an empty result can also mean that these metrics are not being collected.<\/p>\n<p>The first query identifies metric names with many series in the current query state. The second examines a label already selected for investigation; it does not automatically discover the offending label. A gauge records a current value that can rise or fall. The head series gauge includes series in the current TSDB head, the area holding recent measurements, and can differ from the series still available in an instant query. <code>delta<\/code> describes the net change of a gauge extrapolated across one hour, not the number of newly created series.<\/p>\n<p>A rising total can reflect legitimate growth; high churn can occur with a stable total. As a complement, <code>\/api\/v1\/status\/tsdb?limit=10<\/code> provides rankings by metric name and label values alongside head statistics. These diagnostics also have a cost. Comparison with a known baseline and exporter or deployment changes makes the results useful.<\/p>\n<h2>Removing a label does not aggregate values<\/h2>\n<p><code>labeldrop<\/code> removes label names but does not add values. For example, the counters <code>requests_total{path=\"\/a\"} 10<\/code> and <code>requests_total{path=\"\/b\"} 20<\/code> have the same identity after removing <code>path<\/code>. This does not reliably produce the correct total counter of 30. Collisions can cause samples to be rejected. Label removal is suitable only when the remaining series are still uniquely identified.<\/p>\n<p>A clearly scoped immediate measure is to exclude an expensive metric that is demonstrably dispensable from ingestion altogether. The following example drops every <code>http_requests_total<\/code> series solely in job <code>app<\/code>. Those samples will also be unavailable to dashboards and alerts; the metric name is an example requiring adaptation.<\/p>\n<figure style=\"--cbb-digits:1\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"yaml\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">YAML<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-yaml\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-attr\">scrape_configs<\/span>:\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-operator\">-<\/span> <span class=\"cbb-attr\">job_name<\/span>: <span class=\"cbb-string\">'app'<\/span>\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">static_configs<\/span>:\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-operator\">-<\/span> <span class=\"cbb-attr\">targets<\/span>: &#91;<span class=\"cbb-string\">'app:9100'<\/span>&#93;\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">metric_relabel_configs<\/span>:\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-operator\">-<\/span> <span class=\"cbb-attr\">source_labels<\/span>: &#91;__name__&#93;\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">regex<\/span>: <span class=\"cbb-string\">'http_requests_total'<\/span>\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">action<\/span>: drop<\/span><\/code><\/pre><\/figure>\n<p>A durable solution often belongs at the source: the exporter counts directly by normalized route template, such as <code>\/product\/:id<\/code>, with a fixed fallback for unknown routes. Merely relabeling already separate counters to the same identity would create another collision. A PromQL sum or recording rule can simplify analysis but does not prevent prior ingestion of the raw series. Before adoption, <code>promtool check config prometheus.yml<\/code> checks the configuration; valid YAML alone does not establish that a filter is appropriate.<\/p>\n<h2>A budget for new labels<\/h2>\n<p>Each label needs documented expectations for value count, turnover, possible combinations and usefulness. A configuration file does not guarantee low cardinality; a finite set can still be too large. Conversely, high cardinality does not automatically imply personal information: random container identifiers pose a different issue from email addresses.<\/p>\n<p>Direct personal identifiers are usually unnecessary for aggregate operational metrics and increase both cardinality and the volume of sensitive information. Omitting these labels reduces those risks but does not replace examination of other potentially personal measurement data.<\/p>\n<div class=\"lw-faq\"><h2>Questions and answers<\/h2>\n<h3>Does shorter retention help with memory exhaustion?<\/h3><p>Shorter retention primarily limits older data blocks. The current head and expensive queries still require resources. Prometheus initially writes blocks typically spanning two hours; the head normally covers a few hours rather than the full retention period. Compaction, restarts and operating conditions affect the exact span. After a filter changes, old series disappear neither immediately from the head nor retroactively from stored blocks.<\/p>\n<h3>Which limits reduce the risk of failure?<\/h3><p>Several safeguards complement controlled instrumentation, without guaranteeing uninterrupted operation:<\/p><ol><li><code>sample_limit<\/code> limits accepted samples per scrape after metric relabeling. Exceeding the limit fails the entire scrape; <code>up<\/code> becomes zero for the affected target. Normal values of <code>scrape_samples_post_metric_relabeling<\/code> plus justified headroom provide a basis for the limit. This does not cap the total stock of changing series across multiple scrapes.<\/li><li>Alerts on series count and its development help alongside memory, restart and scrape-error metrics. A growth alert alone detects neither every instance of churn nor every short load spike.<\/li><li>An effective hard container memory limit caps consumption within the relevant cgroup; an out-of-memory (OOM) termination there can stop Prometheus. Global memory pressure from other processes remains possible. With Docker, actual kernel\/cgroup support, effective limits and swap settings need verification, for example through <code>docker info<\/code> and the container configuration.<\/li><\/ol><\/div>\n<div class=\"lw-quellen\">\n<h2>Sources<\/h2>\n<ul>\n<li><a href=\"https:\/\/www.raspberrypi.com\/documentation\/computers\/raspberry-pi.html\" rel=\"noopener noreferrer\" target=\"_blank\">Raspberry Pi documentation<\/a><\/li>\n<li><a href=\"https:\/\/prometheus.io\/docs\/concepts\/data_model\/\" rel=\"noopener noreferrer\" target=\"_blank\">Prometheus: data model<\/a><\/li><li><a href=\"https:\/\/prometheus.io\/docs\/prometheus\/latest\/configuration\/configuration\/\" rel=\"noopener noreferrer\" target=\"_blank\">Prometheus: relabeling and scrape limits<\/a><\/li><li><a href=\"https:\/\/prometheus.io\/docs\/prometheus\/latest\/storage\/\" rel=\"noopener noreferrer\" target=\"_blank\">Prometheus: storage and retention<\/a><\/li><li><a href=\"https:\/\/prometheus.io\/docs\/practices\/instrumentation\/\" rel=\"noopener noreferrer\" target=\"_blank\">Prometheus: instrumentation<\/a><\/li><li><a href=\"https:\/\/prometheus.io\/docs\/prometheus\/latest\/querying\/api\/#tsdb-stats\" rel=\"noopener noreferrer\" target=\"_blank\">Prometheus: TSDB statistics<\/a><\/li><li><a href=\"https:\/\/prometheus.io\/docs\/prometheus\/3.9\/querying\/functions\/#delta\" rel=\"noopener noreferrer\" target=\"_blank\">Prometheus: delta<\/a><\/li><li><a href=\"https:\/\/prometheus.io\/docs\/prometheus\/latest\/querying\/basics\/#staleness\" rel=\"noopener noreferrer\" target=\"_blank\">Prometheus: staleness and query cost<\/a><\/li><li><a href=\"https:\/\/docs.docker.com\/engine\/containers\/resource_constraints\/\" rel=\"noopener noreferrer\" target=\"_blank\">Docker: memory limits<\/a><\/li><li><a href=\"https:\/\/www.iana.org\/assignments\/http-methods\/\" rel=\"noopener noreferrer\" target=\"_blank\">IANA: HTTP methods<\/a><\/li><\/ul>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>Prometheus identifies time series by metric name and label values. High cardinality and rapid turnover can strain a Raspberry Pi. Source normalization, targeted diagnostics and careful limits reduce risk; removing a label does not add counter values.<\/p>\n","protected":false},"author":1,"featured_media":31653,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[21],"tags":[91294,91181],"class_list":["post-10482","post","type-post","status-publish","format-standard","hentry","category-raspberry-pi","tag-monitoring","tag-raspberry-pi"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Why Prometheus Uses Too Much Memory on a Raspberry Pi: Finding Excessive Time Series | Lukas Wojcik<\/title>\n<meta name=\"description\" content=\"Why the number of time series is a product and not a sum, and the three queries that find the offender before the machine falls over.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/why-prometheus-uses-too-much-memory-on-a-raspberry-pi-finding-excessive-time-series\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Why Prometheus Uses Too Much Memory on a Raspberry Pi: Finding Excessive Time Series | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"Why the number of time series is a product and not a sum, and the three queries that find the offender before the machine falls over.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/why-prometheus-uses-too-much-memory-on-a-raspberry-pi-finding-excessive-time-series\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-21T05:20:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-26T12:45:35+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/klarheit-20261111-10482.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Lukas Wojcik\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lukas Wojcik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/raspberry-pi\\\/why-prometheus-uses-too-much-memory-on-a-raspberry-pi-finding-excessive-time-series\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/raspberry-pi\\\/why-prometheus-uses-too-much-memory-on-a-raspberry-pi-finding-excessive-time-series\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Why Prometheus Uses Too Much Memory on a Raspberry Pi: Finding Excessive Time Series\",\"datePublished\":\"2026-09-21T05:20:00+00:00\",\"dateModified\":\"2026-10-26T12:45:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/raspberry-pi\\\/why-prometheus-uses-too-much-memory-on-a-raspberry-pi-finding-excessive-time-series\\\/\"},\"wordCount\":1161,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/raspberry-pi\\\/why-prometheus-uses-too-much-memory-on-a-raspberry-pi-finding-excessive-time-series\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/klarheit-20261111-10482.png\",\"keywords\":[\"Monitoring\",\"Raspberry Pi\"],\"articleSection\":[\"Raspberry PI\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/raspberry-pi\\\/why-prometheus-uses-too-much-memory-on-a-raspberry-pi-finding-excessive-time-series\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/raspberry-pi\\\/why-prometheus-uses-too-much-memory-on-a-raspberry-pi-finding-excessive-time-series\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/raspberry-pi\\\/why-prometheus-uses-too-much-memory-on-a-raspberry-pi-finding-excessive-time-series\\\/\",\"name\":\"Why Prometheus Uses Too Much Memory on a Raspberry Pi: Finding Excessive Time Series | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/raspberry-pi\\\/why-prometheus-uses-too-much-memory-on-a-raspberry-pi-finding-excessive-time-series\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/raspberry-pi\\\/why-prometheus-uses-too-much-memory-on-a-raspberry-pi-finding-excessive-time-series\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/klarheit-20261111-10482.png\",\"datePublished\":\"2026-09-21T05:20:00+00:00\",\"dateModified\":\"2026-10-26T12:45:35+00:00\",\"description\":\"Why the number of time series is a product and not a sum, and the three queries that find the offender before the machine falls over.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/raspberry-pi\\\/why-prometheus-uses-too-much-memory-on-a-raspberry-pi-finding-excessive-time-series\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/raspberry-pi\\\/why-prometheus-uses-too-much-memory-on-a-raspberry-pi-finding-excessive-time-series\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/raspberry-pi\\\/why-prometheus-uses-too-much-memory-on-a-raspberry-pi-finding-excessive-time-series\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/klarheit-20261111-10482.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/klarheit-20261111-10482.png\",\"width\":1200,\"height\":630,\"caption\":\"Why Prometheus Uses Too Much Memory on a Raspberry Pi: Finding Excessive Time Series\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/raspberry-pi\\\/why-prometheus-uses-too-much-memory-on-a-raspberry-pi-finding-excessive-time-series\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Why Prometheus Uses Too Much Memory on a Raspberry Pi: Finding Excessive Time Series\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Why Prometheus Uses Too Much Memory on a Raspberry Pi: Finding Excessive Time Series | Lukas Wojcik","description":"Why the number of time series is a product and not a sum, and the three queries that find the offender before the machine falls over.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/why-prometheus-uses-too-much-memory-on-a-raspberry-pi-finding-excessive-time-series\/","og_locale":"en_US","og_type":"article","og_title":"Why Prometheus Uses Too Much Memory on a Raspberry Pi: Finding Excessive Time Series | Lukas Wojcik","og_description":"Why the number of time series is a product and not a sum, and the three queries that find the offender before the machine falls over.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/why-prometheus-uses-too-much-memory-on-a-raspberry-pi-finding-excessive-time-series\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-09-21T05:20:00+00:00","article_modified_time":"2026-10-26T12:45:35+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/klarheit-20261111-10482.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/why-prometheus-uses-too-much-memory-on-a-raspberry-pi-finding-excessive-time-series\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/why-prometheus-uses-too-much-memory-on-a-raspberry-pi-finding-excessive-time-series\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Why Prometheus Uses Too Much Memory on a Raspberry Pi: Finding Excessive Time Series","datePublished":"2026-09-21T05:20:00+00:00","dateModified":"2026-10-26T12:45:35+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/why-prometheus-uses-too-much-memory-on-a-raspberry-pi-finding-excessive-time-series\/"},"wordCount":1161,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/why-prometheus-uses-too-much-memory-on-a-raspberry-pi-finding-excessive-time-series\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/klarheit-20261111-10482.png","keywords":["Monitoring","Raspberry Pi"],"articleSection":["Raspberry PI"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/why-prometheus-uses-too-much-memory-on-a-raspberry-pi-finding-excessive-time-series\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/why-prometheus-uses-too-much-memory-on-a-raspberry-pi-finding-excessive-time-series\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/why-prometheus-uses-too-much-memory-on-a-raspberry-pi-finding-excessive-time-series\/","name":"Why Prometheus Uses Too Much Memory on a Raspberry Pi: Finding Excessive Time Series | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/why-prometheus-uses-too-much-memory-on-a-raspberry-pi-finding-excessive-time-series\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/why-prometheus-uses-too-much-memory-on-a-raspberry-pi-finding-excessive-time-series\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/klarheit-20261111-10482.png","datePublished":"2026-09-21T05:20:00+00:00","dateModified":"2026-10-26T12:45:35+00:00","description":"Why the number of time series is a product and not a sum, and the three queries that find the offender before the machine falls over.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/why-prometheus-uses-too-much-memory-on-a-raspberry-pi-finding-excessive-time-series\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/why-prometheus-uses-too-much-memory-on-a-raspberry-pi-finding-excessive-time-series\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/why-prometheus-uses-too-much-memory-on-a-raspberry-pi-finding-excessive-time-series\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/klarheit-20261111-10482.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/klarheit-20261111-10482.png","width":1200,"height":630,"caption":"Why Prometheus Uses Too Much Memory on a Raspberry Pi: Finding Excessive Time Series"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/why-prometheus-uses-too-much-memory-on-a-raspberry-pi-finding-excessive-time-series\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Why Prometheus Uses Too Much Memory on a Raspberry Pi: Finding Excessive Time Series"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/10482","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=10482"}],"version-history":[{"count":7,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/10482\/revisions"}],"predecessor-version":[{"id":27512,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/10482\/revisions\/27512"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/31653"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=10482"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=10482"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=10482"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}