个人认为MapServer最大的不足就是其对多线程运行环境支持不够,也就是说不能有效的处理并发的请求。
MapServer设计之初是作为cgi方式访问,这样一来,很多变量就是静态变量,导致不能并发访问,这是MapServer本身的代码问题;除此之外MapServer依赖的第三方库也有不能支持并发访问的,这更加剧了这个问题的严重程度。
现在作为服务器端运行的服务程序,都能充分的支持和直接利用并行运行的好处,MapServer似乎因为历史的原因在这方面比较落后。或许这就是其风头不及GeoServer的原因了。
尽管作为cgi进程运行模式也能支持并发的http请求,每一个http请求,启动一个MapServer进程进行处理,但是这种方式代价还是比较大的。1、性能问题,这种方式既涉及到进程间通讯导致的速度慢问题,也涉及到每次都要重新加载地图数据到MapServer进程,从文件或者数据库加载进来,这更导致响应速度慢,而且地图数据,更新并不一定频繁,每次都加载也没有必要;2、规模问题,每一个请求启动一个进程,同时加载一定数量的地图数据。显然会导致一系列问题,多个处理进程,和多份地图数据(甚至同样数据)的加载,导致内存不足,多个进程从磁盘加载地图数据(每次请求加载一次),磁盘IO也会成为瓶颈,导致响应更慢,并发处理能力下降,因此,不能处理规模比较大的并发请求。
当然了,如果MapServer作为一般的Web地图应用,其支持WMS、WFS等,还是很优秀的,希望MapServer能在多线程并发处理方面做重新的架构和优化,以更好的支持大量并发请求处理。不过,同为开源的MapGuide,已经很好的解决了这个问题,而且走的更远,直接使用MapGuide就ok了。