0

我有這個配置在module.yaml在GAE中,Python請求是否真的並行處理?

runtime: python27 
api_version: 1 
instance_class: F2 
threadsafe: true 

automatic_scaling: 
    min_idle_instances: automatic 
    max_idle_instances: 8 
    min_pending_latency: 0.25s 
    max_pending_latency: automatic 
    max_concurrent_requests: 80 

並在控制檯中我看到這些數字也:

QPS* Latency* Requests Errors Age Memory App Engine Rel. Availability 
8.730 113.5 ms 12621   0 1:48:25 67.9 MBytes 1.9.27  Resident 
14.142 76.7 ms  12543   0 1:48:26 79.8 MBytes 1.9.27  Resident  
13.411 74.3 ms  12753   0 1:48:26 96.4 MBytes 1.9.27  Resident 

如果乘以QPS通過延遲(每秒查詢)(換算成秒):

  • 8.730查詢/第二X0.1135秒= 0.990855查詢
  • 14.142查詢/秒OND X0.0767秒= 1.0846914查詢
  • 13.411查詢/秒X0.0743秒= 0.9964673查詢

我重複相同的鍛鍊,每天多次,並在所有的情況下,在右邊的最終數目是非常非常接近TO 1查詢。

所以我懷疑如果同一個實例能夠並行處理查詢。我可以在平均延遲中看到的流程非常快,當我需要長時間工作時,流程使用任務隊列。我不使用此模塊內的異步進程。我讀到,當你有一個空閒的進程等待urlfetch響應,這將是另一個python線程/請求並行執行的機會,但不是我的情況。

的官方文檔中沒有這方面的詳細說明,只是指出這一點:

使用的併發請求

默認情況下,App Engine的連續發送請求到指定的Web服務器。您可以將App Engine配置爲通過將線程安全元素添加到app.yaml來發送多個並行請求。

線程:真

我是否需要設置其他參數或使用特殊的圖書館,讓許多要求進行並聯在同一個實例執行?對於上面顯示的QPS編號,平均CPU利用率在15%到25%之間,因此有空間至少並行運行3個請求(個人估計沒有足夠的分析)

謝謝!

+0

據我所知,'threadsafe:true'足以告訴GAE實例可以並行處理多個請求。請注意,使用CPython,在大多數情況下(由於Global Interpreter Lock的限制 - GIL),一次只能運行一個線程。因此,在python中,除非程序沒有忙於等待,否則通常不會通過線程獲得太多收益。如果您產生了對數據存儲或使用urlfetch的異步請求。 – mgilson

+0

謝謝,我也讀了關於這個情況,因此我說我的代碼在這個模塊中不使用異步函數。如果我將運行時更改爲PHP或JAVA,我是否會有相同的限制?如果PHP運行時可以真正並行處理請求,這對我來說可能是一個解決方案,我可以將一些模塊遷移到PHP。 –

+0

這樣做的必然結果是,有更多的實例F1比同等數量的更高實例F2或F4更好,因爲更多的請求可以並行處理並擁有更多的實例......您怎麼看?擁有數千QPS時,在預算優化方面有所考慮。 –

回答

1

使用低延遲請求不是應用程序多線程的良好指示器。處理請求的一部分發生在應用程序本身之外的GAE中(例如,路由到應用程序)或應用程序內部,但在非線程區域中。對於低延遲請求,非線程百分比可能很大,會導致結果偏差並可能導致錯誤結論。

要檢查並行請求處理,我建議使用不使用潛在速率限制的GAE服務的高延遲請求。例如,嘗試讓請求處理程序執行普通的Python處理,或者在回答清楚查看請求是否真正並行處理之前,休眠40至50秒。

+0

謝謝丹。我發現這個視頻,對澄清這種情況非常有用。 https://www.youtube.com/watch?feature=player_detailpage&v=T_BQevqRp44#t=2094s作爲最後的想法,如果我的應用程序延遲非常低,由於很少的I/O會很難利用多線程操作留下閒置的cpu時間。 –