我有一個主要for
循環的腳本,重複大約15k次。在這個循環中,它查詢本地MySQL數據庫並在本地存儲庫上執行SVN更新。我把SVN版本庫放在一張RAMdisk中,大部分時間似乎都花在讀取/寫入磁盤上。查找Python和MySQL腳本中的性能瓶頸
現在我有一個以基本相同的速度運行的腳本,但該腳本的CPU利用率永遠不會超過10%。
ProcessExplorer顯示,mysqld也不會佔用幾乎所有的CPU時間或讀取/寫入磁盤。
你會採取哪些步驟來找出瓶頸在哪裏?
我有一個主要for
循環的腳本,重複大約15k次。在這個循環中,它查詢本地MySQL數據庫並在本地存儲庫上執行SVN更新。我把SVN版本庫放在一張RAMdisk中,大部分時間似乎都花在讀取/寫入磁盤上。查找Python和MySQL腳本中的性能瓶頸
現在我有一個以基本相同的速度運行的腳本,但該腳本的CPU利用率永遠不會超過10%。
ProcessExplorer顯示,mysqld也不會佔用幾乎所有的CPU時間或讀取/寫入磁盤。
你會採取哪些步驟來找出瓶頸在哪裏?
做SQL查詢在for循環15000次是在每一種語言的瓶頸..
有你再次查詢每一次的原因嗎?如果您在for循環之前執行單個查詢,然後遍歷結果集和SVN部分,則會看到速度急劇增加。
但我懷疑你會得到更高的CPU使用率。原因是你沒有進行計算,但主要是IO。 順便說一下,你不能測量它在mysqld cpu的使用情況,因爲它在實際代碼中不是查詢的複雜性,而是它們的計數和服務器引擎的響應延遲。所以你會看到只有非常短的,不昂貴的查詢,儘管如此,總結時間。
配置您的Python代碼。這會告訴你每個函數/方法調用需要多長時間。如果這是查詢MySQL數據庫的方法調用,那麼您將有一個線索在哪裏尋找。但它也可能是別的。無論如何,剖析是解決這些問題的常用方法。
可以這麼說,svn update
在完成運行後等待了整整一秒,因此文件修改時間戳會「過去」(因爲許多文件系統沒有時間戳粒度小於1秒)。你可以通過谷歌搜索「svn sleep_for_timestamps」找到更多關於它的信息。
我沒有任何明顯的解決方案建議。如果這確實對性能至關重要,那麼您可以:1)不會像您一樣頻繁更新2)嘗試使用較低級別的Subversion API(祝您好運)。
我學會了如何配置感謝你,但我得到的結果是不確定的(或者我仍然不知道如何解釋它們)。 – greye 2010-01-19 06:20:35