Hi Andi, > Hi, > > PHP uses memory allocation extensively. During the life cycle of a PHP > script there is a huge amount of malloc()'s and free()'s. We found that > under multi-threaded web servers this leads to decreased performance due to > memory fragmentation and locking within the memory manager. > The solution is using per-thread memory pools which don't lock and are > completely freed at the end of each request. > Win32 supports this kind of per-thread memory pool with the > HeapCreate(HEAP_NO_SERIALIZE, ...) family of functions. Using these kind of > functions gave us a huge performance gain. > Now with Apache 2 coming out I wanted to solve this problem in a > cross-platform way as I don't have Bill's API available on UNIX :) The APR > memory pools aren't good enough for us because they don't allow for any > freeing which just doesn't work for PHP. > What we did was write a memory manager (similar to Doug Lea's malloc.c but > much more lightweight) which allows you to have many instances (pools) and > it supports allocation, freeing, reallocation. At the end of each request > it quickly frees all of the huge memory chunks it used. I started using it > with the new PHP scripting engine and am allocating memory in 64KB blocks > (run-time definable) and it seems to work pretty well. To allocate the > memory blocks themselves it uses malloc() which makes it extremely > portable. (I actually got that idea from APR). > > Do you guys have any interest in adding this kind of "smarter" memory pool > into APR? I think it's extremely useful.
I think some of us have an interest in implementing reaps. However, I'm not going to touch the pools code to get another mechanism in place anytime soon. I know apr_free can be added to the current code with little trouble, keeping the costs in the free. In any case I think it would be nice to see your code ;) > If you reply please cc: me because I'm not on the APR dev list. > > Andi Sander