2012-07-11 206 views
6

使用完全相同的代碼,每次調用服務器上的記錄器方法(例如logger.debug)時,大約需要50ms,而在開發機器上調用時間不到1ms。記錄器正在輸出到文件,並帶有一點格式。在Linux服務器上Python的日誌記錄速度非常慢......但在Linux開發VM上很快?

除了日誌記錄的減速之外,服務器速度是其兩倍。

我正在使用Windows 7的VMWare內部運行的Ubuntu 11.04(Gnome)進行開發。服務器運行Ubuntu Server 11.04(無GUI,純控制檯)。日誌模塊是官方的「logging」模塊(「import logging ... logger = logging.getLogger('mylogger')」)。

任何想法可能會造成這種情況?這是非常令人沮喪的!

感謝您的幫助!

編輯:兩臺機器的版本都返回「Python 2.7.1+」。兩臺機器都運行64位Ubuntu。

硬盤配置服務器是軟件RAID-1,而在開發電腦只是一個單一的驅動器。

EDIT2:接受了Fabian的回答,因爲這是徹底的,儘管它並沒有很好的解決問題。

解決方案:寫入控制檯的時間段非常緩慢。我測試了將X寫入文件,並將X寫入控制檯,並且它比控制檯慢了約100倍。我不知道爲什麼會這樣,但我只是用另一臺電腦上運行的ssh來解決問題。

+0

你可以發佈兩個python的版本 – 2012-07-11 19:53:22

+0

你也可以檢查兩臺機器上使用完全相同的記錄器。 ['logging_tree'](http://pypi.python.org/pypi/logging_tree/1.1)包在那裏很有用。 – 2012-07-11 19:55:09

+1

你可以嘗試登錄到標準輸出而不是文件,並檢查速度是否改變。可能是硬盤的問題。 – 2012-07-11 19:56:27

回答

6

正如評論中指出的,一個可能的原因是開發虛擬機和生產機器之間的磁盤速度差異。在兩個系統中是否有相同類型的驅動器,例如: 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)程序,將未格式化的數據寫入文件,以確保它是純粹的磁盤性能,這是不同之處。性能測試就像編程一樣,是藝術,科學和工程的混合體,儘管您可以遵循的模式和建議,但每種情況都需要一點創造力才能破解。所以,嘗試一下,確保你不會自欺欺人,玩得開心!祝你好運!

相關問題