{"id":9999,"date":"2017-05-08T12:51:01","date_gmt":"2017-05-08T10:51:01","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/postgresql-on-a-pure-storage-all-flash-array-populating-postgresql\/"},"modified":"2017-05-08T12:51:01","modified_gmt":"2017-05-08T10:51:01","slug":"postgresql-on-a-pure-storage-all-flash-array-populating-postgresql","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/postgresql-on-a-pure-storage-all-flash-array-populating-postgresql\/","title":{"rendered":"PostgreSQL on a Pure Storage All Flash Array &#8211; Populating PostgreSQL"},"content":{"rendered":"<p>Just be clear this is not a performance test as we had to connect the Pure Storage box through 1GB\/s interfaces. Basically it is more about how you can interact with the storage system (command line &amp; web interface) and to get a feeling on what is possible.<\/p>\n<p>In the <a href=\"https:\/\/www.dbi-services.com\/blog\/postgresql-on-a-pure-storage-all-flash-array-preparations\/\" target=\"_blank\">last post<\/a> we explained on how we did the setup for connecting a PostgreSQL server to the Pure Storage array. In this post we&#8217;ll actually give the array something to work with. However please take in account that the point here is to present the functional usage. It is not a pure performance evaluation as unfortunately we had on our infrastructure only 1Gb\/s interfaces available for the connection (sic). What we use for the tests is <a href=\"https:\/\/www.postgresql.org\/docs\/current\/static\/pgbench.html\" target=\"_blank\">pgbench<\/a> which is included with PostgreSQL and can be used to load a database and then perform a <a href=\"http:\/\/www.tpc.org\/tpcb\/\" target=\"_blank\">TPC-B<\/a> like performance test against the loaded data. Btw: pgbench is a great tool when you want to make the same tests against different configurations of PostgreSQL or the same configurations of PostgreSQL against different physical or virtual hardware configurations.<\/p>\n<p><!--more--><\/p>\n<p>To begin with lets create a dedicated database for loading the data into:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">postgres@pgpurestorage:\/home\/postgres\/ [pgpure] psql -c \"create database purestorage\" postgres\nCREATE DATABASE\nTime: 552.693 ms\n<\/pre>\n<p>We&#8217;ll use pgbench in initialization (&#8220;-i&#8221;) mode with a scale factor (&#8220;-s&#8221;) of 10000 for populating the database. The will create the pgbench_accounts, pgbench_branches, pgbench_history, and pgbench_tellers and will result in 1000000000 rows in total for the pgbench_accounts table.<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">postgres@pgpurestorage:\/home\/postgres\/ [pgpure] pgbench -i -s 10000 purestorage\n<\/pre>\n<p>The total run-time (including the vacuum at the end) was around 2,5 hours (this is including the index creation and the vacuum at the end) and this is the size of the database:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1; highlight: [7]\">pgpurestorage\/postgres MASTER (postgres@5432) # \\l+\n                                                                      List of databases\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\u2502    Name     \u2502  Owner   \u2502 Encoding \u2502   Collate   \u2502    Ctype    \u2502   Access privileges   \u2502  Size   \u2502 Tablespace \u2502                Descript\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\u2502 postgres    \u2502 postgres \u2502 UTF8     \u2502 en_US.UTF-8 \u2502 en_US.UTF-8 \u2502                       \u2502 7629 kB \u2502 pg_default \u2502 default administrative \n\u2502 purestorage \u2502 postgres \u2502 UTF8     \u2502 en_US.UTF-8 \u2502 en_US.UTF-8 \u2502                       \u2502 146 GB  \u2502 pg_default \u2502                        \n\u2502 template0   \u2502 postgres \u2502 UTF8     \u2502 en_US.UTF-8 \u2502 en_US.UTF-8 \u2502 =c\/postgres          \u21b5\u2502 7497 kB \u2502 pg_default \u2502 unmodifiable empty data\n\u2502             \u2502          \u2502          \u2502             \u2502             \u2502 postgres=CTc\/postgres \u2502         \u2502            \u2502                        \n\u2502 template1   \u2502 postgres \u2502 UTF8     \u2502 en_US.UTF-8 \u2502 en_US.UTF-8 \u2502 =c\/postgres          \u21b5\u2502 7497 kB \u2502 pg_default \u2502 default template for ne\n\u2502             \u2502          \u2502          \u2502             \u2502             \u2502 postgres=CTc\/postgres \u2502         \u2502            \u2502                        \n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n(4 rows)\n<\/pre>\n<p>The biggest table is the pgbench_accounts table:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1; highlight: [6]\">pgpurestorage\/purestorage MASTER (postgres@5432) # \\d+\n                           List of relations\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 Schema \u2502       Name       \u2502 Type  \u2502  Owner   \u2502  Size   \u2502 Description \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 public \u2502 pgbench_accounts \u2502 table \u2502 postgres \u2502 125 GB  \u2502             \u2502\n\u2502 public \u2502 pgbench_branches \u2502 table \u2502 postgres \u2502 392 kB  \u2502             \u2502\n\u2502 public \u2502 pgbench_history  \u2502 table \u2502 postgres \u2502 0 bytes \u2502             \u2502\n\u2502 public \u2502 pgbench_tellers  \u2502 table \u2502 postgres \u2502 4360 kB \u2502             \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n(4 rows)\n<\/pre>\n<p>.. which contains 1000000000 rows:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">pgpurestorage\/purestorage MASTER (postgres@5432) # select count(*) from pgbench_accounts;\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502   count    \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 1000000000 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n(1 row)\n\nTime: 219538.051 ms (03:39.538)\n<\/pre>\n<p>Here are the screenshots from the Pure Storage management console for the duration of the run (which started some minutes before 20:00). Orange are write operations, blue is read:<\/p>\n<p><a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/purestorage-pg-load-11.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-16291\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/purestorage-pg-load-11.png\" alt=\"purestorage-pg-load-1\" width=\"1114\" height=\"744\" \/><\/a><br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/purestorage-pg-load-2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-16289\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/purestorage-pg-load-2.png\" alt=\"purestorage-pg-load-2\" width=\"897\" height=\"743\" \/><\/a><\/p>\n<p>As you can see we are fare away from saturating the storage. So, lets do the same load again but this time with two sessions into two databases in parallel:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\"># session one \npostgres@pgpurestorage:\/home\/postgres\/ [pgpure] psql -c \"drop database if exists purestorage\" postgres\nDROP DATABASE\nTime: 983.297 ms\npostgres@pgpurestorage:\/home\/postgres\/ [pgpure] psql -c \"create database purestorage\" postgres\nCREATE DATABASE\nTime: 514.140 ms\npostgres@pgpurestorage:\/home\/postgres\/ [pgpure] pgbench -i -s 10000 purestorage\n\n# session two\npostgres@pgpurestorage:\/home\/postgres\/ [pgpure] psql -c \"drop database if exists purestorage2\" postgres\nDROP DATABASE\nTime: 0.110 ms\npostgres@pgpurestorage:\/home\/postgres\/ [pgpure] psql -c \"create database purestorage2\" postgres\nCREATE DATABASE\nTime: 274.576 ms\npostgres@pgpurestorage:\/home\/postgres\/ [pgpure] pgbench -i -s 10000 purestorage2\n<\/pre>\n<p>This screenshots from the Pure Storage console:<\/p>\n<p><a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/purestorage-pg-load-2-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-16296\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/purestorage-pg-load-2-1.png\" alt=\"purestorage-pg-load-2-1\" width=\"1662\" height=\"801\" \/><\/a><br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/purestorage-pg-load-2-2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-16297\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/purestorage-pg-load-2-2.png\" alt=\"purestorage-pg-load-2-2\" width=\"1665\" height=\"804\" \/><\/a><\/p>\n<p>It took more than double as long to load the 2000000000 rows but the limit is not on the storage. The average bandwidth went up from around 65 mb\/sec to around 90 mb\/sec. What is interesting to see is that we need only around 45GB real storage:<\/p>\n<p><a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/purestorage-pg-load-2-reduction.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-16299\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/purestorage-pg-load-2-reduction.png\" alt=\"purestorage-pg-load-2-reduction\" width=\"1662\" height=\"318\" \/><\/a><\/p>\n<p>This means we have a almost 9 times <a href=\"https:\/\/www.purestorage.com\/resources\/glossary\/data-reduction.html\" target=\"_blank\">compression\/de-duplication<\/a> on the storage layer. Remember that each database has a size of 146GB ( ( 146 * 2 = 292 ) \/ 9 = 32, plus the WAL files ):<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">                                                                     List of databases\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\u2502     Name     \u2502  Owner   \u2502 Encoding \u2502   Collate   \u2502    Ctype    \u2502   Access privileges   \u2502  Size   \u2502 Tablespace \u2502                Description           \n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\u2502 postgres     \u2502 postgres \u2502 UTF8     \u2502 en_US.UTF-8 \u2502 en_US.UTF-8 \u2502                       \u2502 7629 kB \u2502 pg_default \u2502 default administrative connection dat\n\u2502 purestorage  \u2502 postgres \u2502 UTF8     \u2502 en_US.UTF-8 \u2502 en_US.UTF-8 \u2502                       \u2502 146 GB  \u2502 pg_default \u2502                                      \n\u2502 purestorage2 \u2502 postgres \u2502 UTF8     \u2502 en_US.UTF-8 \u2502 en_US.UTF-8 \u2502                       \u2502 146 GB  \u2502 pg_default \u2502                                      \n\u2502 template0    \u2502 postgres \u2502 UTF8     \u2502 en_US.UTF-8 \u2502 en_US.UTF-8 \u2502 =c\/postgres          \u21b5\u2502 7497 kB \u2502 pg_default \u2502 unmodifiable empty database          \n\u2502              \u2502          \u2502          \u2502             \u2502             \u2502 postgres=CTc\/postgres \u2502         \u2502            \u2502                                      \n\u2502 template1    \u2502 postgres \u2502 UTF8     \u2502 en_US.UTF-8 \u2502 en_US.UTF-8 \u2502 =c\/postgres          \u21b5\u2502 7497 kB \u2502 pg_default \u2502 default template for new databases   \n\u2502              \u2502          \u2502          \u2502             \u2502             \u2502 postgres=CTc\/postgres \u2502         \u2502            \u2502                                      \n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n<\/pre>\n<p>What happens then when the file system gets full on the host but there still is storage available in the back-end? Lets copy one of the test databases: That should almost fill the file system:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">pgpurestorage\/postgres MASTER (postgres@5432) # \\! df -h\nFilesystem                         Size  Used Avail Use% Mounted on\n\/dev\/mapper\/cl_pgpurestorage-root   26G  2.2G   24G   9% \/\ndevtmpfs                           3.9G     0  3.9G   0% \/dev\ntmpfs                              3.9G   16K  3.9G   1% \/dev\/shm\ntmpfs                              3.9G   41M  3.8G   2% \/run\ntmpfs                              3.9G     0  3.9G   0% \/sys\/fs\/cgroup\n\/dev\/sda1                         1014M  183M  832M  19% \/boot\ntmpfs                              781M     0  781M   0% \/run\/user\/1000\n\/dev\/mapper\/vgpure-lvpure          450G  302G  149G  68% \/u02\/pgdata\npgpurestorage\/postgres MASTER (postgres@5432) # create database test template = purestorage;\n\nCREATE DATABASE\nTime: 3312062.975 ms (55:12.063)\npgpurestorage\/postgres MASTER (postgres@5432) # \npgpurestorage\/postgres MASTER (postgres@5432) # \\! df -h\nFilesystem                         Size  Used Avail Use% Mounted on\n\/dev\/mapper\/cl_pgpurestorage-root   26G  2.2G   24G   9% \/\ndevtmpfs                           3.9G     0  3.9G   0% \/dev\ntmpfs                              3.9G   16K  3.9G   1% \/dev\/shm\ntmpfs                              3.9G   41M  3.8G   2% \/run\ntmpfs                              3.9G     0  3.9G   0% \/sys\/fs\/cgroup\n\/dev\/sda1                         1014M  183M  832M  19% \/boot\ntmpfs                              781M     0  781M   0% \/run\/user\/1000\n\/dev\/mapper\/vgpure-lvpure          450G  449G  1.7G 100% \/u02\/pgdata\npgpurestorage\/postgres MASTER (postgres@5432) # \n<\/pre>\n<p>Almost full, so lets create another database:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">pgpurestorage\/postgres MASTER (postgres@5432) # create database test2 template = purestorage;\nERROR:  could not write to file \"base\/16562\/16534\": No space left on device\nTime: 34449.626 ms (00:34.450)\n<\/pre>\n<p>So, behavior is what has been expected.<\/p>\n<p>In the next post we&#8217;ll do some pgbench standard benchmarks against the data set although the numbers will probably not be very good as we are running in a ESX test environment and this seems to be the bottle neck in our case. We&#8217;ll have to analyze the sar statistics for that, but no time yet.<\/p>\n<p>What I can say about the storage system so far: I like the simplicity of the management console. There is not much more you can do than creating hosts, volumes and connections between them, that&#8217;s it. Reduction is happening automatically and you have the option to replicate to another storage system. Snapshots are available as well, but not yet tested.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Just be clear this is not a performance test as we had to connect the Pure Storage box through 1GB\/s interfaces. Basically it is more about how you can interact with the storage system (command line &amp; web interface) and to get a feeling on what is possible. In the last post we explained on [&hellip;]<\/p>\n","protected":false},"author":29,"featured_media":10005,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[229],"tags":[77,1084],"type_dbi":[],"class_list":["post-9999","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-database-administration-monitoring","tag-postgresql","tag-purestorage"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.5) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>PostgreSQL on a Pure Storage All Flash Array - Populating PostgreSQL - dbi 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:\/\/www.dbi-services.com\/blog\/postgresql-on-a-pure-storage-all-flash-array-populating-postgresql\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PostgreSQL on a Pure Storage All Flash Array - Populating PostgreSQL\" \/>\n<meta property=\"og:description\" content=\"Just be clear this is not a performance test as we had to connect the Pure Storage box through 1GB\/s interfaces. Basically it is more about how you can interact with the storage system (command line &amp; web interface) and to get a feeling on what is possible. In the last post we explained on [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/postgresql-on-a-pure-storage-all-flash-array-populating-postgresql\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-05-08T10:51:01+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/purestorage-pg-load-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"423\" \/>\n\t<meta property=\"og:image:height\" content=\"649\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Daniel Westermann\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@westermanndanie\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Daniel Westermann\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-on-a-pure-storage-all-flash-array-populating-postgresql\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-on-a-pure-storage-all-flash-array-populating-postgresql\\\/\"},\"author\":{\"name\":\"Daniel Westermann\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"headline\":\"PostgreSQL on a Pure Storage All Flash Array &#8211; Populating PostgreSQL\",\"datePublished\":\"2017-05-08T10:51:01+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-on-a-pure-storage-all-flash-array-populating-postgresql\\\/\"},\"wordCount\":602,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-on-a-pure-storage-all-flash-array-populating-postgresql\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2022\\\/04\\\/purestorage-pg-load-1.png\",\"keywords\":[\"PostgreSQL\",\"PureStorage\"],\"articleSection\":[\"Database Administration &amp; Monitoring\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-on-a-pure-storage-all-flash-array-populating-postgresql\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-on-a-pure-storage-all-flash-array-populating-postgresql\\\/\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-on-a-pure-storage-all-flash-array-populating-postgresql\\\/\",\"name\":\"PostgreSQL on a Pure Storage All Flash Array - Populating PostgreSQL - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-on-a-pure-storage-all-flash-array-populating-postgresql\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-on-a-pure-storage-all-flash-array-populating-postgresql\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2022\\\/04\\\/purestorage-pg-load-1.png\",\"datePublished\":\"2017-05-08T10:51:01+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-on-a-pure-storage-all-flash-array-populating-postgresql\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-on-a-pure-storage-all-flash-array-populating-postgresql\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-on-a-pure-storage-all-flash-array-populating-postgresql\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2022\\\/04\\\/purestorage-pg-load-1.png\",\"contentUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2022\\\/04\\\/purestorage-pg-load-1.png\",\"width\":423,\"height\":649},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-on-a-pure-storage-all-flash-array-populating-postgresql\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PostgreSQL on a Pure Storage All Flash Array &#8211; Populating PostgreSQL\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/8d08e9bd996a89bd75c0286cbabf3c66\",\"name\":\"Daniel Westermann\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"caption\":\"Daniel Westermann\"},\"description\":\"Daniel Westermann is Principal Consultant and Technology Leader Open Infrastructure at dbi services. He has more than 15 years of experience in management, engineering and optimization of databases and infrastructures, especially on Oracle and PostgreSQL. Since the beginning of his career, he has specialized in Oracle Technologies and is Oracle Certified Professional 12c and Oracle Certified Expert RAC\\\/GridInfra. Over time, Daniel has become increasingly interested in open source technologies, becoming \u201cTechnology Leader Open Infrastructure\u201d and PostgreSQL expert. \u00a0Based on community or EnterpriseDB tools, he develops and installs complex high available solutions with PostgreSQL. He is also a certified PostgreSQL Plus 9.0 Professional and a Postgres Advanced Server 9.4 Professional. He is a regular speaker at PostgreSQL conferences in Switzerland and Europe. Today Daniel is also supporting our customers on AWS services such as AWS RDS, database migrations into the cloud, EC2 and automated infrastructure management with AWS SSM (System Manager). He is a certified AWS Solutions Architect Professional. Prior to dbi services, Daniel was Management System Engineer at LC SYSTEMS-Engineering AG in Basel. Before that, he worked as Oracle Developper &amp;\u00a0Project Manager at Delta Energy Solutions AG in Basel (today Powel AG). Daniel holds a diploma in Business Informatics (DHBW, Germany). His branch-related experience mainly covers the pharma industry, the financial sector, energy, lottery and telecommunications.\",\"sameAs\":[\"https:\\\/\\\/x.com\\\/westermanndanie\"],\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/author\\\/daniel-westermann\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"PostgreSQL on a Pure Storage All Flash Array - Populating PostgreSQL - dbi 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:\/\/www.dbi-services.com\/blog\/postgresql-on-a-pure-storage-all-flash-array-populating-postgresql\/","og_locale":"en_US","og_type":"article","og_title":"PostgreSQL on a Pure Storage All Flash Array - Populating PostgreSQL","og_description":"Just be clear this is not a performance test as we had to connect the Pure Storage box through 1GB\/s interfaces. Basically it is more about how you can interact with the storage system (command line &amp; web interface) and to get a feeling on what is possible. In the last post we explained on [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/postgresql-on-a-pure-storage-all-flash-array-populating-postgresql\/","og_site_name":"dbi Blog","article_published_time":"2017-05-08T10:51:01+00:00","og_image":[{"width":423,"height":649,"url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/purestorage-pg-load-1.png","type":"image\/png"}],"author":"Daniel Westermann","twitter_card":"summary_large_image","twitter_creator":"@westermanndanie","twitter_misc":{"Written by":"Daniel Westermann","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-on-a-pure-storage-all-flash-array-populating-postgresql\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-on-a-pure-storage-all-flash-array-populating-postgresql\/"},"author":{"name":"Daniel Westermann","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"headline":"PostgreSQL on a Pure Storage All Flash Array &#8211; Populating PostgreSQL","datePublished":"2017-05-08T10:51:01+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-on-a-pure-storage-all-flash-array-populating-postgresql\/"},"wordCount":602,"commentCount":0,"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-on-a-pure-storage-all-flash-array-populating-postgresql\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/purestorage-pg-load-1.png","keywords":["PostgreSQL","PureStorage"],"articleSection":["Database Administration &amp; Monitoring"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/postgresql-on-a-pure-storage-all-flash-array-populating-postgresql\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-on-a-pure-storage-all-flash-array-populating-postgresql\/","url":"https:\/\/www.dbi-services.com\/blog\/postgresql-on-a-pure-storage-all-flash-array-populating-postgresql\/","name":"PostgreSQL on a Pure Storage All Flash Array - Populating PostgreSQL - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-on-a-pure-storage-all-flash-array-populating-postgresql\/#primaryimage"},"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-on-a-pure-storage-all-flash-array-populating-postgresql\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/purestorage-pg-load-1.png","datePublished":"2017-05-08T10:51:01+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-on-a-pure-storage-all-flash-array-populating-postgresql\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/postgresql-on-a-pure-storage-all-flash-array-populating-postgresql\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-on-a-pure-storage-all-flash-array-populating-postgresql\/#primaryimage","url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/purestorage-pg-load-1.png","contentUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/purestorage-pg-load-1.png","width":423,"height":649},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-on-a-pure-storage-all-flash-array-populating-postgresql\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"PostgreSQL on a Pure Storage All Flash Array &#8211; Populating PostgreSQL"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66","name":"Daniel Westermann","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","caption":"Daniel Westermann"},"description":"Daniel Westermann is Principal Consultant and Technology Leader Open Infrastructure at dbi services. He has more than 15 years of experience in management, engineering and optimization of databases and infrastructures, especially on Oracle and PostgreSQL. Since the beginning of his career, he has specialized in Oracle Technologies and is Oracle Certified Professional 12c and Oracle Certified Expert RAC\/GridInfra. Over time, Daniel has become increasingly interested in open source technologies, becoming \u201cTechnology Leader Open Infrastructure\u201d and PostgreSQL expert. \u00a0Based on community or EnterpriseDB tools, he develops and installs complex high available solutions with PostgreSQL. He is also a certified PostgreSQL Plus 9.0 Professional and a Postgres Advanced Server 9.4 Professional. He is a regular speaker at PostgreSQL conferences in Switzerland and Europe. Today Daniel is also supporting our customers on AWS services such as AWS RDS, database migrations into the cloud, EC2 and automated infrastructure management with AWS SSM (System Manager). He is a certified AWS Solutions Architect Professional. Prior to dbi services, Daniel was Management System Engineer at LC SYSTEMS-Engineering AG in Basel. Before that, he worked as Oracle Developper &amp;\u00a0Project Manager at Delta Energy Solutions AG in Basel (today Powel AG). Daniel holds a diploma in Business Informatics (DHBW, Germany). His branch-related experience mainly covers the pharma industry, the financial sector, energy, lottery and telecommunications.","sameAs":["https:\/\/x.com\/westermanndanie"],"url":"https:\/\/www.dbi-services.com\/blog\/author\/daniel-westermann\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/9999","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/29"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=9999"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/9999\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media\/10005"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=9999"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=9999"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=9999"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=9999"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}