{"id":9992,"date":"2017-05-04T14:07:11","date_gmt":"2017-05-04T12:07:11","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/postgresql-on-a-pure-storage-all-flash-array-preparations\/"},"modified":"2017-05-04T14:07:11","modified_gmt":"2017-05-04T12:07:11","slug":"postgresql-on-a-pure-storage-all-flash-array-preparations","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/postgresql-on-a-pure-storage-all-flash-array-preparations\/","title":{"rendered":"PostgreSQL on a Pure Storage All Flash Array &#8211; Preparations"},"content":{"rendered":"<p>Yesterday we got a <a href=\"https:\/\/www.purestorage.com\/products\/flash-array-m.html\" target=\"_blank\">Pure Storage All Flash Array <\/a> for testing. As the name implies this is all about Flash storage. What makes Pure Storage different from other vendors is that you don&#8217;t buy just a storage box and then pay the usual maintenance costs but you pay for a storage subscription which <a href=\"https:\/\/www.purestorage.com\/products\/evergreen-subscriptions.html\" target=\"_blank\">should keep your storage up to date all the time<\/a>. The promise is that all the components of the array get replaced by the then current versions over time without forcing you to re-buy. Check the link above for more details on the available subscriptions. This is the first post and describes the setup we did for connecting a PostgreSQL VMWare based machine to the Pure Storage box. The PostgreSQL server will be running as a virtual machine in VMWare ESX and connect over iSCSI to the storage system.<\/p>\n<p><!--more--><\/p>\n<p>As usual we used CentOS 7 for the PostgreSQL server:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\n[root@pgpurestorage ~]$ cat \/etc\/centos-release\nCentOS Linux release 7.3.1611 (Core) \n[root@pgpurestorage ~]$ uname -a\nLinux pgpurestorage.it.dbi-services.com 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU\/Linux\n<\/pre>\n<p>We have 4 vCPUs:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\n[root@pgpurestorage ~]$ lscpu\nArchitecture:          x86_64\nCPU op-mode(s):        32-bit, 64-bit\nByte Order:            Little Endian\nCPU(s):                4\nOn-line CPU(s) list:   0-3\nThread(s) per core:    1\nCore(s) per socket:    1\nSocket(s):             4\nNUMA node(s):          1\nVendor ID:             GenuineIntel\nCPU family:            6\nModel:                 79\nModel name:            Intel(R) Xeon(R) CPU E5-2680 v4 @ 2.40GHz\nStepping:              1\nCPU MHz:               2399.583\nBogoMIPS:              4799.99\nHypervisor vendor:     VMware\nVirtualization type:   full\nL1d cache:             32K\nL1i cache:             32K\nL2 cache:              256K\nL3 cache:              35840K\nNUMA node0 CPU(s):     0-3\n<\/pre>\n<p>&#8230; and 8GB of memory:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\n[root@pgpurestorage ~]$ cat \/proc\/meminfo | head -5\nMemTotal:        7994324 kB\nMemFree:         7508232 kB\nMemAvailable:    7528048 kB\nBuffers:            1812 kB\nCached:           233648 kB\n<\/pre>\n<p><a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/purestorage-setup-vm.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/purestorage-setup-vm.png\" alt=\"purestorage-setup-vm\" width=\"605\" height=\"366\" class=\"aligncenter size-full wp-image-16228\" \/><\/a><\/p>\n<p>Because by default you&#8217;ll get the &#8220;virtual-guest&#8221; <a href=\"https:\/\/access.redhat.com\/documentation\/en-US\/Red_Hat_Enterprise_Linux\/7\/html\/Performance_Tuning_Guide\/chap-Red_Hat_Enterprise_Linux-Performance_Tuning_Guide-Tuned.html\" target=\"_blank\">tuned profile<\/a> when you install CentOS in a virtualized environment we created our own and switched to the same:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\nroot@:\/home\/postgres\/ [] tuned-adm active\nCurrent active profile: virtual-guest\nroot@:\/home\/postgres\/ [] tuned-adm profile dbi-postgres\nroot@:\/home\/postgres\/ [] tuned-adm active\nCurrent active profile: dbi-postgres\nroot@:\/home\/postgres\/ [] cat \/usr\/lib\/tuned\/dbi-postgres\/tuned.conf | egrep -v \"^#|^$\"\n[main]\nsummary=dbi services tuned profile for PostgreSQL servers\n[cpu]\ngovernor=performance\nenergy_perf_bias=performance\nmin_perf_pct=100\n[disk]\nreadahead=&gt;4096\n[sysctl]\nkernel.sched_min_granularity_ns = 10000000\nkernel.sched_wakeup_granularity_ns = 15000000\nvm.overcommit_memory=2\nvm.swappiness=0\nvm.dirty_ratio=2\nvm.dirty_background_ratio=1\nvm.nr_hugepages=1024\n<\/pre>\n<p>To gather statistics we created a cronjob:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\nroot@:\/home\/postgres\/ []  crontab -l\n* * * * * \/usr\/lib64\/sa\/sa1 -S XALL 60 1\n<\/pre>\n<p>PostgreSQL was installed from source with what was committed to the source tree as of today with the following options:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\n[postgres@pgpurestorage postgresql]$ PGHOME=\/u01\/app\/postgres\/product\/10\/db_0\n[postgres@pgpurestorage postgresql]$ SEGSIZE=2\n[postgres@pgpurestorage postgresql]$ BLOCKSIZE=8\n[postgres@pgpurestorage postgresql]$ WALSEGSIZE=64\n[postgres@pgpurestorage postgresql]$ .\/configure --prefix=${PGHOME} \\\n&gt;             --exec-prefix=${PGHOME} \\\n&gt;             --bindir=${PGHOME}\/bin \\\n&gt;             --libdir=${PGHOME}\/lib \\\n&gt;             --sysconfdir=${PGHOME}\/etc \\\n&gt;             --includedir=${PGHOME}\/include \\\n&gt;             --datarootdir=${PGHOME}\/share \\\n&gt;             --datadir=${PGHOME}\/share \\\n&gt;             --with-pgport=5432 \\\n&gt;             --with-perl \\\n&gt;             --with-python \\\n&gt;             --with-tcl \\\n&gt;             --with-openssl \\\n&gt;             --with-pam \\\n&gt;             --with-ldap \\\n&gt;             --with-libxml \\\n&gt;             --with-libxslt \\\n&gt;             --with-segsize=${SEGSIZE} \\\n&gt;             --with-blocksize=${BLOCKSIZE} \\\n&gt;             --with-wal-segsize=${WALSEGSIZE}  \\\n&gt;             --with-extra-version=\" dbi services build\"\n<\/pre>\n<p>For being able to connect to the Pure Storage box you&#8217;ll need the <a href=\"https:\/\/en.wikipedia.org\/wiki\/ISCSI\" target=\"_blank\">iSCSI<\/a> IQN:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\nroot@:\/home\/postgres\/ [] cat \/etc\/iscsi\/initiatorname.iscsi\nInitiatorName=iqn.1994-05.com.redhat:185a3499ac9\n<\/pre>\n<p>Knowing the IQN (InitiatorName) we can logon to the Pure Storage console for adding our host, creating a volume and attaching the volume to the host:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1; highlight: [6,9,12]\">\nThu May 04 11:44:10 2017\nWelcome pureuser. This is Purity Version 4.8.8 on FlashArray dbipure01\nhttp:\/\/www.purestorage.com\/\npureuser@dbipure01&gt; purehost create --iqn iqn.1994-05.com.redhat:185a3499ac9 pgpurestorage\nName           WWN  IQN                               \npgpurestorage  -    iqn.1994-05.com.redhat:185a3499ac9\npureuser@dbipure01&gt; purevol create --size 500G volpgtest\nName       Size  Source  Created                   Serial                  \nvolpgtest  500G  -       2017-05-04 11:46:58 CEST  BA56B4A72DE94A4400011012\npureuser@dbipure01&gt; purehost connect --vol volpgtest pgpurestorage\nName           Vol        LUN\npgpurestorage  volpgtest  1  \n<\/pre>\n<p>The Pure Storage system has two controllers (10.10.1.93 and 10.10.1.94) so we should be able to ping them:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\nroot@:\/home\/postgres\/ [] ping 10.10.1.93\nPING 10.10.1.93 (10.10.1.93) 56(84) bytes of data.\n64 bytes from 10.10.1.93: icmp_seq=1 ttl=63 time=2.53 ms\n64 bytes from 10.10.1.93: icmp_seq=2 ttl=63 time=0.816 ms\n64 bytes from 10.10.1.93: icmp_seq=3 ttl=63 time=0.831 ms\n...\nroot@:\/u02\/pgdata\/pgpure\/ [] ping 10.10.1.94\nPING 10.10.1.94 (10.10.1.94) 56(84) bytes of data.\n64 bytes from 10.10.1.94: icmp_seq=1 ttl=63 time=0.980 ms\n64 bytes from 10.10.1.94: icmp_seq=2 ttl=63 time=0.848 ms\n...\n<\/pre>\n<p>Ok for the connectivity so a discover should work as well:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1; highlight: [1,4]\">\nroot@:\/home\/postgres\/ [] iscsiadm -m discovery -t st -p 10.10.1.93\n10.10.1.93:3260,1 iqn.2010-06.com.purestorage:flasharray.516cdd52f827bd21\n10.10.1.94:3260,1 iqn.2010-06.com.purestorage:flasharray.516cdd52f827bd21\nroot@:\/home\/postgres\/ [] iscsiadm -m node\n10.10.1.93:3260,1 iqn.2010-06.com.purestorage:flasharray.516cdd52f827bd21\n10.10.1.94:3260,1 iqn.2010-06.com.purestorage:flasharray.516cdd52f827bd21\n<\/pre>\n<p>Fine as well, so login:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1; highlight: [1,6]\">\nroot@:\/home\/postgres\/ [] iscsiadm -m node --login \nLogging in to [iface: default, target: iqn.2010-06.com.purestorage:flasharray.516cdd52f827bd21, portal: 10.10.1.93,3260] (multiple)\nLogging in to [iface: default, target: iqn.2010-06.com.purestorage:flasharray.516cdd52f827bd21, portal: 10.10.1.94,3260] (multiple)\nLogin to [iface: default, target: iqn.2010-06.com.purestorage:flasharray.516cdd52f827bd21, portal: 10.10.1.93,3260] successful.\nLogin to [iface: default, target: iqn.2010-06.com.purestorage:flasharray.516cdd52f827bd21, portal: 10.10.1.94,3260] successful.\nroot@:\/home\/postgres\/ [] iscsiadm -m session -o show \ntcp: [13] 10.10.1.93:3260,1 iqn.2010-06.com.purestorage:flasharray.516cdd52f827bd21 (non-flash)\ntcp: [14] 10.10.1.94:3260,1 iqn.2010-06.com.purestorage:flasharray.516cdd52f827bd21 (non-flash)\n<\/pre>\n<p>The new device is available (sdb) from now on:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\nroot@:\/home\/postgres\/ [] ls -la \/dev\/sd*\nbrw-rw----. 1 root disk 8,  0 May  4 13:23 \/dev\/sda\nbrw-rw----. 1 root disk 8,  1 May  4 13:23 \/dev\/sda1\nbrw-rw----. 1 root disk 8,  2 May  4 13:23 \/dev\/sda2\nbrw-rw----. 1 root disk 8, 16 May  4 13:23 \/dev\/sdb\nbrw-rw----. 1 root disk 8, 32 May  4 13:23 \/dev\/sdc\n<\/pre>\n<p>LVM setup:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1; highlight: [1,3,5,7,8,19,20,21,31]\">\nroot@:\/home\/postgres\/ [] pvcreate \/dev\/sdb\n  Physical volume \"\/dev\/sdb\" successfully created.\nroot@:\/home\/postgres\/ [] vgcreate vgpure \/dev\/sdb\n  Volume group \"vgpure\" successfully created\nroot@:\/home\/postgres\/ [] lvcreate -L 450G -n lvpure vgpure\n  Logical volume \"lvpure\" created.\nroot@:\/home\/postgres\/ [] mkdir -p \/u02\/pgdata\nroot@:\/home\/postgres\/ [] mkfs.xfs \/dev\/mapper\/vgpure-lvpure \nmeta-data=\/dev\/mapper\/vgpure-lvpure isize=512    agcount=4, agsize=29491200 blks\n         =                       sectsz=512   attr=2, projid32bit=1\n         =                       crc=1        finobt=0, sparse=0\ndata     =                       bsize=4096   blocks=117964800, imaxpct=25\n         =                       sunit=0      swidth=0 blks\nnaming   =version 2              bsize=4096   ascii-ci=0 ftype=1\nlog      =internal log           bsize=4096   blocks=57600, version=2\n         =                       sectsz=512   sunit=0 blks, lazy-count=1\nrealtime =none                   extsz=4096   blocks=0, rtextents=0\n\nroot@:\/home\/postgres\/ [] echo \"\/dev\/mapper\/vgpure-lvpure  \/u02\/pgdata  xfs defaults,noatime 0 0\" &gt;&gt; \/etc\/fstab\nroot@:\/home\/postgres\/ [] mount -a\nroot@:\/home\/postgres\/ [] df -h\nFilesystem                         Size  Used Avail Use% Mounted on\n\/dev\/mapper\/cl_pgpurestorage-root   26G  2.0G   25G   8% \/\ndevtmpfs                           3.9G     0  3.9G   0% \/dev\ntmpfs                              3.9G     0  3.9G   0% \/dev\/shm\ntmpfs                              3.9G  8.5M  3.9G   1% \/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   33M  450G   1% \/u02\/pgdata\nroot@:\/home\/postgres\/ [] chown postgres:postgres \/u02\/pgdata\n<\/pre>\n<p>Initialized the PostgreSQL cluster:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@pgpurestorage:\/home\/postgres\/ [pg10] initdb -D \/u02\/pgdata\/\nThe files belonging to this database system will be owned by user \"postgres\".\nThis user must also own the server process.\n\nThe database cluster will be initialized with locales\n  COLLATE:  en_US.UTF-8\n  CTYPE:    en_US.UTF-8\n  MESSAGES: en_US.UTF-8\n  MONETARY: de_CH.UTF-8\n  NUMERIC:  de_CH.UTF-8\n  TIME:     en_US.UTF-8\nThe default database encoding has accordingly been set to \"UTF8\".\nThe default text search configuration will be set to \"english\".\n\nData page checksums are disabled.\n\nfixing permissions on existing directory \/u02\/pgdata ... ok\ncreating subdirectories ... ok\nselecting default max_connections ... 100\nselecting default shared_buffers ... 128MB\nselecting dynamic shared memory implementation ... posix\ncreating configuration files ... ok\nrunning bootstrap script ... ok\nperforming post-bootstrap initialization ... ok\nsyncing data to disk ... ok\n\nWARNING: enabling \"trust\" authentication for local connections\nYou can change this by editing pg_hba.conf or using the option -A, or\n--auth-local and --auth-host, the next time you run initdb.\n\nSuccess. You can now start the database server using:\n\n    pg_ctl -D \/u02\/pgdata\/ -l logfile start\n<\/pre>\n<p>What we changed from the default configuration is:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@pgpurestorage:\/u02\/pgdata\/pgpure\/ [pgpure] cat postgresql.auto.conf \n# Do not edit this file manually!\n# It will be overwritten by the ALTER SYSTEM command.\nlisten_addresses = '*'\nlogging_collector = 'on'\nlog_truncate_on_rotation = 'on'\nlog_filename = 'postgresql-%a.log'\nlog_rotation_age = '8d'\nlog_line_prefix = '%m - %l - %p - %h - %u@%d '\nlog_directory = 'pg_log'\nlog_min_messages = 'WARNING'\nlog_autovacuum_min_duration = '360s'\nlog_min_error_statement = 'error'\nlog_min_duration_statement = '5min'\nlog_checkpoints = 'on'\nlog_statement = 'ddl'\nlog_lock_waits = 'on'\nlog_temp_files = '1'\nlog_timezone = 'Europe\/Zurich'\nclient_min_messages = 'WARNING'\nwal_level = 'replica'\nhot_standby_feedback = 'on'\nmax_wal_senders = '10'\ncluster_name = 'pgpure'\nmax_replication_slots = '10'\nshared_buffers=2048MB\nwork_mem=128MB\neffective_cache_size=6144MB\nmaintenance_work_mem=512MB\nmax_wal_size=10GB\n<\/pre>\n<p>Calculating the minimum required amount of huge pages for the PostgreSQL instance:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@pgpurestorage:\/u02\/pgdata\/pgpure\/ [pgpure] head -1 $PGDATA\/postmaster.pid\n3662\npostgres@pgpurestorage:\/u02\/pgdata\/pgpure\/ [pgpure] grep ^VmPeak \/proc\/3662\/\/status\nVmPeak:\t 2415832 kB\npostgres@pgpurestorage:\/u02\/pgdata\/pgpure\/ [pgpure] echo \"2415832\/2048\" | bc\n1179\n<\/pre>\n<p>Set it slightly higher:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@pgpurestorage:\/u02\/pgdata\/pgpure\/ [pgpure] sudo sed -i 's\/vm.nr_hugepages=1024\/vm.nr_hugepages=1200\/g' \/usr\/lib\/tuned\/dbi-postgres\/tuned.conf\npostgres@pgpurestorage:\/u02\/pgdata\/pgpure\/ [pgpure] sudo tuned-adm profile dbi-postgres\npostgres@pgpurestorage:\/u02\/pgdata\/pgpure\/ [pgpure] cat \/proc\/meminfo | grep Huge\nAnonHugePages:      6144 kB\nHugePages_Total:    1200\nHugePages_Free:     1200\nHugePages_Rsvd:        0\nHugePages_Surp:        0\nHugepagesize:       2048 kB\n<\/pre>\n<p>To disable transparent huge pages we created a file called &#8220;disable-thp.service&#8221; (from <a href=\"https:\/\/blacksaildivision.com\/how-to-disable-transparent-huge-pages-on-centos\" target=\"_blank\">here<\/a>):<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@pgpurestorage:\/u02\/pgdata\/pgpure\/ [pgpure] cat \/etc\/systemd\/system\/disable-thp.service\n# Disable transparent huge pages\n# put this file under:\n#   \/etc\/systemd\/system\/disable-thp.service\n# Then:\n#   sudo systemctl daemon-reload\n#   sudo systemctl start disable-thp\n#   sudo systemctl enable disable-thp\n[Unit]\nDescription=Disable Transparent Huge Pages (THP)\n\n[Service]\nType=simple\nExecStart=\/bin\/sh -c \"echo 'never' &gt; \/sys\/kernel\/mm\/transparent_hugepage\/enabled &amp;&amp; echo 'never' &gt; \/sys\/kernel\/mm\/transparent_hugepage\/defrag\"\n\n[Install]\nWantedBy=multi-user.target\n<\/pre>\n<p>Then reload the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Systemd\" target=\"_blank\">systemd<\/a> daemon and start and enable the service:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@pgpurestorage:\/u02\/pgdata\/pgpure\/ [pgpure] sudo systemctl daemon-reload\npostgres@pgpurestorage:\/u02\/pgdata\/pgpure\/ [pgpure] sudo systemctl start disable-thp\npostgres@pgpurestorage:\/u02\/pgdata\/pgpure\/ [pgpure] sudo systemctl enable disable-thp\n<\/pre>\n<p>To verify:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@pgpurestorage:\/u02\/pgdata\/pgpure\/ [pgpure] cat \/sys\/kernel\/mm\/transparent_hugepage\/enabled\nalways madvise [never]\npostgres@pgpurestorage:\/u02\/pgdata\/pgpure\/ [pgpure] cat \/sys\/kernel\/mm\/transparent_hugepage\/defrag \nalways madvise [never]\n<\/pre>\n<p>For being sure that PostgreSQL really will use the huge pages set <a href=\"https:\/\/www.postgresql.org\/docs\/current\/static\/runtime-config-resource.html#GUC-HUGE-PAGES\" target=\"_blank\">huge_pages<\/a> to &#8216;on&#8217; as this will prevent PostgreSQL from starting when the required pages can not be allocated:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npgpurestorage\/postgres MASTER (postgres@5432) # alter system set huge_pages='on';\nALTER SYSTEM\nTime: 2.417 ms\n<\/pre>\n<p>&#8230; and then restart the instance. When all is fine PostgreSQL will come up.<\/p>\n<p>Finally to close this setup post here are some screenshots of the Pure Storage Management Web Console. The first one shows the &#8220;Storage&#8221; tab where you can see that the volume &#8220;volpgtest&#8221; is mapped to my host &#8220;pgpurestorage&#8221;.<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/purestorage-setup-storage-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/purestorage-setup-storage-1.png\" alt=\"purestorage-setup-storage-1\" width=\"1907\" height=\"631\" class=\"aligncenter size-full wp-image-16230\" \/><\/a><\/p>\n<p>The name you give the server is not important. The important information is the mapping of the &#8220;Host Port&#8221; which you can see here (this is the iSCSI IQN):<\/p>\n<p><a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/purestorage-setup-storage-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/purestorage-setup-storage-2.png\" alt=\"purestorage-setup-storage-2\" width=\"1905\" height=\"630\" class=\"aligncenter size-full wp-image-16231\" \/><\/a><\/p>\n<p>Once your server is connected you can see it in the connection map of the server in the console:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/purestorage-connection-map.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/purestorage-connection-map.png\" alt=\"purestorage-connection-map\" width=\"1641\" height=\"572\" class=\"aligncenter size-full wp-image-16234\" \/><\/a><\/p>\n<p>System health:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/purestorage-system-health.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/purestorage-system-health.png\" alt=\"purestorage-system-health\" width=\"1211\" height=\"431\" class=\"aligncenter size-full wp-image-16248\" \/><\/a><\/p>\n<p>Last, but not least, here is the dashboard:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/purestorage-dashboard.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/purestorage-dashboard.png\" alt=\"purestorage-dashboard\" width=\"1895\" height=\"883\" class=\"aligncenter size-full wp-image-16232\" \/><\/a><\/p>\n<p>Not much traffic right now but we&#8217;ll be changing that in the next post.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Yesterday we got a Pure Storage All Flash Array for testing. As the name implies this is all about Flash storage. What makes Pure Storage different from other vendors is that you don&#8217;t buy just a storage box and then pay the usual maintenance costs but you pay for a storage subscription which should keep [&hellip;]<\/p>\n","protected":false},"author":29,"featured_media":9993,"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-9992","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.6) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>PostgreSQL on a Pure Storage All Flash Array - Preparations - 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-preparations\/\" \/>\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 - Preparations\" \/>\n<meta property=\"og:description\" content=\"Yesterday we got a Pure Storage All Flash Array for testing. As the name implies this is all about Flash storage. What makes Pure Storage different from other vendors is that you don&#8217;t buy just a storage box and then pay the usual maintenance costs but you pay for a storage subscription which should keep [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/postgresql-on-a-pure-storage-all-flash-array-preparations\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-05-04T12:07:11+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/purestorage-setup-vm.png\" \/>\n\t<meta property=\"og:image:width\" content=\"605\" \/>\n\t<meta property=\"og:image:height\" content=\"366\" \/>\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=\"9 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-preparations\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-on-a-pure-storage-all-flash-array-preparations\\\/\"},\"author\":{\"name\":\"Daniel Westermann\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"headline\":\"PostgreSQL on a Pure Storage All Flash Array &#8211; Preparations\",\"datePublished\":\"2017-05-04T12:07:11+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-on-a-pure-storage-all-flash-array-preparations\\\/\"},\"wordCount\":518,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-on-a-pure-storage-all-flash-array-preparations\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2022\\\/04\\\/purestorage-setup-vm.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-preparations\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-on-a-pure-storage-all-flash-array-preparations\\\/\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-on-a-pure-storage-all-flash-array-preparations\\\/\",\"name\":\"PostgreSQL on a Pure Storage All Flash Array - Preparations - 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-preparations\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-on-a-pure-storage-all-flash-array-preparations\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2022\\\/04\\\/purestorage-setup-vm.png\",\"datePublished\":\"2017-05-04T12:07:11+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-preparations\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-on-a-pure-storage-all-flash-array-preparations\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-on-a-pure-storage-all-flash-array-preparations\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2022\\\/04\\\/purestorage-setup-vm.png\",\"contentUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2022\\\/04\\\/purestorage-setup-vm.png\",\"width\":605,\"height\":366},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-on-a-pure-storage-all-flash-array-preparations\\\/#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; Preparations\"}]},{\"@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 - Preparations - 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-preparations\/","og_locale":"en_US","og_type":"article","og_title":"PostgreSQL on a Pure Storage All Flash Array - Preparations","og_description":"Yesterday we got a Pure Storage All Flash Array for testing. As the name implies this is all about Flash storage. What makes Pure Storage different from other vendors is that you don&#8217;t buy just a storage box and then pay the usual maintenance costs but you pay for a storage subscription which should keep [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/postgresql-on-a-pure-storage-all-flash-array-preparations\/","og_site_name":"dbi Blog","article_published_time":"2017-05-04T12:07:11+00:00","og_image":[{"width":605,"height":366,"url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/purestorage-setup-vm.png","type":"image\/png"}],"author":"Daniel Westermann","twitter_card":"summary_large_image","twitter_creator":"@westermanndanie","twitter_misc":{"Written by":"Daniel Westermann","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-on-a-pure-storage-all-flash-array-preparations\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-on-a-pure-storage-all-flash-array-preparations\/"},"author":{"name":"Daniel Westermann","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"headline":"PostgreSQL on a Pure Storage All Flash Array &#8211; Preparations","datePublished":"2017-05-04T12:07:11+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-on-a-pure-storage-all-flash-array-preparations\/"},"wordCount":518,"commentCount":0,"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-on-a-pure-storage-all-flash-array-preparations\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/purestorage-setup-vm.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-preparations\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-on-a-pure-storage-all-flash-array-preparations\/","url":"https:\/\/www.dbi-services.com\/blog\/postgresql-on-a-pure-storage-all-flash-array-preparations\/","name":"PostgreSQL on a Pure Storage All Flash Array - Preparations - 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-preparations\/#primaryimage"},"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-on-a-pure-storage-all-flash-array-preparations\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/purestorage-setup-vm.png","datePublished":"2017-05-04T12:07:11+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-preparations\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/postgresql-on-a-pure-storage-all-flash-array-preparations\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-on-a-pure-storage-all-flash-array-preparations\/#primaryimage","url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/purestorage-setup-vm.png","contentUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/purestorage-setup-vm.png","width":605,"height":366},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-on-a-pure-storage-all-flash-array-preparations\/#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; Preparations"}]},{"@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\/9992","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=9992"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/9992\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media\/9993"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=9992"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=9992"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=9992"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=9992"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}