2012-06-04 71 views
6

背景:Python:你如何找到一段代碼的CPU消耗?

我有一個Django應用程序,它的工作原理,並響應相當不錯的低負荷,但在高負荷像100用戶/秒,消耗100%的CPU,然後由於缺乏CPU速度變慢。

問題:

  • 分析應用程序給我的功能所花的時間。
  • 這次在高負荷時增加。
  • 耗時可能是由於計算複雜或等待CPU。

那麼,如何找到一段代碼所消耗的CPU週期呢?

因爲減少CPU消耗會增加響應時間。

  • 我可能已經寫了非常高效的代碼,並需要增加更多的CPU功率

OR

  • 我可能有一些愚蠢的代碼服用CPU並導致慢下來?

任何幫助表示讚賞!

更新:

  • 我使用的JMeter來分析我的web應用程序,它給了我一個吞吐量2個請求/秒。 [100位用戶]
  • 我的平均時間爲100秒,而在1秒的請求時間爲1.25秒。

更多信息

  • 配置的Nginx + Uwsgi有4名工人
  • 沒有使用數據庫,使用從REST API
  • 在1日迴應命中REST API的響應被緩存,因此沒有區別。
  • 使用ujson進行json解析。

好奇地想知道:

  • Python的Django是使用這麼大的網站那麼多的單位,則必須有一些高端的調試/內存CPU的分析工具。
  • 我發現的所有這些都是執行性能分析的代碼片段。
+0

我在剖析中的第一步是查看*大部分時間花費哪些函數,並且調查爲什麼,如果合理,以及如何/如何減少。時間(經常)的*量*與時間的*比例量*不重要。 – 2012-06-04 06:19:35

+0

所有的時間似乎分佈在整個應用程序。沒有具體的問題似乎是一個問題領域。 –

+1

好像?你確切的測量結果?請參閱http://stackoverflow.com/a/582337/851737尋求幫助。 – schlamar

回答

2

你可以嘗試配置您的測試緩慢上升,足夠慢,這樣就可以看到CPU逐漸增加,然後之前運行探查你打高CPU。在CPU被最大化時嘗試剖析代碼是毫無意義的,因爲在這一點上一切都會變得緩慢。事實上,你只需要一個相對較輕的負載從探查器獲取有用的數據。另外,通過逐漸增加負載,您將能夠更好地瞭解CPU是否逐漸增加(提示CPU瓶頸),或CPU是否突然跳變(表明可能存在另一種類型的問題,例如,這不一定會通過更多的CPU來解決)。

嘗試使用像Cosntant Throughput Timer這樣的東西來調整請求的速度,這將防止JMeter進入系統並導致系統過載。

+0

好的建議開始..我會探索你建議的選項。除此之外,我正在爲django/python尋找更多的忍者分析工具 - 這可以提供更細緻的系統外觀。 :) –

+0

有趣這是檢查,但收到-1 .... geesh – user1012451

0

結賬New Relic對於一些非常甜蜜的分析,他們有Django特定的日誌記錄。