我需要使用模拟用户负载加载测试网站。为此,我打算记录一个普通用户给定10分钟使用情况的Web服务器日志,并使用它来重放多个并发线程以模拟实际负载。
以下是我查看和拒绝的工具:
Apache基准 ...可以将其编程为使用哑请求命中服务器...但无法模拟用户负载。
HTTPerf - 可以将用户日志作为输入来模拟普通用户,但只使用日志中的请求URL ...而不是请求次数。
Tsung - 与HTTPerf相同的问题......我可以录制用户会话......但我还是要为用户“思考”时间编程......
JMeter 可以将用户会话日志作为输入..不知道它是否可以模拟包含“思考”时间的用户会话。
总结......有一堆工具会给我“日志重播”,但他们似乎都只使用日志来收集请求URL来模拟用户会话。他们都没有真正使用时间戳来模拟真实用户和他们的“思考”时间。
欢迎任何其他建议。
答案 0 :(得分:1)
JMeter能够在您的测试计划中注入持续和随机的详细信息,请查看4.4 Timers ,尤其是18.6 Timers:
Constant Timer
高斯随机定时器
统一随机定时器
恒定吞吐量计时器
同步计时器
BeanShell计时器
BSF计时器
JSR223计时器
泊松随机定时器
答案 1 :(得分:1)
有一个类似的问题 - 需要一个工具来重放生产服务器上的日志,保持所有的差距。另外,想要操纵一些http标题。
作为系统管理员,首先使用ab编写bash脚本。速度不是很快。
只要它使用简单,Jmeter就很棒。
因此,最后编写自己的工具来通过重放日志来加载测试。 它是用红宝石写的。考虑到任何工具重放日志大部分时间都在网络中等待,而不是在cpu中,ruby GIL应该不是问题。 它是多线程的,按原样重放日志,尊重日志条目之间的差距,如果你有一些:)
如果你有清漆运行,你也可以用varnishncsa实时重播。 你可以上github:https://github.com/maxchk/grad
希望这可能会有所帮助。
答案 2 :(得分:0)
JMeter的另一次投票,它是您需要的好工具。但是,无论使用哪种工具,您的方法都可以说:遗憾的是,实际上不可能只是将工具指向Web服务器日志并获得有效的负载测试。日志中没有足够的数据存储在您的日志中(除非您的所有页面都是完全静态的)。
但它并不是那么难,重要的是要确定您希望站点支持的峰值吞吐量(请求/秒),并使用调步(计时器)和用户(线程)来构建代表此的测试。使用JMeter,恒定吞吐量计时器对此特别有用。
请注意。重要的是要使这个峰值吞吐量水平正确,否则你最终会得到一个太高的负载(你浪费时间解决不是问题的问题)或者太低(你没有发现问题是真正的问题)但是如果您已经拥有显示网站使用情况的访问日志,那么稍微保守一点,这应该不是问题。
答案 3 :(得分:0)
我用Celery解决了这个问题。 Celery本质上将产生异步工作者,这是你需要的。任务还可以进行倒计时"参数,以便您可以安排请求。
任务很简单:
import requests
from celery.task import task
@task(max_retries=0, ignore_result=True)
def get_url(url, user_agent):
headers = {"User-Agent": user_agent}
try:
r = requests.get(url, headers=headers)
except requests.ConnectionError:
print "Couldn't fetch %s" % url
我使用Django的管理命令系统来解析日志,因为我不想在普通的Python环境中学习如何与Celery交谈。您的日志格式可能不同,因此需要进行调整。 management/commands/my_command.py
的部分内容(感谢质量 - 我很匆忙):
import sys
import csv
import dateutil
from django.core.management.base import BaseCommand, CommandError
from django.utils import timezone
class Command(BaseCommand):
def handle(self, *args, **options):
now = timezone.now()
URL_PREFIX = "http://my.site.com"
pth = sys.argv[-1]
fp = open(pth, "r")
fieldnames=[
"ip",
"dc1",
"cache_result",
"datetime_a",
"datetime_b",
"request_time",
"upstream_time",
"dc2",
"path_raw",
"status_code",
"size_bytes",
"header_url",
"user_agent"
]
reader = csv.DictReader(fp, fieldnames=fieldnames, delimiter=" ", quotechar='"')
reader = list(reader)[-1000:]
fp.close()
processed = []
first_diff = None
for row in reader:
method, url, b = row["path_raw"].split()
if method.lower() not in ("get", "head"):
continue
sent_raw = "%s %s:%s:%s" % tuple(row["datetime_a"].lstrip("[").split(":"))\
+ " " + row["datetime_b"].rstrip("]")
sent = dateutil.parser.parse(sent_raw)
if first_diff is None:
first_diff = (now - sent).seconds + 1
get_url.apply_async(
(URL_PREFIX + url, row["user_agent"]),
countdown=first_diff - (now - sent).seconds
)
使用manage.py celery worker -B --loglevel=info
启动Celery。
使用manage.py my_command /path/to/file.log
运行管理命令。
答案 4 :(得分:0)
也许是gor?
Gor是一个用于捕获和重放实时HTTP的开源工具 流入测试环境以便不断测试你的 系统与真实数据。它可用于增加代码的可信度 部署,配置更改和基础结构更改。 https://goreplay.org
否则关于grad
轰炸机的答案似乎也很棒。
答案 5 :(得分:0)
派对晚了,但是this example似乎只是使用Jmeter来描述你正在寻找的东西。
(诀窍是使用BeanShell计时器与您的日志具有相同的请求间隔)