Multiple Zope instances == slow buildout

Yes.
This is a slighty simplified instance script we are running:

[instance]
blob-storage= $(BLOB_STORAGE)
client-home= $(CLIENT_HOME)
debug-mode= off
deprecation-warnings= off
eggs= ftw.raven
   munin.plone
   munin.zope
   psycopg2
   python-memcached
   RelStorage
   relstorage-packer
   ...
environment-vars= zope_i18n_compile_mo_files true
   PYTHON_EGG_CACHE $(CLIENT_HOME)/.python-eggs
   MEMCACHED_PDB $(MEMCACHED_CONN_PDB)
   MEMCACHED_MEMOIZE $(MEMCACHED_CONN_MEMOIZE)
   PDB_HOSTNAME  $(PDB_HOSTNAME)
   PDB_USERNAME  $(PDB_USERNAME)
   PDB_PASSWORD  $(PDB_PASSWORD)
   PDB_DATABASE  $(PDB_DATABASE)
   SOLR  $(SOLR_CONN)
   RAVEN_DSN $(RAVEN_DSN)
   RAVEN_TAGS {"deployment": "$(RAVEN_DEPLOYMENT)"}
event-log= disable
http-address= 0.0.0.0:$(INSTANCE_PORT)
http-fast-listen= off
http-force-connection-close= on
lock-file= $(CLIENT_HOME)/instance_$(INSTANCE_PORT).lock
pid-file= $(CLIENT_HOME)/instance_$(INSTANCE_PORT).pid
recipe= plone.recipe.zope2instance
rel-storage= type postgresql
    dsn $(RELSTORAGE_DSN)
    keep-history false
    shared-blob-dir true
    blob-dir $(BLOB_STORAGE)
    blob-cache-size 512mb
    cache-local-mb 0
    cache-prefix zodb_xxx_website
    cache-module-name memcache
    cache-servers $(MEMCACHED_CONN_ZODB)
    commit-lock-timeout 600
shared-blob= yes
user= admin:admin
verbose-security= off
z2-log= disable
zcml= munin.plone
    munin.zope
zeo-client= off
zodb-cache-size= 20000
zope-conf-additional= <zodb_db empty>
    # A database to create the catalog
    mount-point /empty
    cache-size 0
    <relstorage>
        keep-history false
        shared-blob-dir true
        blob-dir $(BLOB_STORAGE)
        blob-cache-size 512mb
        <postgresql>
            dsn $(RELSTORAGE_DSN)
        </postgresql>
    </relstorage>
</zodb_db>
<zodb_db catalog>
    # Catalog database
    mount-point /Plone/portal_catalog:/empty/Catalog/portal_catalog
    cache-size 500000
    <relstorage>
        keep-history false
        shared-blob-dir true
        blob-dir $(BLOB_STORAGE)
        blob-cache-size 512mb
        cache-local-mb 0
        cache-prefix zodb_xxx_websitecatalog
        cache-module-name memcache
        cache-servers $(MEMCACHED_CONN_ZODB_CATALOG)
        commit-lock-timeout 600
        <postgresql>
            dsn $(RELSTORAGE_DSN_CATALOG)
        </postgresql>
    </relstorage>
</zodb_db>
<product-config xxx.search>
    ploneinstance_name Plone
    exec-prefix $(INSTANCE_BINDIR)
    solr.host $(SOLR_HOST)
    solr.port $(SOLR_PORT)
</product-config>
%import collective.zamqp
<amqp-broker-connection>
    connection_id super
    hostname $(RABBITMQ_HOST)
    port $(RABBITMQ_PORT)
    username $(RABBITMQ_USERNAME)
    password $(RABBITMQ_PASSWORD)
    heartbeat 120
    prefetch_count $(RABBITMQ_PFCOUNT)
</amqp-broker-connection>
<amqp-broker-connection>
    connection_id conn_query
    hostname $(RABBITMQ_HOST)
    port $(RABBITMQ_PORT)
    username $(RABBITMQ_USERNAME)
    password $(RABBITMQ_PASSWORD)
    heartbeat 120
    prefetch_count $(RABBITMQ_PFCOUNT)
</amqp-broker-connection>
<amqp-broker-connection>
    connection_id conn_structure
    hostname $(RABBITMQ_HOST)
    port $(RABBITMQ_PORT)
    username $(RABBITMQ_USERNAME)
    password $(RABBITMQ_PASSWORD)
    heartbeat 120
    prefetch_count $(RABBITMQ_PFCOUNT)
</amqp-broker-connection>
<amqp-broker-connection>
    connection_id conn_properties
    hostname $(RABBITMQ_HOST)
    port $(RABBITMQ_PORT)
    username $(RABBITMQ_USERNAME)
    password $(RABBITMQ_PASSWORD)
    heartbeat 120
    prefetch_count $(RABBITMQ_PFCOUNT)
</amqp-broker-connection>
<amqp-broker-connection>
    connection_id conn_media
    hostname $(RABBITMQ_HOST)
    port $(RABBITMQ_PORT)
    username $(RABBITMQ_USERNAME)
    password $(RABBITMQ_PASSWORD)
    heartbeat 120
    prefetch_count $(RABBITMQ_PFCOUNT)
</amqp-broker-connection>
<eventlog>
  level INFO
  <syslog>
    address 127.0.0.1:514
    facility local3
    format %(asctime)s ZopeApp-Server zope[%(process)s]: $(INSTANCE_PORT) [%(levelname)s] %(name)s | %(message)s
    dateformat %b %d %H:%M:%S
    level INFO
  </syslog>
</eventlog>
<product-config munin.zope>
    secret $(MUNIN_SECRET)
</product-config>
zserver-threads= ${plone:threads}

I know remember one issue though.

The generated zope.conf file has still one path reference one needs to avoid.
Since I don't run buildout on production but do a pip install dance, I can fix the generated zope.conf file with awk:

cat parts/instance/etc/zope.conf | awk '{$out = NR>1 ? $0 : "%define INSTANCEHOME $(CLIENT_HOME)"; print $out}' > build/etc/instance.xml

This replaces the first line defining a full path with

%define INSTANCEHOME $(CLIENT_HOME)

This could probably be fixed with a new feature in the instance recipe.