本文来自网易云社区
作者:孙建良
Web Polygraph 是专门为缓存服务器、代理服务器等设计的测试工具。它具有比较完整的测试用例(比如专门为正向代理和反向代理的测试用例)。另外,它还有一套专门的description language (PGL),可以让测试者来定制测试用例。它的测试结果的呈现也是比较强大的,可以在测试的时候指定 log 路径,并对数据进行分析和整理,然后通过 Web 页面的方式呈现。
Polygraph 提供 Client 端和 Server 端,将测试目标 ATS/Nginx 放在二者之间,三者之间的网络交互均走 HTTP 协议,只需配置 ip + port 即可。Client 端可以配置虚拟 robot 的个数以及每个 robot 发请求的速率,并向代理服务器发起随机的静态文件请求,Server 端将按照请求的 URL 生成随机大小的静态文件做响应。还有很大一个连点是 Web Polygraph 提供了非常多的数学分布模型,常量分布,线性分布,指数分布,正态分布,zipF 分布等。使用这些分布去控制 server 的响应时间,写请求大小的分布,控制访问行为模型为 2-8 模型,控制客户端的请求的达到等等。可以方便得组合这些数学模型设计更加适合于实际应用场景的workload。另外 WebpolyGraph 还支持一定程度的插件编程功能,其插件主要功能是自定义HTTP 的头部等(参考:http://www.web-polygraph.org/docs/reference/modules.html)。
WebpolyGraph 主要分为以下四个方面的内容:
(1)对 web 请求内容的模拟
• 请求内容大小
• 缓存比例
• 对象的生命周期,过期模式
• …
(2)对客户端(polyclient)访问的模拟
• 服务器地址(源服务器,目的服务器)
• 线程数(模拟客户端个数)
• 请求相关(请求类型,请求强度,访问的基本模式)
• Client 服务器相关内容(长连接与否,打开连接数限制等)• ……
(3)对服务端(polyserver)的模拟
• 服务端包含的数据内容
• 连接控制
• 模拟测试源服务器的响应时间
• ……
(4)Phase 的模拟
• 访问强度
• 访问命中率
• 对 polyclient 行为(workload)进行分阶段的差异化控制
• ……
WebPolyGraph 定义了自己的 PGL 语言去对以上四个方面的内容进行控制,(ps:PGL 语言使得 WebPolyGraph 相比于其他 benchmark 工具更加 flexible 更加powerful,但是也使得 WebPolyGraph 对于 beginner 更加难以上手。以下第 2 部分到第 7 部分详细介绍 PGL 控制的各个方面,若想先体验,可以直接跳到第 8 部分。
PGL 的基本规则参考:http://www.web-polygraph.org/docs/reference/pgl/
实际上,真实的 web server 也不能预测将来内容的修改时间,因此在大部分情况下,server 按照常规经验设置对象的过期时间。一个服务器通常通过基本的配置参数生成对象过期时间。通常情况下,可以通过以下方式以下两种方式计算对象的过期时间:
Expiretime 模式:
Expiretime = last modification time + some constant delta
Expiretime = current time + some constant delta
Object Modification Times 解释:
Polygraph assumes that Web objects or entities have a cyclic life style. That is,modifications happen with certain periodicity.(Polygraph 定义 web 对象实体的生命周期,修改发生时,old 的生命结束,新生命的开始)
ObjLifeCycle {
time_distr birthday; //对象的创建时间
time_distr length; //生命周期,life cycle
float variance; //对 length 的控制
float with_lmt; //包含 last modify time 的比例
time_distr [ ] expires; //expire 模式}
ObjLifeCycle olcZine = {
length = const(30day); //生命周期为常量 30 天
variance = 2%; //对上面的 length 的控制,变数 2%
with_lmt = 90%; //90%包含 last modify time
expires = [
nmt : 75%, // 75%在下一周期过期
now + norm(1hour, 20min) : 10% //10%在获取之后 1 小时过期
];
};
ObjLifeCycle olcStatic = {
length = const(2year); //两年
variance = 0%; // no variance
with_lmt = 100%; // all responses have LMT header
expires = [nmt + const(0sec)]; // everything expires when modified
};
Content 部分用于控制请求内容大小,内容能够进行缓存的比例,对象的生命周期,过期模式等。
Content{
Float checksum ; //使用MD5校验的数据的比例
size_distr size; //数据长度的分布
Float cachable; //能进行cache数据的比例
Float ObjLifeCycle ; //控制内容的生命周期
Content [ ] may_contain; //控制嵌套内容(模拟网页嵌套内容)
int_distr embedded_obj_cnt
int choice_space
ClientBehavior client_behavior
string content_db
string inject_db
size_distr inject_gap
float infect_prob
string [ ] encodings
}
Content SimpleContent = {
size = exp(35KB); // size服从均值为35KB的指数分布
cachable = 100%; // 100%的数据可以进行缓存
checksum = 1%; //1%的数据包含checksum
};
Content cntImage = {
kind = "image";
mime = { type = undef(); extensions = [ ".gif", ".jpeg", ".png" ]; };
obj_life_cycle = olcImage;
size = exp(9KB);
cachable = 80%;
checksum = 1%;
};
对服务端包含的数据内容,模拟测试源服务器的响应时间的配置,服务端的连接控制等方面内容。
Server{
string Kind //server的名称
Content Contents //server能够产生的内容
Cotent direct_access //server能够直接进行访问的内容
addr[] addresses //server监听的地址和端口;
time_distr xact_think //server处理请求延迟时间,用以模拟实际源服务器
int_distr pconn_use_lmt //用于控制长连接
time idle_pconn_tout //控制要进行关闭的idle连接的时长
…
}
Server S = {kind = "S101"; //server名称 S101
contents = [SimpleContent]; //包含内容(见第三节Content中示例)
direct_access = contents; //能够进行直接访问的内容
pconn_use_lmt = const(2147483647); //开启长连接
addresses = ['172.17.2.201:9099']; //poly server地址'172.17.2.201,监听端口9099
};
Server S = {
kind = "WebAxe-1-srv";
contents = [ cntImage];
direct_access = [ cntImage];
xact_think = norm(0.3sec, 0.1sec); //server响应时间为均值0.3sec的正态分布
pconn_use_lmt = zipf(16); //连接长短为均值16的zipf分布
idle_pconn_tout = 15sec; //idle连接关闭的时限
};
服务器地址(源服务器,目的服务器),线程数(模拟客户端个数),请求相关(请求类型,请求强度,访问的基本模式),Client 服务器相关内容(长连接与否,打开连接数限制等)。
Robot
{
//服务器地址相关
addr [ ] origins //配置源服务器地址
addr [ ] http_proxies //配置 http proxy 服务器地址
addr [ ] ftp_proxies
addr [ ] addresses //指定 robot client 的地址
addr [ ] socks_proxies //以下三项是于 sock proxy 相关的几个配置
floatsocks_prob
floatsocks_chaining_prob
//请求相关
string [ ] req_types
string [ ] req_methods //定义请求的方法(GET,Head,PUT,POST)
rate req_rate //请求的速度
time_distr req_inter_arrival /*请求的达到方式的分布(默认是以 req_rate 为均值的泊松分布),这个参数定义自己想要的分布方式
req_rate | req_inter_arrival 用于定义自己想要的访问强度,与请求到达模式,如果两者都不定义,则为 best effort模式,收到前一个请求的响应直接发下一个请求。*/
float recurrence /*控制命中率,控制生成 URL 的重复率(往往高于实际命中率,因为很多对象可能是不能缓存,或缓存过期等因素)*/
float embed_recur //控制内嵌对象的命中率
float public_interest //废弃了。
string [ ] interests
string foreign_trace
/*用于控制多 Robot 之间的 URL 相关性,private 表示相互独立,public 表示可以共享,foregin 指定我们指定的 URL(从文件中获取)
例如:
interests = [ "foreign": 1%, "public": 74%, "private" ];
foreign_trace = "/usr/local/traces/special_sites.urls";
*/
Pop_model pop_model: /*选取重复 URL 的模式(和 recurrency 相关联的)
Pop_modle = popUnif(); //离散模式
pop_distr = popZipf(0.6); //2-8 模式
*/
int private_cache_cap
bool unique_urls
//控制 client 服务器连接响应等行为
int_distr pconn_use_lmt /*这个字段用于控制长连接
default: const(1):长连接关闭
const(2147483647):长连接开启*/
DnsResolver dns_resolver //指定 web polygraph 使用的 DNS 服务器
int open_conn_lmt //一个 robot 最大同时打开的连接数
float_distr pipeline_depth //长连接上请求的最大深度
int wait_xact_lmt //控制处理一个请求的延迟时间
float minimize_new_conn
Session session
string [ ] user_names
int icp_port
addr peer_http
addr peer_icp
float_distr cookies_keep_lmt
string [ ] accept_content_encodings
float spnego_auth_ratio
Range [ ] ranges
float req_body_pause_prob
size req_body_pause_startfloat passive_ftp
}
示例 1:best effort 模式(得到上一个请求响应之后才发送下一个请求)
Robot R = {
kind = "R101";
pop_model = { pop_distr = popZipf(0.6); }; //数据重复数据的方式为 zipf 分布
recurrence = 80% / SimpleContent.cachable; // 产生 URL 重复比例为 80%
origins = S.addresses; // poly server 地址
pconn_use_lmt = const(2147483647); //开启长连接
addresses = ['172.17.4.112'**100 ]; //指定 polyclient 地址,并指定线 100 个
};
示例 2:指定基准(指定发送请求的频率)
Robot R = {
kind = "R101";
pop_model = { pop_distr = popZipf(0.6); };
recurrence = 80% / SimpleContent.cachable
origins = S.addresses; // where the origin servers are
req_rate = 4/sec;
pconn_use_lmt = const(2147483647);
addresses = ['172.17.4.112'**1000 ]; // where these robot agents will be created
};
以上配置的目标 TPS 为 4000/sec = ( 1000(线程数)* 4/sec )
示例 3:paper 给的一个基准模式
Robot R = {
kind = "WebAxe-1-rbt";
origins = srv_ips;
recurrence = 95%;
embed_recur = 100%;
interests = [ "public": 90%, "private" ];
pop_model = { pop_distr = popUnif(); };
req_rate = 1/sec;
req_types = ["Basic": 70%,"Ims200": 10%,"Ims304": 10%,"Reload"];
req_methods = ["POST","GET": 70%,"HEAD"];
post_contents = [contentims];
pipeline_depth = zipf(13%);
pconn_use_lmt = zipf(64);
open_conn_lmt = 4; // open connections limit
http_versions = [ "1.1" ]; // newer agents use HTTP/1.1 by default
};
网易云免费体验馆,0成本体验20+款云产品!
更多网易研发、产品、运营经验分享请访问网易云社区。