Parallelizing calls to msDrawLayer()

Paul Spencer pspencer at DMSOLUTIONS.CA
Sat Oct 13 20:15:12 EDT 2007


David,

While you can perhaps gain some performance in a single map draw, in  
most real life uses of mapserver, folks are either serving many  
simultaneous requests or generating tiles in some way.  I think in  
either case, the addition of multi-threaded layer draws will actually  
cause contention for processor time with the multiple processes that  
are serving the requests and could hurt overall performance in high  
load systems.

I think that you could probably get more bang for your development  
bucks by investing time in profiling the existing code.

Cheers

Paul

On 13-Oct-07, at 6:37 PM, David Fuhry wrote:

> Tamas,
>
>    (responses inline)
>
> Tamas Szekeres wrote:
>> David,
>> I consider it would be reasonable to establish such mechanism only
>> when fetching the data of the layers. Likewise currently the WMS/WFS
>> layers are pre-downloaded in parallel before starting to draw the  
>> map.
>> We should have a similar approach when fetching the other layers as
>> well.
>
>    Yes, I noticed that WMS/WFS layers are downloaded in parallel  
> before rendering begins.  And I agree, it would be advantageous to  
> extend the parallel-data-fetching paradigm to all layers.
>
>    For non-WMS/WFS layers though, wouldn't it be a significant  
> disruption to the codebase to add lines 1 and 2 into msDrawMap()?
>
> 1. for i=1 to layers.length (in parallel)
> 2.   data[i] = fetch_data_for_layer(i)
> 3. for i=1 to layers.length (serially)
> 4.   msDrawLayer(data[i])
>
>   ISTM that the data-fetching logic might be best left abstracted  
> beneath msDrawLayer().
>
>> However pre drawing all of the layers and later copying the layers
>> over the map image seems to be much less efficient.
>
> Drawing n layers onto n imageObjs is no more expensive than drawing  
> n layers onto one imageObj, and the former can be parallelized  
> across n threads.
> Although yes, I agree that composition (the "merge" step) will cost  
> something.
> I'm entertaining the idea that the time saved by parallel fetching  
> & drawing might outweigh the cost of composition.
>
>> When using the parallel fetching approach we should deal only with  
>> the
>> drivers from the aspect of the thread safety issues.
>
> I might be misunderstanding your point here, but... Rendering a  
> layer into an independent imageObj should be a pretty independent  
> operation, and could be made so if it's not now.  Glancing at the  
> mapserver thread-safety FAQ, it seems there are more unsafe &  
> locked components related to data-fetching drivers than there are  
> for rendering.  Which makes me wonder why you suggest parallelizing  
> the data-fetching but not the rendering.
>
> Forgive me if I'm playing a bit of devil's advocate here.  I'm  
> aware that non-reentrant functions don't rewrite themselves, and  
> that critical sections don't surround themselves with mutexes.   
> Surely though, it ought not to be a tremendous amount amount of  
> work to keep separate layer-drawing operations from stepping on  
> eachothers' toes?
>
> Thanks,
>
> Dave Fuhry
>
>> Best regards,
>> Tamas
>> 2007/10/12, David Fuhry <dfuhry at cs.kent.edu>:
>>> Has anyone looked into parallelizing the calls to msDraw[Query] 
>>> Layer()
>>> in msDrawMap()?
>>>
>>> Although I'm new to the codebase, it seems that near the top of
>>> msDrawMap(), we could launch a thread for each (non-WMS/WFS) layer,
>>> rendering the layer's output onto its own imageObj.  Then where  
>>> we now
>>> call msDraw[Query]Layer, wait for thread i to complete, and  
>>> compose that
>>> layer's imageObj onto the map's imageObj.
>>>
>>> In msDraw[Query]Layer(), critical sections of the mapObj (adding  
>>> labels
>>> to the label cache, for instance) would need to be protected by a  
>>> mutex.
>>>
>>> A threaded approach would let some layers get drawn while others are
>>> waiting on I/O or for query results, instead of the current serial
>>> approach where each layer is drawn in turn.  Multiprocessor machines
>>> could schedule the threads across all of their cores for  
>>> simultaneous
>>> layer rendering.
>>>
>>> It seems this could significantly speed up common-case rendering,
>>> especially on big machines, for very little overhead.  Has there  
>>> been
>>> previous work in this area, or are any major drawbacks evident?
>>>
>>> Thanks,
>>>
>>> Dave Fuhry
>>>

+-----------------------------------------------------------------+
|Paul Spencer                          pspencer at dmsolutions.ca    |
+-----------------------------------------------------------------+
|Chief Technology Officer                                         |
|DM Solutions Group Inc                http://www.dmsolutions.ca/ |
+-----------------------------------------------------------------+



More information about the mapserver-dev mailing list