2012-07-23 70 views
4

我們注意到Geoserver實例和Postgres/PostGIS之間的交互中存在一些奇怪的現象。Geoserver - PostGIS性能問題

將Geoserver的日誌級別設置爲包含開發人員調試後,我設法從Geoserver WMS向PostGIS捕獲單個請求。

事件及其時間戳的(縮短)序列:

12:31:22,658 - SELECT query for MSG is sent to Postgres 
12:32:10,315 - Rendering for MSG layer starts 
12:32:10,356 - DB Connection Closed 
~ 48 seconds 

有趣的是,當我執行直接從PgAdmin3相同的查詢(MSG):

SELECT "frp_mw",encode(ST_AsBinary(ST_Force_2D("the_geom")),'base64') as "the_geom" FROM "public"."af_msg_abba_datetime_today" WHERE ("the_geom" && GeometryFromText('POLYGON ((-27.67968749408379 -46.92207325648429, -27.67968749408379 -6.186892358058866, 75.67968748740275 -6.186892358058866, 75.67968748740275 -46.92207325648429, -27.67968749408379 -46.92207325648429))', 4326) AND (("frp_mw" >= -1 AND "frp_mw" <= 150) OR ("frp_mw" >= 151 AND "frp_mw" <= 300) OR ("frp_mw" >= 301 AND "frp_mw" <= 600) OR ("frp_mw" >= 601 AND "frp_mw" <= 50000))); 

我得到6515行中380毫秒。

如果從PgAdmin3查詢,Postgres能夠在380毫秒內返回查詢結果,但Geoserver需要大約48秒才能獲得相同的結果集。

這也許是一種JDBC問題?

我們設置一些細節:

主Postgres數據庫是從利用Geoserver一個單獨的虛擬機,但我們複製對利用Geoserver VM(同一主機)的從屬的Postgres集羣。所以Geoserver正在引用'localhost'只讀Postgres羣集來查詢它。

上面顯示的380 ms響應時間來自從屬Postgres羣集,與Geoserver使用的相同。

所有基於Linux(Ubuntu 11.10)的。 Postgres 9.1 PostGIS 1.5地理服務器2.1.3

+0

您是否將pgadmin中的所有6k行下載到客戶端,或只有前100個? – 2012-07-23 08:54:40

+0

我在一個單獨的查詢窗口中執行查詢,然後我認爲它將所有行都返回給客戶端。 – Ries 2012-07-23 10:32:27

回答

3

GeoServer以1000的數據塊提取數據,渲染它們,提取下一個數據塊等等,以避免在有很多併發請求的情況下產生大的內存佔用。所以48s不是加載數據的時間,而是加載和渲染數據。加載數據的速度更快,但無法控制內存佔用。

此外,您是否在數據存儲配置中使用準備好的語句?

+0

從日誌看來,渲染僅在大約48s後纔開始。 2012-07-20 12:32:10,315 DEBUG [org.geotools.rendering] - 試圖渲染符號圈 2012-07-20 12:32:10,315 DEBUG [org.geotools.rendering] - 渲染mark @ PointRenderer圓形 2012-07-20 12:32:10,316 DEBUG [org.geotools.rendering] - 取名圓圈標記 2012-07-20 12:32:10,316 DEBUG [org.geotools.rendering] - 返回圓圈 – Ries 2012-07-24 07:34:54

+0

準備語句已啓用並且最​​大打開設置爲50. – Ries 2012-07-24 07:37:45

+0

啊,關閉準備好的語句解決了我的問題!感謝提示。 – Ries 2012-07-24 07:55:34