basically you can say that a queue is blocked until the congestion in the next queue is removed.
Most cases for blocked queues are either a temporary indexer overload, slow disks or forwarders sending too much data for what ever reason (some java log from a application gone crazy for example).
You can limit the forwarder to not sent too much data at once in limits.conf:
maxKBps = <integer>
* If specified and not zero, this limits the speed through the thruput processor to the specified rate in kilobytes per second.
additionally you can setup a persistent queue on the forwarder to prevent data loss.
Regarding the Indexer, you can follow this checklist about performance.
hope this helps ...