Низкая производительность MapServer
-
03-07-2019 - |
Вопрос
Я использую картографический сервер для создания карты, которая будет отображаться с помощью API карты Google.Я сталкиваюсь с проблемами производительности.
Все мои карты имеют формат шейп-файла.
Я запускаю тесты, чтобы получить время на рендеринг карт.
При рендеринге карты с помощью инструмента shp2img с использованием командной строки
shp2img -i gif -m C:\myfolder\mymapfile.map -o C:\myfolder\test.gif -all_debug 5 -map_debug 5
Я получаю следующие показатели из файлов журналов:
[Thu Apr 30 13:50:19 2009].148000 msLoadMap(): 0.000s
[Thu Apr 30 13:50:19 2009].180000 msDrawMap(): Layer 0 (PWorld2), 0.032s
[Thu Apr 30 13:50:19 2009].180000 msDrawMap(): Drawing Label Cache, 0.000s
[Thu Apr 30 13:50:19 2009].180000 msDrawMap() total time: 0.032s
[Thu Apr 30 13:50:19 2009].195000 msSaveImage() total time: 0.015s
[Thu Apr 30 13:50:19 2009].195000 msFreeMap(): freeing map at 01595E18.
[Thu Apr 30 13:50:19 2009].195000 freeLayer(): freeing layer at 0159CD00.
[Thu Apr 30 13:50:19 2009].195000 shp2img total time: 0.047s
При рендеринге той же карты через картографический сервер используйте
http://localhost/cgi-bin/mapserv.exe?mymapfile.map&layers=&mode=tile&tilemode=gmap&tile=1+1+2
файл журнала дает это:
[Thu Apr 30 13:51:50 2009].664000 CGI Request 1 on process 3520
[Thu Apr 30 13:51:50 2009].664000 msTileSetExtent (-10013744.792915, 8348.961808) (-5009.377085, 10010405.208192)
[Thu Apr 30 13:51:51 2009].23000 msDrawMap(): Layer 0 (PWorld2), 0.359s
[Thu Apr 30 13:51:51 2009].23000 msDrawMap(): Drawing Label Cache, 0.000s
[Thu Apr 30 13:51:51 2009].23000 msDrawMap() total time: 0.359s
[Thu Apr 30 13:51:51 2009].23000 msSaveImage() total time: 0.000s
[Thu Apr 30 13:51:51 2009].23000 mapserv request processing time (loadmap not incl.): 0.359s
[Thu Apr 30 13:51:51 2009].23000 msFreeMap(): freeing map at 01598690.
Для той же карты инструмент shp2img отображает карту в 10 раз быстрее, чем картографический сервер.При добавлении дополнительных слоев и использовании режима мозаики для карты Google это время может составлять до 10 секунд.
Кто-нибудь знает, почему картографический сервер так медленно рендерит?Есть ли обходной путь?
Решение
Между запросом shp2img и запросом Mapserv есть несколько различий:
1) shp2img создает одно изображение, ваш запрос Mapserv генерирует плитки.Это означает, что ему, возможно, придется визуализировать 9 плиток для одной и той же ограничивающей рамки вместо 1.Это приводит к накладным расходам.Попробуйте выполнить рендеринг без установленной опции «Плитки» и запустите тест еще раз.
2) У вас есть небольшие накладные расходы для запроса CGI в Mapserv 3) Mapserv нажимает изображение через HTTP, в то время как SHP2img пишет непосредственно на диск.4) Вы не указали слой в запросе к серверу, что означает, что сервер ищет слои.
Другие советы
Вы можете прочитать это:http://mapserver.org/optimization/index.html
- Одним из наиболее важных моментов является удаление неиспользуемых проекций из файла EPSG.Например.под RedHat 6 /usr/share/proj/epsg у меня есть 3 проекции.
- Удалить неиспользуемые шрифты
- Парсер файла карты читает файл сверху вниз, поэтому наиболее используемые слои помещаются вверху файла (парсер EPSG работает таким же образом).
Файлы форм «должны иметь» одну и ту же проекцию вызывающего объекта, иначе Mapserver должен будет перепроецировать их на лету.
НАПРИМЕР.Из моего кода OpenLayers (900913):
var options = {
projection: new OpenLayers.Projection('EPSG:900913'), //aka EPSG:3785
displayProjection: new OpenLayers.Projection('EPSG:4326'), //geographic
Все мои шейп-файлы основаны на проекциях 900913.
У меня есть пара предложений, но нет однозначных ответов. Я не особо занимался настройкой картографического сервера, но работал с людьми, которые это делали.
- Вы можете провести множество оптимизаций картографического сервера, я бы проверил список рассылки.
- Сделайте файл карты как можно меньшим, так как открытие и анализ файла карты могут занять у картографического сервера много времени.
- Создайте все плитки заранее и просто используйте картографический сервер, чтобы получить файлы.Тайлинг на лету происходит не очень быстро.