[英]Threading in Java REST web service
我有一個REST Web服務,當請求數量過多時,它會消耗過多的CPU資源。
據信這是由響應生成中的while()循環引起的,通常需要花費幾毫秒的時間才能完成,但是在某些情況下則可能需要花費幾秒鍾。
解決此問題的方法似乎是根據此方法使用wait()和notify(),但是我不明白為什么這會減少CPU使用率?
這個新線程是否將在Web服務之外處理,從而釋放它以處理更多請求? 有人可以解釋一下嗎?
謝謝!
喬恩
編輯:
我可能在這里找到了自己的答案
看來我的result = get()
代碼result = get()
不斷輪詢直到出現響應為止,這會消耗更多的CPU資源。 通過將其放置在線程中,可以減少資源消耗。
這是正確的理解嗎?
這是正確的理解嗎?
不斷輪詢某些事物直到有響應的循環是非常浪費的。 如果在每個輪詢之間添加sleep
,則可以減少CPU使用率,但會以降低單個請求的響應為代價...與以正確方式進行操作相比,這是可以實現的。
如果不確切知道自己在做什么(正在輪詢什么以及為什么),則很難說出最佳解決方案是什么。 但是,這里有兩種可能的情況:
如果您的Web服務正在等待來自外部服務的響應,那么簡單的解決方案是只進行阻塞讀取,並為Web服務器配置更多的工作線程。
另一方面,如果您的Web服務正在等待計算完成,則可能是一個新線程並等待/通知...或更高級別的同步類之一。
如果您需要並行處理大量此類阻塞請求,則將需要大量線程,因此需要大量內存和其他東西。 在這種情況下,您需要考慮一個打破每個請求一個線程約束的Web容器。 Servlet規范的最新版本以及某些其他(非Servlet)體系結構也允許這樣做。
跟進
...我認為問題在於您的第二點,即服務只是在等待計算。 那么,僅通過線程化此計算即可釋放服務中的資源?
如果您所描述的是正確的,則在不同的線程中運行計算不會使計算更快。 實際上,它可能會使速度變慢。
最終的瓶頸將是CPU容量,磁盤帶寬和/或網絡帶寬。 如果您可以同時有效/高效地在同一請求上使用2個或多個處理器,那么多線程只會使單個請求的執行速度更快。 它只會在允許請求在其他人正在等待外部事件的同時運行的范圍內提高吞吐量。 例如,網絡響應到達,或文件讀/寫操作完成。
我認為您實際上需要做的是弄清楚為什么計算需要這么長時間,然后嘗試解決該問題:
有多種技術可用於衡量應用程序服務和數據庫的性能以確定瓶頸所在。 (從Google搜索開始...。)
首先,不要試圖猜測為什么要消耗這么多的CPU。 放置一些儀器,找出瓶頸的真正位置。 一旦知道瓶頸在哪里,就嘗試了解根本原因。 5個為什么要這樣做的好方法。
一旦知道了根本原因,請確定它是否可以解決。 例如,如果算法效率低下並且有可用的高效算法,則重構代碼以使用高效算法。 不要忘記,根本原因可能是服務器電源不足,需要更大的CPU。
其次,考慮使用http緩存來減少服務器上的負載。 請求的數據多久更改一次,您的響應需要多長時間更新一次? 用它來計算最大壽命; HTTP緩存可以保持響應的時間長度。 可能是1分鍾,一天,一周等等,這實際上取決於您要提供的服務。 達到最大使用期限后,請查看傳入的請求。在您選擇的最大使用期限內,有多少個請求用於相同的URI(或者如果您對它進行了周整,則可以用於同一URI)。 如果在最大使用期限內所有請求URI都是唯一的,那么緩存將無濟於事。 如果在最大使用期限內,每個URI平均收到2個請求,那么HTTP緩存將使服務器負載減半。 如果每個URI 10個請求,那么HTTP緩存將減少90%的服務器負載。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.