用于负载测试的重放日志 - 是否有任何工具模拟请求之间的实际用户时间?

时间:2012-04-30 06:18:05

标签: jmeter load-testing performance-testing apachebench

我需要使用模拟用户负载加载测试网站。为此,我打算记录一个普通用户给定10分钟使用情况的Web服务器日志,并使用它来重放多个并发线程以模拟实际负载。

以下是我查看和拒绝的工具:

Apache基准 ...可以将其编程为使用哑请求命中服务器...但无法模拟用户负载。

HTTPerf - 可以将用户日志作为输入来模拟普通用户,但只使用日志中的请求URL ...而不是请求次数。

Tsung - 与HTTPerf相同的问题......我可以录制用户会话......但我还是要为用户“思考”时间编程......

JMeter 可以将用户会话日志作为输入..不知道它是否可以模拟包含“思考”时间的用户会话。

总结......有一堆工具会给我“日志重播”,但他们似乎都只使用日志来收集请求URL来模拟用户会话。他们都没有真正使用时间戳来模拟真实用户和他们的“思考”时间。

  1. JMeter似乎是我没有尝试过的唯一工具。 JMeter会解决这个问题吗?
  2. 通过在我的服务器日志上使用sed / awk并创建ruby脚本来解析请求URL和“思考”时间然后启动并发线程,这是否更容易解决?
  3. 欢迎任何其他建议。

6 个答案:

答案 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来描述你正在寻找的东西。

https://www.blazemeter.com/blog/stop-making-assumptions-learn-how-replay-your-production-traffic-jmeter

(诀窍是使用BeanShell计时器与您的日志具有相同的请求间隔)