[GIS] MapServer very weak performance vs. GeoServer – Why

geoservermapserverperformancepostgiswms

I search for a good WMS server that support PostGIS at the end I found MapServer as the fastest and best choice.

Every performance test say it's faster than GeoServer because of its native compiled code.

Then when we developed our server side using MapScript (the MapServer extension for PHP).

When we did some benchmark on server and compared it with GeoServer and

Wow! MapServer is 2 to 3 times slower than GeoServer.

We also repeat the experiment with MapServer CGI and results not changed.

Our experiment environments:

  • Windows 7 64 bit
  • MapServer version 6.0.3 (MS4W 3.0.6) (MS4W/PHP Mapscript)
  • GeoServer 2.7
  • PostGIS 2.1
  • PostgreSQL 9.4

The PHP code which used to render tiles and used as WMS server:

<?php
if(!isset($_REQUEST['layerId']))
    die('Layer Is Not Valid');

$layerId=(int)$_REQUEST['layerId'];

$map=new mapObj(null);
$map->setFontSet(realpath("lib\\server-side\\fonts.list"));
$map->setConfigOption("MS_ERRORFILE",__DIR__.("\\ms_error.log"));

$map->metadata->set('wms_enable_request','GetCapabilities GetMap GetFeatureInfo');
$map->metadata->set('wms_getmap_formatlist','image/png,png,png8,png24');
$map->setProjection("init=epsg:4326");

$layer = new LayerObj($map);

$layer->set('labelcache', MS_ON);
$layer->setProcessing('LABEL_NO_CLIP=FALSE');
$layer->setProcessing('FORCE2D=YES');

$layer->set('name', "MasterLayer");
$layer->set('status', MS_DEFAULT );

$layer->setConnectionType(MS_POSTGIS);
$layer->set('connection', "user=postgres password=psgpass dbname=map host=127.0.0.1 port=5432");
$layer->set('data', "geodata from geo_data as subquery using SRID=-1 using unique id ");

$layer->set('type', MS_LAYER_POLYGON);

$class = new ClassObj( $layer );

$style = new StyleObj( $class );
$style->color->setRGB(255,0,0);
$style->set('opacity',100);

$request = new Owsrequestobj();
$request->loadparams();
$request->setparameter('REQUEST', 'GetMap');
$request->setparameter('LAYERS', 'MasterLayer');
$request->setparameter('FORMAT', 'png8');

ms_ioinstallstdouttobuffer();
$map->owsdispatch($request);

$contenttype = ms_iostripstdoutbuffercontenttype();

if (!empty($contenttype))
{
    header('Content-type: $contenttype');
    ms_iogetStdoutBufferBytes();
}
else 
    echo "Fail to render!";
ms_ioresethandlers();
?>

DataBase Data Projection: EPSG:4326

Does anybody know why GeoServer is much faster when it isn't compiled natively? Am I missed something?

Best Answer

According to a recent comparison of different mapping engines in performing tile seeding (see Section 4.3), MapServer should be much faster than GeoServer.

Is there any re-projection of geometries in your rendering stack?

An old version of MapServer might have the same issue with proj4 lib as Mapnik had.

Related Question