本文从一下三方面来描述DNS虚拟用户的制作:
l 使用的工具
l 脚本中关键的语句
l 工具关键配置
名称:loadrunner9.0
License:golba
协议:ALL protocolsàDomain name resolution(DNS)
Note:lr的DNS协议是一个低级别的协议。DNS协议模拟用户访问域名服务器来解析主机名称与IP地址。使用此协议需要手动的修改lr自动生成的脚本文件而不是通过录制来获得脚本。
在lr中,当选择新建了DNS协议得虚拟用户后,lr自动生成4个文件vuser_init,action,vuser_end,globals.h.
其中唯一不同是action部分自动添加如下脚本:
#include "mic_socket.h"
// -------------------------------------------------------------------------------
// DNS - Domain Name Service Vuser
// This virtual user script. is designed to test hostname resolution against
// DNS servers. If a host address resolves to multiple addresses, all
// addresses are displayed in the output.
//
// Usage Notes:
// {DnsServer} - IP Address of a Domain Name Server
// {Hostname} - Name of host to resolve IP address for
//
// -------------------------------------------------------------------------------
Action()
{
char *results = NULL;
int rescnt = 0;
lr_save_string("199.35.107.2","DnsServer"); // Set DNS server IP Address
lr_save_string("www.merc-int.com", "Hostname"); // Set hostname to resolve
// Perform. DNS Query(执行dns查询)
results = (char *) ms_dns_query("DnsQuery",
"URL=dns://{DnsServer}",
"QueryHost={Hostname}",
LAST);
// List all the results... (if more than one)(打印查询结果)
while (*results) {
rescnt++;
lr_log_message(
lr_eval_string("(%d) IP address for {Hostname} is %s"),
rescnt,
results);
results = (char *) ms_dns_nextresult(results);
}
return 0;
}
我们可以按照其中的提示建立两个参数文件:
{ DnsServer }:需要测试的目标DNS服务器的ip地址
{Hostname}:需要DNS解析的ip地址。
函数 | 说明 |
ms_dns_query | 这个函数使用dnsserver中指定的dns服务器来解析hostname中的域名。(This function does not automatically add the domain to the hostname —you need to include it explicitly.)上面这句英文不十分理解 |
ms_dns_nextresult | ms_dns_query会返回一个指向一组域名和其ip地址的列表的指针。ms_dns_nextresult函数就是来将这个指针往下移动一格的。 |
很明显
while (*results) {
rescnt++;
lr_log_message(
lr_eval_string("(%d) IP address for {Hostname} is %s"),
rescnt,
results);
results = (char *) ms_dns_nextresult(results);
}
这段是用来把获得的解析结果写到日志里面的。在场景中可以考虑忽略掉这句话以获得更集中的压力。经过测试去掉这句话可以提升大约23%的请求速度。可以通过在场景的run time setting选择send messages only when an error occurs来关闭lr_log_message。
Log配置
假设在脚本调试时需要知道返回的解析内容是否正确,那么按照自动生成的脚本中的样子打印日志。执行后的日志会显示在控制台和output.txt文件中。需要注意的是vugen的run time setting选择always send message。
如果在执行场景后需要知道返回的解析内容是否正确,那么按照自动生成的脚本中的样子打印日志。执行后的日志会记录在res文件夹的log子目录中下的txt文件中。需要注意的是controller的run time setting选择always send message。问题是这样会有N多的日志被记录在那里,影响执行效率的同时也不利用后期的查看。代替方案是使用lr_error_message代替原来脚本中的lr_log_message。此函数的效果是在抛出一个错误。你可以在controller的sencrio status中看到这些error。同样的你可以在执行后的res目录中寻找output.mdb。其中的errormessage表中看到这些输出。(errormessage表不重复记录)。
结果补充:
TTL是 Time-to-live的缩写,即有效期或生存期,用来表明域名--IP对应关系在多长时间内有效,过了有效期就要重新去查询。
TTL时间越长,缓存时间越长,更新越不容易及时生效。
TTL设置的小一些,生效时间就会快一些,像门户通域名托管用户的TTL设置都是30秒,这样做的好处有很多,但是对门户通服务的要压力大一些。