Hello,

If a large amount of data is POST'ed to a process running mod_fcgid, the Apache child uses an excessive amount of memory when processing it.

The client request is properly received and the following statement from the documentation is true: "Once the amount of request body read from the client exceeds FcgidMaxRequestInMem bytes, the remainder of the request body will be stored in a temporary file."

The problem occurs when the temporary file is being sent to the FastCGI handling process via its IPC socket. Here is the corresponding function which sends the prepared "output_brigade" to the IPC socket: https://gist.github.com/famzah/125a91971fba3450dd4926fe13e0ede6

The documentation of apr_bucket_read() clearly states that "if buckets are read in a loop, and aren't deleted after being processed, the potentially large bucket will slowly be converted into RAM resident heap buckets. If the file is larger than available RAM, an out of memory condition could be caused."

I need your guidance, in order to fix this properly. I've researched a bit and see the following possible options to fix this:

1. Delete each bucket after sending it to the "ipc_handle". I've looked
   through the call tree and the *output_brigade is last used by
   proc_write_ipc(). Therefore, it should be safe to empty it while
   being processed there.
2. Take the same approach as mod_http2, which handles FILE buckets in a
   different way. Instead of using apr_bucket_read(), they process FILE
   buckets by apr_file_read() and manage the data buffer manually. This
   way the original *output_brigade won't be modified and automatically
   split by apr_bucket_read(). This requires more coding work.


Best regards.
--Ivan

Reply via email to