使用WebPolygraph测试缓存系统(上篇)

叁叁肆2018-09-19 14:42

本文来自网易云社区

作者:孙建良


一、   概述

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)的模拟

• 服务端包含的数据内容

• 连接控制

• 模拟测试源服务器的响应时间

……

4Phase 的模拟

• 访问强度

• 访问命中率

• 对 polyclient 行为(workload)进行分阶段的差异化控制

……

WebPolyGraph 定义了自己的 PGL 语言去对以上四个方面的内容进行控制,(psPGL 语言使得 WebPolyGraph 相比于其他 benchmark 工具更加 flexible 更加powerful,但是也使得 WebPolyGraph 对于 beginner 更加难以上手。以下第 2 部分到第 7 部分详细介绍 PGL 控制的各个方面,若想先体验,可以直接跳到第 8 部分。

PGL 的基本规则参考:http://www.web-polygraph.org/docs/reference/pgl/


二、   Content 内容生命周期控制

实际上,真实的 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 的生命结束,新生命的开始)


2.1 PGL

ObjLifeCycle {

time_distr birthday; //对象的创建时间

time_distr length; //生命周期,life cycle

float variance; //对 length 的控制

float with_lmt; //包含 last modify time 的比例

time_distr [ ] expires; //expire 模式}


2.2 示例内容

1Monthly E-Zine Server

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 小时过期

];

};

2Static Objects(静态对象生命周期)

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 部分用于控制请求内容大小,内容能够进行缓存的比例,对象的生命周期,过期模式等。

3.1 PGL

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

}


3.2 示例

1simple content

Content SimpleContent = {

size = exp(35KB); // size服从均值为35KB的指数分布

cachable = 100%; // 100%的数据可以进行缓存

checksum = 1%; //1%的数据包含checksum

};

2object life cycle for "Image" content

Content cntImage = {

kind = "image";

mime = { type = undef(); extensions = [ ".gif", ".jpeg", ".png" ]; };

obj_life_cycle = olcImage;

size = exp(9KB);

cachable = 80%;

checksum = 1%;

};


四、   Poly server

对服务端包含的数据内容,模拟测试源服务器的响应时间的配置,服务端的连接控制等方面内容。

4.1 PGL

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连接的时长

}


4.2 示例:

1:简单server配置

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
};

2

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连接关闭的时限
};


五、   Poly client simulation

服务器地址(源服务器,目的服务器),线程数(模拟客户端个数),请求相关(请求类型,请求强度,访问的基本模式),Client 服务器相关内容(长连接与否,打开连接数限制等)。


5.1 PGL

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

}


5.2 示例

示例 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 )

示例 3paper 给的一个基准模式

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+款云产品!

更多网易研发、产品、运营经验分享请访问网易云社区