4

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

这是我查看并拒绝的工具:

Apache benchmark ...可以对其进行编程以通过愚蠢的请求访问服务器...但不能模拟用户负载。

HTTPerf - 可以将用户日志作为输入来模拟普通用户,但只使用来自日志的请求 URL……而不是请求时间。

Tsung - 与 HTTPerf 相同的问题...我可以记录用户会话...但我仍然必须对用户“思考”时间进行编程...

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

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

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

也欢迎任何其他建议。

4

6 回答 6

1

再次投票给 JMeter,它是满足您需求的好工具。但是,不管使用哪种工具,请谈谈您的方法:遗憾的是,实际上不可能仅将工具指向网络服务器日志并获得有效的负载测试作为回报。日志中存储的数据不足以为您提供这些数据(除非您的所有页面都是完全静态的)。

但这并不难,重要的是确定您希望您的站点支持的峰值吞吐量(请求/秒),并使用节奏(计时器)和用户(线程)来构建代表这一点的测试。使用 JMeter,恒定吞吐量计时器对此特别有用。

笔记。正确获得这个峰值吞吐量水平很重要,否则您最终会导致负载过高(您浪费时间解决不是问题的问题)或过低(您找不到真正的问题)但是如果您已经拥有显示站点使用情况的访问日志,那么稍微保守一点,这应该不是问题。

于 2012-05-05T15:52:44.980 回答
1

JMeter 能够在您的测试计划中注入恒定和随机的细节,请查看4.4 Timers,尤其是18.6 Timers

  • 恒定定时器

  • 高斯随机定时器

  • 统一随机定时器

  • 恒定吞吐量定时器

  • 同步定时器

  • 豆壳定时器

  • BSF 定时器

  • JSR223 定时器

  • 泊松随机定时器

于 2012-04-30T07:02:50.043 回答
1

有一个类似的问题 - 需要一个工具来重播生产服务器的日志,保持所有间隙不变。另外,想操纵一些http标头。

作为系统管理员,首先使用 ab 在 bash 上编写脚本。速度上不是很好。

如果 Jmeter 易于使用,它就很棒。

因此,最终编写了自己的工具来通过重播日志来进行负载测试。它是用红宝石写的。考虑到任何重播日志的工具大部分时间都花在网络 io 等待上,而不是在 cpu 上,ruby GIL 应该不是问题。它是多线程的,按原样重播日志,尊重日志条目之间的间隙,如果你有的话:)

如果您正在运行 varnish,您还可以使用 varnishncsa 实时回放。可以上github:https ://github.com/maxchk/grad

希望这可能会有所帮助。

于 2013-09-17T01:30:12.803 回答
1

我通过使用芹菜解决了这个问题。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

使用 运行管理命令manage.py my_command /path/to/file.log

于 2016-01-22T09:00:20.367 回答
0

聚会迟到了,但这个例子似乎准确地描述了你正在寻找的东西,只使用 Jmeter。

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

(诀窍是使用 BeanShell 计时器来获得与日志中相同的确切请求间隔)

于 2018-02-12T13:15:52.657 回答
0

也许戈尔?

Gor 是一个开源工具,用于捕获实时 HTTP 流量并将其重播到测试环境中,以便使用真实数据持续测试您的系统。它可用于增加对代码部署、配置更改和基础架构更改的信心。 https://goreplay.org

否则,关于轰炸机的答案grad似乎也很棒。

于 2016-11-07T00:08:47.180 回答