Which z-push version are you using ? Did you use the matching set of files from the release 54 distribution (it contains 3 different sets) ?
If it happened just once, it could also just be an unfortunate co-incidence. Perhaps your server would have crashed anyway.
Take a look at your htppd.conf file and pay attention to these settings.
KeepAlive Off
# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# ServerLimit: maximum value for MaxClients for the lifetime of the server
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule prefork.c>
StartServers nn - should be a few more than the number of users you have
MinSpareServers 2 - if all servers processes are in use, more will be started up until there are at least this many idle processes
MaxSpareServers 3 - idle servers are killed off until there are just this many left
ServerLimit nn+10 - Maximum number of processes to run
MaxClients nn+10 - Maximum number of clients to handle simultaneously
MaxRequestsPerChild 200 - how many requests each server process should be allowed to run before getting killed/restarted
</IfModule>
You can do your own reading on this configuration - this is just a ballpark. For each process under apache/php/z-push/zimbrabackend you can expect it to run to approx 16-20MB depending on how much email the phone is typically syncing - check your own server for how much memory is allocated to each process using "top". Note that this will list the highest amount the process used at any time - not how much it is currently actively using. Apache/PHP does not release memory back to the OS once it is no longer needed - it holds onto it in anticipation of possibly needing it again.
The critical configuration if you suspect a memory leak is affecting you is the last one (MaxRequestsPerChild). The default value of 0 means that apache will never stop a child process. That is until all memory is exhausted and the server crashes. Setting this value to a real value (200 in the example above) will tell apache to kill off a child process after it has handled 200 requests. A new child process will be forked to replace it (assuming it is needed based on MinSpareServers) Obviously setting this too low will cause overhead for the OS stopping/starting processes - but on a z-push server this is not as critical as it would be on a high traffic web server. Setting it too high would allow memory leaks to build up in the process - possibly enough to crash your server.
Armed with the ballpark figure per-client figure you can work out how many clients your server could handle from a memory point of view.

