A variable block size does cause fragmentation. Look at the picture I am attaching: 
The image ( here ) shows the situation in which A, B and C allocate pieces of memory, pieces of variable size.
At some point, B frees up all its chunks of memory, and suddenly you have fragmentation. For example, if C needs to allocate a large chunk of memory, which will still fit into the available memory, it will not be able to do this, since the available memory is divided into two blocks.
Now, if you think about the case when each piece of memory will be the same size, this situation clearly will not arise.
Memory pools, of course, have their drawbacks, as you yourself indicate. Therefore, you should not think that the memory pool is a magic wand. It has a cost, and it makes sense to pay for it under certain circumstances (i.e., an embedded system with limited memory, real-time restrictions, etc.).
As for which memory pool is good in C ++, I would say that it depends. I used one under VxWorks, which was provided by the OS; in a sense, a good memory pool is efficient when it is tightly integrated with the OS. In fact, every RTOS offers an implementation of memory pools, I think.
If you are looking for a generic memory pool implementation, check out this .
EDIT:
From your last comment, it seems to me that perhaps you think of memory pools as a “solution to the fragmentation problem”. Unfortunately, this is not the case. If you want, fragmentation is a manifestation of entropy at the memory level, i.e. It's unavoidable. On the other hand, memory pools are a way of managing memory in such a way as to effectively reduce the effect of fragmentation (as I said, and as mentioned in Wikipedia, mainly on specific systems, such as real-time systems). This is costly because the memory pool may be less efficient than the “normal” memory allocation technology because you have a minimum block size. In other words, entropy reappears under the mask.
In addition, there are many parameters that affect the efficiency of the memory pool system, such as block size, block allocation policy, or you have only one memory pool or you have several memory pools with different block sizes, different lifetimes or different policies.
Memory management is a really difficult matter, and memory pools are just a method that, like any other, improves the situation compared to other methods and accurately determines the cost.