There's a port map that activities can allocate ports from dynamically.
(the only acts that do are sorting acts, SORT, JOIN, SELFJOIN).
With multiple slave channels, each channel has a base MP port, but doesn't have it's own dynamic port map.
As a consequence with many channels and a query with e.g. a SORT act. all channels dynamically allocate from the same port map (which is equal to the 1st channels).
Eventually they run out of room (based on 'localThorPortInc') and hit a port in use by the next channel or slave and cause the query to fail with a 'port in use' error.
Each channel should allocate dynamic ports from it's own port map.