簡體   English   中英

如何正確基准化Python腳本連接到Redis所需的時間?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM