Is there any utility which helps modify backend server weights based on backend server utilization ? ( e.g feedbackd used to do this for LVS loadbalancer)
You could try to use a different load-balancing algorithm.
leastconn seems to be what you are looking for :
According to the official HaProxy v1.4 documentation
leastconn The server with the lowest number of connections receives the connection. Round-robin is performed within groups of servers of the same load to ensure that all servers will be used. Use of this algorithm is recommended where very long sessions are expected, such as LDAP, SQL, TSE, etc... but is not very well suited for protocols using short sessions such as HTTP. This algorithm is dynamic, which means that server weights may be adjusted on the fly for slow starts for instance.
To be compared against the traditional
roundrobin Each server is used in turns, according to their weights. This is the smoothest and fairest algorithm when the server's processing time remains equally distributed. This algorithm is dynamic, which means that server weights may be adjusted on the fly for slow starts for instance. It is limited by design to 4128 active servers per backend. Note that in some large farms, when a server becomes up after having been down for a very short time, it may sometimes take a few hundreds requests for it to be re-integrated into the farm and start receiving traffic. This is normal, though very rare. It is indicated here in case you would have the chance to observe it, so that you don't worry.
I wrote a utility to do just this, you can download it at GitHub: haproxy-dynamic-weight. It provides a way to dynamically and automatically allocate
haproxy traffic across servers in proportion to their load.
memcached solution isn't for you, you'll see the script's documentation refers and links to two alternatives.