正如評論中指出的,一個可能的原因是開發虛擬機和生產機器之間的磁盤速度差異。在兩個系統中是否有相同類型的驅動器,例如: SSD,SATA與SCSI,主軸速度和緩存等等?在IO方面你的環境是完全不同的。桌面Windows和VMWare將使用積極的磁盤緩存,而您的生產Linux機器可能會在安全方面出錯,並等待更頻繁地將數據提交到磁盤。也許Windows機器的驅動程序更適合於它所具有的磁盤類型,而服務器運行時沒有進行優化?文件系統差異也很大,硬件可能不同,足以導致IO速度的顯着差異。你也可能在CPU和RAM速度上有很大的差異。現在的臺式機通常更關注原始速度,而服務器硬件則更多地關注可靠性。您最瞭解您的設置,因此您可以在硬件性能方面比較兩個系統。
除此之外,這裏是你如何能找出什麼是真正回事:
首先,寫一個MWE測試記錄。你應該立足在你真正的代碼,並以類似的方式使用日誌記錄,但這裏有一個小例子:
import logging
logging.basicConfig(filename="test.log", level=logging.DEBUG)
logger = logging.getLogger("testlogger")
for i in range(0, 1000000):
logger.info("iteration: %d", i)
那麼無論是在你的開發和生產機器運行CPROFILE下的腳本。一定要登錄到與問題案例相同的文件系統,否則結果將不適用。
python -m cProfile testlogging.py
你會得到輸出,看起來像這樣:
57000501 function calls in 137.072 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.000 0.000 UserDict.py:4(__init__)
1 0.000 0.000 0.000 0.000 __init__.py:1044(_fixupParents)
1 0.000 0.000 0.000 0.000 __init__.py:1085(Logger)
2 0.000 0.000 0.000 0.000 __init__.py:1100(__init__)
1 0.000 0.000 0.000 0.000 __init__.py:1112(setLevel)
..... ..... ..... ..... ..... ...............................
這應該給你是什麼原因造成上機生產緩慢的想法。需要特別注意的事項:
- 查找行
{method 'write' of 'file' objects}
和{method 'flush' of 'file' objects}
。這將告訴你Python花了多少時間寫入文件並將數據刷新到磁盤 - 在本例中是日誌文件。這兩臺機器之間是否存在重大差異?如果是這樣,這絕對是IO(磁盤)速度的差異。然後,您應該查看服務器的磁盤設置,並查看是否有任何可以獲得更好磁盤性能的方法。
- 查找第一列
percall
列特別大的行。此列是該功能花費的總時間除以該功能的調用次數。比較兩臺機器,你可能會發現是什麼導致了這種差異。
- 查找
tottime
列特別大的行。此列是該功能花費的總時間。再次比較兩臺機器,您可能會發現速度差異的一些原因。
如果您發現磁盤IO似乎是問題,那麼您可以使用原始寫入文件來執行額外的測試。你可以找到一個基準測試程序,讓你測試磁盤吞吐量,但你也可以寫一個簡單的C(或Python)程序,將未格式化的數據寫入文件,以確保它是純粹的磁盤性能,這是不同之處。性能測試就像編程一樣,是藝術,科學和工程的混合體,儘管您可以遵循的模式和建議,但每種情況都需要一點創造力才能破解。所以,嘗試一下,確保你不會自欺欺人,玩得開心!祝你好運!
你可以發佈兩個python的版本 – 2012-07-11 19:53:22
你也可以檢查兩臺機器上使用完全相同的記錄器。 ['logging_tree'](http://pypi.python.org/pypi/logging_tree/1.1)包在那裏很有用。 – 2012-07-11 19:55:09
你可以嘗試登錄到標準輸出而不是文件,並檢查速度是否改變。可能是硬盤的問題。 – 2012-07-11 19:56:27