使用 Mapserver 加速 "Mapcache_seed"
Speeding up "Mapcache_seed" with Mapserver
我在 mapcache
包中使用 mapcache_seed
通过调用我的 mapserver
WMS 创建一个大图像缓存,带有矢量。
目前,这是我正在使用的命令:
sudo -u www-data mapcache_seed -c mapcache.xml -g WGS84 -n 8 -t Test -e\ [Foo,Bar,Baz,Fwee] -M 8,8 -z 12,13 --thread-delay 0 --rate-limit 10000
其中 www-data
是我的 Nginx 系统用户,mapcache.xml
是我的配置,WGS84
是我的 SRS,-n 8
是我的逻辑线程数(在 i7 上-6700HQ at 3200 MHz),-z 12,13
是一个需要播种的缩放级别,线程延迟关闭,平铺率创建设置为 10000。
但是,我只能(最大)获得 50% 的总 CPU 利用率,而且大多数时候只有一个内核超过 50%。平均每秒 500 个图块——与我指定的线程或进程数无关。在过去的几天里,我一直在尝试为所有缩放级别(4 到 27)播种,但我只设法通过了 4-12,然后就严重瓶颈了,只有 3GB 的几个百万块。
mapcache_seed 的 8GB PC4-2133 的内存利用率稳定在 2.4%(WMS 为 0.5)。写入速度为 100 MB/s,无缓冲写入也是 100 MB/s,而缓冲+缓存在 SATA III 1TB 硬盘上为 6.7-8.7 GB/s。我的机器上有另一个 SSD 驱动器,它有 6 GB/s 写入和 8 GB/s 读取,但它对于存储来说太小了,我担心写入过多会导致驱动器故障。
每个缓存的图块大约 4KB,这意味着我每秒获得大约 2MB 的图块。它们中的大多数甚至都不是磁贴,而是符号链接到用于空磁贴的全能空白磁贴。
我将如何着手加快这个过程?通过 mapcache_seed
搞乱线程和限制不会产生任何明显的区别。这也在 Debian Wheezy 机器上。
这也是通过 fast-cgi 运行,使用 256x256 像素的图像,以及限制在单个国家/地区的磁盘缓存(否则 mapcache 开始只生成指向空白图块的符号链接,因为超过世界上 90% 的地方都是空白的!)
Mapserver 映射文件(编辑):
MAP
NAME "MAP"
SIZE 1200 800
EXTENT Foo Bar Baz Fwee
UNITS DD
SHAPEPATH "."
IMAGECOLOR 255 255 255
IMAGETYPE PNG
WEB
IMAGEPATH "/path/to/image"
IMAGEURL "/path/to/imageurl"
METADATA
"wms_title" "MAP"
"wms_onlineresource" "http://localhost/cgi-bin/mapserv?MAP=/path/to/map.map"
"wms_srs" "EPSG:4326"
"wms_feature_info_mime_type" "text/plain"
"wms_abstract" "Lorem ipsum"
"ows_enable_request" "*"
"wms_enable_request" "*"
END
END
PROJECTION
"init=epsg:4326"
END
LAYER
NAME base
TYPE POLYGON
STATUS OFF
DATA polygon.shp
CLASS
NAME "Polygon"
STYLE
COLOR 0 0 0
OUTLINECOLOR 255 255 255
END
END
END
LAYER
NAME outline
TYPE LINE
STATUS OFF
DATA line.shp
CLASS
NAME "Line"
STYLE
OUTLINECOLOR 255 255 255
END
END
END
END
mapcache.xml(编辑):
<?xml version="1.0" encoding="UTF-8"?>
<mapcache>
<source name="ms4wserver" type="wms">
<getmap>
<params>
<LAYERS>base</LAYERS>
<MAP>/path/to/map.map</MAP>
</params>
</getmap>
<http>
<url>http://localhost/wms/</url>
</http>
</source>
<cache name="disk" type="disk">
<base>/path/to/cache/</base>
<symlink_blank/>
</cache>
<tileset name="test">
<source>ms4wserver</source>
<cache>disk</cache>
<format>PNG</format>
<grid>WGS84</grid>
<metatile>5 5</metatile>
<metabuffer>10</metabuffer>
<expires>3600</expires>
</tileset>
<default_format>JPEG</default_format>
<service type="wms" enabled="true">
<full_wms>assemble</full_wms>
<resample_mode>bilinear</resample_mode>
<format>JPEG</format>
<maxsize>4096</maxsize>
</service>
<service type="wmts" enabled="false"/>
<service type="tms" enabled="false"/>
<service type="kml" enabled="false"/>
<service type="gmaps" enabled="false"/>
<service type="ve" enabled="false"/>
<service type="mapguide" enabled="false"/>
<service type="demo" enabled="false"/>
<errors>report</errors>
<locker type="disk">
<directory>/path/</directory>
<timeout>300</timeout>
</locker>
</mapcache>
所以对于十年后遇到这个问题的任何人来说,当这些工具的小文档已经腐烂时,我弄乱了我的地图缓存和地图文件设置以获得更好的东西。并不是我的生成速度太慢,而是我为空白文件生成了太多该死的符号链接。首先,映射文件范围不正确。其次,我使用的是 "WGS84" 网格,它默认为所有范围播种。这意味着我所有磁贴中的 90% 只是指向 blank.png 的符号链接,它吃掉了我所有的 inode。我建议使用 mkdir blank; rsync -a --delete blank/ /path/to/cache
来快速清理所有这些混乱。
我通过采用 WGS84 规范并将范围更改为我在 mapfile 中指定的范围来修复上述问题。现在,只有我的 mapfile 被播种。最后,我附加了网格 XML 元素,如下所示:
<grid restricted_extent="MAP FILE EXTENT HERE">GRIDNAME</grid>
有了 restricted_extent
,现在可以确定只有我的地图会被播种。我有超过 1 亿个图块,但它们都是该死的符号链接!否则,我得到一个 "Ran out of space" 或类似的东西。即使 df
显示分区未满,也是误导。符号链接占用 inode space,不符合逻辑 space!查看inode space, 运行 df -hi
。我在 100% inode space,但在 1TB 驱动器上只有 1% 逻辑 space —— 充满了该死的符号链接!
我在 mapcache
包中使用 mapcache_seed
通过调用我的 mapserver
WMS 创建一个大图像缓存,带有矢量。
目前,这是我正在使用的命令:
sudo -u www-data mapcache_seed -c mapcache.xml -g WGS84 -n 8 -t Test -e\ [Foo,Bar,Baz,Fwee] -M 8,8 -z 12,13 --thread-delay 0 --rate-limit 10000
其中 www-data
是我的 Nginx 系统用户,mapcache.xml
是我的配置,WGS84
是我的 SRS,-n 8
是我的逻辑线程数(在 i7 上-6700HQ at 3200 MHz),-z 12,13
是一个需要播种的缩放级别,线程延迟关闭,平铺率创建设置为 10000。
但是,我只能(最大)获得 50% 的总 CPU 利用率,而且大多数时候只有一个内核超过 50%。平均每秒 500 个图块——与我指定的线程或进程数无关。在过去的几天里,我一直在尝试为所有缩放级别(4 到 27)播种,但我只设法通过了 4-12,然后就严重瓶颈了,只有 3GB 的几个百万块。
mapcache_seed 的 8GB PC4-2133 的内存利用率稳定在 2.4%(WMS 为 0.5)。写入速度为 100 MB/s,无缓冲写入也是 100 MB/s,而缓冲+缓存在 SATA III 1TB 硬盘上为 6.7-8.7 GB/s。我的机器上有另一个 SSD 驱动器,它有 6 GB/s 写入和 8 GB/s 读取,但它对于存储来说太小了,我担心写入过多会导致驱动器故障。
每个缓存的图块大约 4KB,这意味着我每秒获得大约 2MB 的图块。它们中的大多数甚至都不是磁贴,而是符号链接到用于空磁贴的全能空白磁贴。
我将如何着手加快这个过程?通过 mapcache_seed
搞乱线程和限制不会产生任何明显的区别。这也在 Debian Wheezy 机器上。
这也是通过 fast-cgi 运行,使用 256x256 像素的图像,以及限制在单个国家/地区的磁盘缓存(否则 mapcache 开始只生成指向空白图块的符号链接,因为超过世界上 90% 的地方都是空白的!)
Mapserver 映射文件(编辑):
MAP
NAME "MAP"
SIZE 1200 800
EXTENT Foo Bar Baz Fwee
UNITS DD
SHAPEPATH "."
IMAGECOLOR 255 255 255
IMAGETYPE PNG
WEB
IMAGEPATH "/path/to/image"
IMAGEURL "/path/to/imageurl"
METADATA
"wms_title" "MAP"
"wms_onlineresource" "http://localhost/cgi-bin/mapserv?MAP=/path/to/map.map"
"wms_srs" "EPSG:4326"
"wms_feature_info_mime_type" "text/plain"
"wms_abstract" "Lorem ipsum"
"ows_enable_request" "*"
"wms_enable_request" "*"
END
END
PROJECTION
"init=epsg:4326"
END
LAYER
NAME base
TYPE POLYGON
STATUS OFF
DATA polygon.shp
CLASS
NAME "Polygon"
STYLE
COLOR 0 0 0
OUTLINECOLOR 255 255 255
END
END
END
LAYER
NAME outline
TYPE LINE
STATUS OFF
DATA line.shp
CLASS
NAME "Line"
STYLE
OUTLINECOLOR 255 255 255
END
END
END
END
mapcache.xml(编辑):
<?xml version="1.0" encoding="UTF-8"?>
<mapcache>
<source name="ms4wserver" type="wms">
<getmap>
<params>
<LAYERS>base</LAYERS>
<MAP>/path/to/map.map</MAP>
</params>
</getmap>
<http>
<url>http://localhost/wms/</url>
</http>
</source>
<cache name="disk" type="disk">
<base>/path/to/cache/</base>
<symlink_blank/>
</cache>
<tileset name="test">
<source>ms4wserver</source>
<cache>disk</cache>
<format>PNG</format>
<grid>WGS84</grid>
<metatile>5 5</metatile>
<metabuffer>10</metabuffer>
<expires>3600</expires>
</tileset>
<default_format>JPEG</default_format>
<service type="wms" enabled="true">
<full_wms>assemble</full_wms>
<resample_mode>bilinear</resample_mode>
<format>JPEG</format>
<maxsize>4096</maxsize>
</service>
<service type="wmts" enabled="false"/>
<service type="tms" enabled="false"/>
<service type="kml" enabled="false"/>
<service type="gmaps" enabled="false"/>
<service type="ve" enabled="false"/>
<service type="mapguide" enabled="false"/>
<service type="demo" enabled="false"/>
<errors>report</errors>
<locker type="disk">
<directory>/path/</directory>
<timeout>300</timeout>
</locker>
</mapcache>
所以对于十年后遇到这个问题的任何人来说,当这些工具的小文档已经腐烂时,我弄乱了我的地图缓存和地图文件设置以获得更好的东西。并不是我的生成速度太慢,而是我为空白文件生成了太多该死的符号链接。首先,映射文件范围不正确。其次,我使用的是 "WGS84" 网格,它默认为所有范围播种。这意味着我所有磁贴中的 90% 只是指向 blank.png 的符号链接,它吃掉了我所有的 inode。我建议使用 mkdir blank; rsync -a --delete blank/ /path/to/cache
来快速清理所有这些混乱。
我通过采用 WGS84 规范并将范围更改为我在 mapfile 中指定的范围来修复上述问题。现在,只有我的 mapfile 被播种。最后,我附加了网格 XML 元素,如下所示:
<grid restricted_extent="MAP FILE EXTENT HERE">GRIDNAME</grid>
有了 restricted_extent
,现在可以确定只有我的地图会被播种。我有超过 1 亿个图块,但它们都是该死的符号链接!否则,我得到一个 "Ran out of space" 或类似的东西。即使 df
显示分区未满,也是误导。符号链接占用 inode space,不符合逻辑 space!查看inode space, 运行 df -hi
。我在 100% inode space,但在 1TB 驱动器上只有 1% 逻辑 space —— 充满了该死的符号链接!