NIO implementation helps reduce the mailboxd memory footprint with a small CPU overhead. NIO eliminates the need of 1 (IMAP connection)-to-1 (server thread) mapping and helps reduce the memory footprint of the ZCS server. It is useful when there are many concurrent IMAP users. The exact benefit depends on the number of IMAP users/server and number of live connections/users.
The saving is linear to the number of active IMAP connections that are in a single mailbox server.
Example for 10,000 concurrent IMAP accounts:
With NIO: If there are 10,000 IMAP accounts, each of the IMAP accounts has an IMAP client which maintains 3 to 4 connections. There are at most 100 to 200 Java threads required in the mailboxd process to handle requests from those clients. If one thread uses 256k memory, it uses 25 to 50MB Java memory.
Regarding the CPU and depending on the load, the overhead usage can range from 0 to 20%. Since ZCS is not CPU bounded, the CPU increase should not be a significant factor to impact the client side response time.
Without NIO: If there are 10,000 IMAP accounts, each of the IMAP accounts has an IMAP client which maintains 3 to 4 connections. There are 10,000*3 or 10,000*4 Java threads required in the mailboxd process to handle requests from those clients. If one thread uses 256k memory, it uses 7,500MB to 10,000MB of Java memory.
Enabling NIO and Trace Logging
NIO implementation is enabled by default, with the setting of True. If you want to disable NIO, change the zmlocalconfig attribute nio_imap_enabled to False:
$ zmlocalconfig -e nio_imap_enabled=false $ zmmailboxdctl restart
To set to true:
$ zmlocalconfig -e nio_imap_enabled=true $ zmmailboxdctl restart
Trace logging can be enabled for NIO for basic troubleshooting purposes. Enable Trace logging at the account level with the following:
$ zmprov aal email@example.com zimbra.imap trace