{"id":1129,"date":"2026-09-15T06:48:40","date_gmt":"2026-09-15T06:48:40","guid":{"rendered":"https:\/\/virtualserversvps.com\/blog\/?p=1129"},"modified":"2026-09-15T06:48:40","modified_gmt":"2026-09-15T06:48:40","slug":"mysql-innodb-buffer-pool-sizing-1gb-vps","status":"publish","type":"post","link":"https:\/\/virtualserversvps.com\/blog\/mysql-innodb-buffer-pool-sizing-1gb-vps\/","title":{"rendered":"Sizing the InnoDB Buffer Pool for a 1 GB VPS: The Arithmetic Nobody Shows You"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The default MySQL configuration on most VPS images allocates `128M` to the InnoDB buffer pool. On a 1 GB instance running WordPress, that leaves roughly 700 MB of RAM idle while every `SELECT` that misses the pool goes to disk. Raising it is not guesswork \u2014 it is arithmetic with one hard ceiling and two soft ones. Here is the calculation, the configuration, and the counter readings that tell you when to stop.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The One Number You Must Not Exceed<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The buffer pool is not the only thing that uses RAM in a MySQL process. `innodb_buffer_pool_size` is the largest single allocation, and everything else in the process \u2014 per-connection buffers, the redo log, temporary tables, InnoDB internal structures \u2014 sits on top of it. Total RSS for a `mysqld` sized this way lands around `buffer_pool + 150\u2013250 MB` under light concurrency.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>VPS RAM<\/th><th>OS + web stack<\/th><th>Recommended pool<\/th><th>Expected mysqld RSS<\/th><\/tr><\/thead><tbody><tr><td>1 GB<\/td><td>~300 MB (nginx + PHP-FPM 4 workers)<\/td><td>384M \u2013 512M<\/td><td>560\u2013760 MB<\/td><\/tr><tr><td>2 GB<\/td><td>~500 MB<\/td><td>768M \u2013 1G<\/td><td>950 MB \u2013 1.25 GB<\/td><\/tr><tr><td>4 GB<\/td><td>~800 MB<\/td><td>2G \u2013 2.5G<\/td><td>2.2\u20132.9 GB<\/td><\/tr><tr><td>8 GB<\/td><td>~1.5 GB<\/td><td>4G \u2013 5G<\/td><td>4.3\u20135.5 GB<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The formula a DBA would write down: take `MemTotal`, subtract 350 MB for the kernel, SSH, systemd, and your monitoring agent, subtract the resident set of nginx plus PHP-FPM, subtract 200 MB of safety margin, and give the rest to the pool \u2014 capped at 75% of total RAM so page cache stays warm. On a 1 GB box that lands at 384\u2013512 MB.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Confirm Your PHP-FPM Footprint First<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Do not guess the web stack&#8217;s share. Measure it before you decide:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Real RSS of the components that compete with MySQL\nsudo systemctl restart php8.3-fpm nginx mysqld\nsleep 5\nps -eo rss,comm --sort=-rss | awk 'NR==1 || $1&gt;5000{printf \"%-8.1f MB  %s\\n\", $1\/1024, $2}'\necho \"--- MemAvailable ---\"; awk '\/MemAvailable\/{printf \"%.0f MB\\n\", $2\/1024}' \/proc\/meminfo<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">PHP-FPM with 4 `pm.max_children` runs about 30\u201345 MB per worker for a typical WordPress stack, so 4 workers is 120\u2013180 MB. If you see 8 workers, your pool budget is gone and the correct fix is `pm.max_children = 4`, not a smaller buffer pool.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Configuration That Actually Applies<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code># \/etc\/mysql\/mysql.conf.d\/zz-vps-tuning.cnf\n[mysqld]\ninnodb_buffer_pool_size         = 448M\ninnodb_buffer_pool_instances    = 1      # one instance per ~1 GB of pool\ninnodb_log_file_size            = 256M   # bigger = fewer checkpoints, faster writes\ninnodb_flush_method             = O_DIRECT\ninnodb_flush_log_at_trx_commit  = 2      # 1 = fully durable, 2 = ~1s loss window\ninnodb_io_capacity              = 2000   # NVMe; SSD ~800, spinning ~200\ninnodb_io_capacity_max          = 4000\ninnodb_read_io_threads          = 4\ninnodb_write_io_threads         = 4\ninnodb_buffer_pool_dump_at_shutdown = ON\ninnodb_buffer_pool_load_at_startup  = ON\ntmp_table_size                  = 32M\nmax_heap_table_size             = 32M\nperformance_schema              = OFF\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">`innodb_buffer_pool_instances = 1` matters more than people expect on small instances. Multiple instances each carry their own overhead and reduce the effective pool; the gain from splitting is only worth it above roughly 1 GB of pool. `performance_schema = OFF` recovers on the order of 150 MB of RSS on MySQL 8 \u2014 a meaningful amount when your pool is 448 MB.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Changing `innodb_log_file_size` requires a clean shutdown of MySQL (with a clean `innodb_fast_shutdown=0`) or the server refuses to start with the new size. Do this during a maintenance window, not on a live box.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Three Readings That Tell You to Stop Tuning<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li><b>Buffer pool hit rate<\/b> \u2014 `SHOW GLOBAL STATUS LIKE &#8216;Innodb_buffer_pool_read%&#8217;`. Target 99.9%+. The ratio is `reads\/read_requests`; below 99% means genuine working-set misses and a larger pool or an index fix.<\/li>\n<li><b>Pages free<\/b> \u2014 `SHOW GLOBAL STATUS LIKE &#8216;Innodb_buffer_pool_pages_free&#8217;`. If this is consistently above ~5% of `pages_total`, the pool is oversized. Give the RAM back to page cache.<\/li>\n<li><b>No swap growth<\/b> \u2014 if `pswpin` in `\/proc\/vmstat` moves while MySQL is under load, the pool is too large and the kernel is paging out parts of it. Shrink by 64 MB and retest.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Run one clean measurement cycle. Restart MySQL with the new config, warm the pool by replaying representative traffic for a few minutes, then take the readings. If the hit rate is above 99.9%, pages free are near zero, and swap is quiet, stop \u2014 you are done, and further increments to the pool will only push `mysqld` RSS past the point where the OS starts reclaiming the page cache that your file reads depend on.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Where the Working Set Actually Comes From<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Buffer pool sizing only helps if the data fits. On a WordPress VPS the hot set is typically `wp_posts`, `wp_postmeta`, and `wp_options`, which for a 5,000-post site is often under 200 MB. Run `SELECT table_name, ROUND((data_length+index_length)\/1024\/1024,1) AS mb FROM information_schema.tables WHERE table_schema=&#8217;wordpress&#8217; ORDER BY mb DESC LIMIT 15;` \u2014 if the sum of that list is under your pool size, a 99.9% hit rate is achievable and the remaining latency you see is query-shaped, not memory-shaped.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Two Settings That Undo Your Sizing Work<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A correctly sized buffer pool can still be defeated by two defaults that ship on most MySQL 8 images. First, `innodb_page_size` combined with a mismatched `innodb_buffer_pool_chunk_size`: the pool is allocated in chunks, defaulting to 128 MB, and MySQL silently rounds your setting up to the nearest multiple. Asking for 448 MB on a default install gets you 512 MB \u2014 and on a 1 GB VPS that missing 64 MB is the difference between page cache and swapping. Second, `innodb_numa_interleave` on multi-socket hosts, which is irrelevant on a VPS but occasionally set by over-eager hardening guides and causes uneven page placement.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Confirm what MySQL actually allocated, not what you asked for\nSELECT @@innodb_buffer_pool_size\/1024\/1024 AS configured_mb,\n       @@innodb_buffer_pool_chunk_size\/1024\/1024 AS chunk_mb,\n       @@innodb_buffer_pool_instances AS instances;\n-- The allocated total is rounded UP to a multiple of chunk_mb * instances.\n-- With chunk 128M and instances 1, 448M becomes 512M. Set chunk_size explicitly:\n--   innodb_buffer_pool_chunk_size = 64M   -&gt; 448M is then honoured exactly.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Verify with `SHOW GLOBAL STATUS LIKE &#8216;Innodb_buffer_pool_pages_total&#8217;` and multiply by `innodb_page_size` (16384 by default). If the product does not match your intended size, you are running with more pool than you budgeted and less kernel page cache than you planned for.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Reading the Hit Rate Correctly<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The common mistake is computing the hit rate from `Innodb_buffer_pool_reads` against `Innodb_buffer_pool_read_requests` over a lifetime \u2014 which includes the cold start and therefore always looks worse than reality. Compute it over an interval instead, so you are measuring steady state:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Sample 1\nSHOW GLOBAL STATUS WHERE Variable_name IN\n ('Innodb_buffer_pool_reads','Innodb_buffer_pool_read_requests');\n-- wait 300 seconds under normal traffic\n-- Sample 2, then: hit% = (1 - (reads2-reads1)\/(requests2-requests1)) * 100\n-- Target: &gt; 99.9%. Between 98% and 99.9% the pool is slightly small;\n-- below 95% you are losing to disk on a meaningful share of reads.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If your host is genuinely too small for the working set, sizing is the wrong lever. <a href=\"https:\/\/virtualserversvps.com\/\">Our VPS performance guides<\/a> cover the migration and resize path, and <a href=\"https:\/\/virtualserversvps.com\/#providers\">the provider comparison<\/a> lists plans with the RAM headroom where a 2 GB pool is not a compromise. Sizing a 448 MB pool is an optimisation; needing a 2 GB pool is a purchasing decision.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you are tuning a small VPS and want hardware that does not fight you, <a href=\"https:\/\/virtualserversvps.com\/#providers\">our VPS provider performance tables<\/a> break down CPU steal, NVMe IOPS, and RAM overcommit behaviour across the hosts we test on. Newer KVM nodes with dedicated vCPU pinning make the numbers in this article reproducible rather than aspirational. Two hosts we keep coming back to: <a href=\"https:\/\/interserver.net\/vps?id=1067805&amp;sid=virtualserversvps\" target=\"_blank\" rel=\"noreferrer noopener sponsored\">InterServer VPS<\/a> for flat-rate pricing with no RAM upcharge, and <a href=\"https:\/\/cloudways.com\/en\/?id=2010927&amp;data1=virtualserversvps\" target=\"_blank\" rel=\"noreferrer noopener sponsored\">Cloudways managed cloud<\/a> if you would rather not manage the kernel yourself. Compare the two against <a href=\"https:\/\/virtualserversvps.com\/\">the benchmark methodology we publish<\/a> before you commit.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The default MySQL configuration on most VPS images allocates `128M` to the InnoDB buffer pool. On a 1 GB instance running WordPress, that leaves roughly 700 MB of RAM idle&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":1,"footnotes":""},"categories":[3],"tags":[],"class_list":["post-1129","post","type-post","status-publish","format-standard","hentry","category-performance-optimization"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.1 (Yoast SEO v26.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Sizing the InnoDB Buffer Pool for a 1 GB VPS: The Arithmetic Nobody Shows You - Virtual Servers VPS Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/virtualserversvps.com\/blog\/mysql-innodb-buffer-pool-sizing-1gb-vps\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Sizing the InnoDB Buffer Pool for a 1 GB VPS: The Arithmetic Nobody Shows You\" \/>\n<meta property=\"og:description\" content=\"Sizing the InnoDB Buffer Pool for a 1 GB VPS: The Arithmetic Nobody Shows You\" \/>\n<meta property=\"og:url\" content=\"https:\/\/virtualserversvps.com\/blog\/mysql-innodb-buffer-pool-sizing-1gb-vps\/\" \/>\n<meta property=\"og:site_name\" content=\"Virtual Servers VPS Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-15T06:48:40+00:00\" \/>\n<meta name=\"author\" content=\"Virtual-Servers-Vps-Editor\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Virtual-Servers-Vps-Editor\" \/>\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\":\"WebPage\",\"@id\":\"https:\/\/virtualserversvps.com\/blog\/mysql-innodb-buffer-pool-sizing-1gb-vps\/\",\"url\":\"https:\/\/virtualserversvps.com\/blog\/mysql-innodb-buffer-pool-sizing-1gb-vps\/\",\"name\":\"Sizing the InnoDB Buffer Pool for a 1 GB VPS: The Arithmetic Nobody Shows You - Virtual Servers VPS Blog\",\"isPartOf\":{\"@id\":\"https:\/\/virtualserversvps.com\/blog\/#website\"},\"datePublished\":\"2026-09-15T06:48:40+00:00\",\"author\":{\"@id\":\"https:\/\/virtualserversvps.com\/blog\/#\/schema\/person\/82a299a8284a66ff49f97c74684724a0\"},\"breadcrumb\":{\"@id\":\"https:\/\/virtualserversvps.com\/blog\/mysql-innodb-buffer-pool-sizing-1gb-vps\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/virtualserversvps.com\/blog\/mysql-innodb-buffer-pool-sizing-1gb-vps\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/virtualserversvps.com\/blog\/mysql-innodb-buffer-pool-sizing-1gb-vps\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/virtualserversvps.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Sizing the InnoDB Buffer Pool for a 1 GB VPS: The Arithmetic Nobody Shows You\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/virtualserversvps.com\/blog\/#website\",\"url\":\"https:\/\/virtualserversvps.com\/blog\/\",\"name\":\"Virtual Servers VPS Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/virtualserversvps.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/virtualserversvps.com\/blog\/#\/schema\/person\/82a299a8284a66ff49f97c74684724a0\",\"name\":\"Virtual-Servers-Vps-Editor\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/virtualserversvps.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d820b15f1cd028e97610d9adf536df7be5cb6423869967037d468d5355fa003f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d820b15f1cd028e97610d9adf536df7be5cb6423869967037d468d5355fa003f?s=96&d=mm&r=g\",\"caption\":\"Virtual-Servers-Vps-Editor\"},\"sameAs\":[\"https:\/\/virtualserversvps.com\/blog\"],\"url\":\"https:\/\/virtualserversvps.com\/blog\/author\/virtualserversvps\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Sizing the InnoDB Buffer Pool for a 1 GB VPS: The Arithmetic Nobody Shows You - Virtual Servers VPS Blog","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:\/\/virtualserversvps.com\/blog\/mysql-innodb-buffer-pool-sizing-1gb-vps\/","og_locale":"en_US","og_type":"article","og_title":"Sizing the InnoDB Buffer Pool for a 1 GB VPS: The Arithmetic Nobody Shows You","og_description":"Sizing the InnoDB Buffer Pool for a 1 GB VPS: The Arithmetic Nobody Shows You","og_url":"https:\/\/virtualserversvps.com\/blog\/mysql-innodb-buffer-pool-sizing-1gb-vps\/","og_site_name":"Virtual Servers VPS Blog","article_published_time":"2026-09-15T06:48:40+00:00","author":"Virtual-Servers-Vps-Editor","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Virtual-Servers-Vps-Editor","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/virtualserversvps.com\/blog\/mysql-innodb-buffer-pool-sizing-1gb-vps\/","url":"https:\/\/virtualserversvps.com\/blog\/mysql-innodb-buffer-pool-sizing-1gb-vps\/","name":"Sizing the InnoDB Buffer Pool for a 1 GB VPS: The Arithmetic Nobody Shows You - Virtual Servers VPS Blog","isPartOf":{"@id":"https:\/\/virtualserversvps.com\/blog\/#website"},"datePublished":"2026-09-15T06:48:40+00:00","author":{"@id":"https:\/\/virtualserversvps.com\/blog\/#\/schema\/person\/82a299a8284a66ff49f97c74684724a0"},"breadcrumb":{"@id":"https:\/\/virtualserversvps.com\/blog\/mysql-innodb-buffer-pool-sizing-1gb-vps\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/virtualserversvps.com\/blog\/mysql-innodb-buffer-pool-sizing-1gb-vps\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/virtualserversvps.com\/blog\/mysql-innodb-buffer-pool-sizing-1gb-vps\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/virtualserversvps.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Sizing the InnoDB Buffer Pool for a 1 GB VPS: The Arithmetic Nobody Shows You"}]},{"@type":"WebSite","@id":"https:\/\/virtualserversvps.com\/blog\/#website","url":"https:\/\/virtualserversvps.com\/blog\/","name":"Virtual Servers VPS Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/virtualserversvps.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/virtualserversvps.com\/blog\/#\/schema\/person\/82a299a8284a66ff49f97c74684724a0","name":"Virtual-Servers-Vps-Editor","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/virtualserversvps.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/d820b15f1cd028e97610d9adf536df7be5cb6423869967037d468d5355fa003f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d820b15f1cd028e97610d9adf536df7be5cb6423869967037d468d5355fa003f?s=96&d=mm&r=g","caption":"Virtual-Servers-Vps-Editor"},"sameAs":["https:\/\/virtualserversvps.com\/blog"],"url":"https:\/\/virtualserversvps.com\/blog\/author\/virtualserversvps\/"}]}},"_links":{"self":[{"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/posts\/1129","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/comments?post=1129"}],"version-history":[{"count":2,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/posts\/1129\/revisions"}],"predecessor-version":[{"id":1135,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/posts\/1129\/revisions\/1135"}],"wp:attachment":[{"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/media?parent=1129"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/categories?post=1129"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/tags?post=1129"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}