on any class that extends  Ens.Request or Ens.Response you may use:

Parameter COMPRESS = 2;
Property JSON As %Stream.GblChrCompress;

On large messages (or in a system with billions of messages per day) the save on storge is huge!
- Visual trace working fine
- You may search within the compressed property (but it will take time)
- Property is visible in SQL queries against Ens.MessageHeader / Ens.MessageBody 
- The "out of the box" purge working fine

instead of having each property stored with its name as a subscript, (e.g. ^Student(1,"Name") = "Alice" / ^Student(1,"Age") = 29 etc.)
its much better to use the same format the class compiler is storing data on the D global:
^Student(1)=$LB("Alice",29 ... )

when having globals with millions (or billions) of records it will have a huge impact on performance and storage footprint.

There are 2 options:

1. access the raw code for classes is stored in ^oddDEF global. all class methods are store in this format: ^oddDEF(className,"m",methodName,11)=sequence
where the sequence is 1,2,3...
If you are going to manually manipulate this don't forget to compile: do $system.OBJ.Compile("className","ckr")

2. using SQL:
SELECT ID,Name,SequenceNumber FROM %Dictionary.MethodDefinition where parent='className' order by SequenceNumber
I'm not sure if you need to compile after an UPDATE to this table (but its easy test).

1. Usually this indicates that the IRIS is sending an incomplete certificate chain
2. The fact that you can access IRIS SMP has nothing to do with the outgoing HTTPS request, which I assume you do with %Net.HttpRequest and using the SSL property that match the SSL config
3. I recommend accessing the  https://myserver.com/api/gap/... from a browser and to check the certificate chain. Usually you will see 3 certificates (root CA, intermediate authority, the certificate itself) - you should put all those certificates (one after the other) in the PEM file that is configured in the SSL config in IRIS. Depending on the CA (which might be public, or company self-generated) you need to ask your sys admin 

As Alexey said, the issue could be with code, not ECP (as usually ECP is backward compatible)
Make sure that code on app. servers in not mapped (no routine, package mapping) to a remote DB (on database server) - all code should be local to app. server

If your 3 app. servers are identical (for HA, LB reasons) then if you can disable access to 1 app. server and still working with other 2 - it will give you an option to to the app. servers one by one without downtime.

Another issue to concern is cached queries - on such upgrades its good to have all cached queries "un-freeze" to make sure all are compiled.
 

Hello Norman,

1. to build a sync mirror with the server, then you can "set no failover" on primary" and "play" withe the backup, you could take IRIS down in any time on the backup, it will re-sync when its up again

2. O/S defragmentation - either by O/S tool, or to copy the DB to a new clean disk

3. Internal defragmentation - there are some options:
A) to copy all data with GBLOCKCOPY to a new DB, with 1 process, to keep data as sequential as possible (will take a lot of time)
B) to use the internal defragmentation tool (will need 2 x space on that DB) then compact globals

4. In general, its a good practice to split indices to a different DB (and use mapping) since the data ("D" globals) are usually not getting so fragmented over time. This will also help on future defragmentation, compact globals, DB "shrink" and other maintenance on less volume 

Hello Alex,

I would suggest using MONLBL with all measures, to better understand any "bottlenecks" in code, memory issues or global access. In parallel, to monitor the VM to see if we hit CPU, disk I/O or memory thresholds there.
it might be that there are some "internal" functions that can be optimized or written definitely to speed up code.
I recommend that you open a WRC, since they have good tools to analyze almost every aspect of IRIS