[英]How to correctly benchmark the time it takes for a Python script to connect to Redis?
最近,我被分配了一項任務,以測試Python連接到Redis所需的時間。 目的是查看在創建新連接時使用連接池是否有任何意義。
我以為任務很簡單,我嘗試了很多情況,但是,我經常被告知我的測試是完全錯誤的,所以我不知道該怎么做。
注意: 我對Python還是比較陌生,我還沒有掌握很多與此語言有關的知識,所以我沒有太多經驗。
我的第一次嘗試是我想到的最簡單的基准測試方法。 這是我對每次創建新連接的腳本的嘗試:
#!/usr/bin/env python3
import redis
import timeit
from datetime import datetime
def main():
connection = redis.StrictRedis(host='localhost', port=6379, db=0)
start_time = datetime.now()
timeit_results = timeit.timeit("main()", setup="from __main__ import main", number=5000)
time_taken = datetime.now() - start_time
print("Timeit results: {}".format(timeit_results))
print("Datetime results: {}".format(time_taken))
並使用連接池測試所需的時間:
#!/usr/bin/env python3
import redis
import timeit
from datetime import datetime
pool = redis.ConnectionPool(host='localhost', port=6379, db=0)
def main():
connection = redis.StrictRedis(connection_pool=pool)
start_time = datetime.now()
timeit_results = timeit.timeit("main()", setup="from __main__ import main", number=5000)
time_taken = datetime.now() - start_time
print("Timeit results: {}".format(timeit_results))
print("Datetime results: {}".format(time_taken))
有人告訴我這些測試是錯誤的。 所以我認為我需要先手動關閉連接。 但是,由於我正在使用StrictRedis
,因此(在文檔中)找不到手動關閉連接的方法,因此我在Google上搜索並發現StrictRedis.client_pool.disconnect()
將是解決方案。
因此,我想檢查它是否真的有效,並通過以下方式進行檢查:
interface = redis.StrictRedis(host='localhost', port=6379, db=0)
def main():
connection = redis.StrictRedis(host='localhost', port=6379, db=0)
connection.connection_pool.disconnect()
print("Open connections during test: {}".format(len(interface.client_list())))
start_time = datetime.now()
timeit_results = timeit.timeit("main()", setup="from __main__ import main", number=10)
time_taken = datetime.now() - start_time
print("Timeit results: {}".format(timeit_results))
print("Datetime results: {}".format(time_taken))
從中我得到以下結果:
Open connections during test: 2
Open connections during test: 3
Open connections during test: 4
Open connections during test: 5
Open connections during test: 6
Open connections during test: 7
Open connections during test: 8
Open connections during test: 9
Open connections during test: 10
Open connections during test: 11
這似乎很奇怪,並且要檢查client_list()
是否確實返回了我想要的正確內容,我對實際上可以關閉的連接(在main()
函數中)進行了測試:
connection = redis.Connection(host='localhost', port=6379, db=0)
connection.connect()
connection.disconnect()
print("Open connections during test: {}".format(len(interface.client_list())))
哪個返回:
Open connections during test: 1
Open connections during test: 1
Open connections during test: 1
Open connections during test: 1
Open connections during test: 1
Open connections during test: 1
Open connections during test: 1
Open connections during test: 1
Open connections during test: 1
Open connections during test: 1
因此,它確實有效。 而且由於StrictRedis.connection_pool.disconnect()
無法正常工作,我只是以為StrictRedis
連接無法關閉,它會自動關閉。
但是,然后我被告知,有一種方法可以關閉StrictRedis
連接,而我必須這樣做。 后來,我得到提示,我需要在第一次測試中避免使用連接池,並且在源代碼中我看到StrictRedis
實際上為自己創建了一個連接池,盡管我不太了解。
題:
如何正確基准測試腳本連接到Redis所需的時間?
更新 :
我嘗試通過redis.Connection
測試連接,因為它實際上沒有使用連接池(或者至少我無法使用一個連接池),也沒有使用本地的另一台服務器上的redis服務器。網絡:
#!/usr/bin/env python3
import redis
from datetime import datetime
import timeit
test_num = 5000
def timefunc():
connection = redis.Connection(host='10.**.**.**', port=6379, db=0)
connection.connect()
connection.disconnect()
timeit_result = timeit.timeit("timefunc()", setup="from __main__ import timefunc", number=test_num)
print("Timeit result (total): {}".format(timeit_result))
print("Timeit result (average): {}".format(timeit_result / test_num))
現在這是我認為正確的測試。 但是,我不確定,因為每次運行腳本時,都會產生完全不同的結果:
Test 1:
Timeit result (total): 3.4030799390748143
Timeit result (average): 0.0006806159878149628
Test 2:
Timeit result (total): 2.9527969888877124
Timeit result (average): 0.0005905593977775425
Test 3:
Timeit result (total): 6.543300905032083
Timeit result (average): 0.0013086601810064166
Test 4:
Timeit result (total): 21.31216992996633
Timeit result (average): 0.004262433985993266
Test 5:
Timeit result (total): 5.312907374929637
Timeit result (average): 0.0010625814749859273
這些測試顯示出非常奇怪的結果。 每次運行測試之前,我每次都要重新啟動redis-server
,但現在我跪下來尋求幫助,因為我不知道我在做什么錯,為什么會這樣。
回到原來的問題..
這些結果正常嗎?為什么? 這是我應該對連接進行基准測試的正確方法嗎?
python版本 :3.5
Redis服務器版本 :3.2.6
提前致謝。
說到Redis,通常討論保留1個共享連接或連接池。 每次打開和關閉連接的成本都非常高,請不要這樣做。 如果您想每次都打開和關閉連接,而無需測量,則池將贏得大量時間。
關於您的測試,很難說您做得是否正確,因為您要測量的是一個黑匣子。 誰知道它在引擎蓋下做什么。 從這里開始,您有兩種方法:深入研究庫或不衡量連接時間,而是使用一種或另一種方法衡量應用程序的性能。 我建議衡量在有池和無池的情況下進行有用的操作。
但是,再次,放棄了為每個操作打開和關閉連接的想法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.