wrk执行Lua脚本

3
我的问题是,当我运行以下代码时:
wrk -d10s -t20 -c20 -s /mnt/c/xxxx/post.lua http://localhost:xxxx/post

Lua脚本只会被执行一次吗?它只会在URL中放置一个项目到数据库中。
-- example HTTP POST script which demonstrates setting the
-- HTTP method, body, and adding a header
math.randomseed(os.time())
number =  math.random()
wrk.method = "POST"
wrk.headers["Content-Type"] = "application/json"        
wrk.body = '{"name": "' .. tostring(number) .. '", "title":"test","enabled":true,"defaultValue":false}'

有没有一种方法可以动态地创建“number”变量,并在“wrk”命令完成其测试之前不断向数据库中添加新项目?或者它将在整个测试期间继续执行脚本,创建和插入新的“number”变量到“wrk.body”中?抱歉,我只是刚刚开始接触Lua。谢谢。

number = math.random替换为number = math.random(),否则所有的number都将是相同的值(并且根本不是数字)。 - Egor Skriptunoff
是的,谢谢。现在有一个数字 = math.random(math.randomseed(os.time()))。 - dawson
math.randomseed(os.time()) 只需要执行一次! - Egor Skriptunoff
@EgorSkriptunoff 你怎么确保它只运行一次? - David Brossard
1个回答

1

当你执行

number = math.random

你没有将number设置为一个随机数,而是将它设置为函数math.random。若要将变量设置为函数返回的值,该行应该写成:

number = math.random()

您可能还需要设置一个随机种子(使用 math.randomseed() 函数和适当的可变参数 - 系统时间是常见的选择),以避免每次运行脚本时 math.random() 返回相同的结果。这应该在第一次调用 math.random 之前完成。
由于脚本很短,系统时间可能不是一个好的种子选择(脚本运行比 os.time() 的值更快改变,因此立即连续运行几次会每次给出相同的结果)。从 /dev/urandom 读取几个字节应该可以得到更好的结果。
您也可以直接使用 /dev/urandom 生成一个数字,而不是将其作为种子提供给 math.random。就像下面的代码中所示,取自 this answer。这不是一个安全的随机数生成器,但对于您的目的来说,它是可以的。
urand = assert (io.open ('/dev/urandom', 'rb'))
rand  = assert (io.open ('/dev/random', 'rb'))

function RNG (b, m, r)
  b = b or 4
  m = m or 256
  r = r or urand
  local n, s = 0, r:read (b)

  for i = 1, s:len () do
    n = m * n + s:byte (i)
  end

  return n
end

嗨,是的,当我打印出值时,我意识到了这一点,现在已经在问题中进行了更改。我的问题更多的是关于在执行“wrk”命令的持续时间内,它是否可能会不断重新执行脚本并插入不同的值? - dawson
这些值取决于种子。由于这是一个短脚本,系统时间可能不足以在运行之间进行变化,因此每次脚本运行时您将得到相同的种子(因此是相同的“随机”数字)。您只需要找到另一种不同的随机种子来源。尝试从/dev/urandom中读取一些内容。 - Chris H
@dawson 我刚刚编辑了答案,加入了一些可能有用的内容。 - Chris H
似乎出现了相同的问题,执行速度比生成速度快。使用上述代码运行了两次,第一次只插入了16个项目,第二次只插入了15个项目,就说它们已经存在了。将进一步研究种子。 - dawson
1
我发现,它会将与 wrk 命令中设置的“-t”相等数量的项目输入到数据库中,之后它会重复使用它们,程序会将它们捕获为已经存在于数据库中。 - dawson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接