1/*
2 * WebAxe-4 workload (the details)
3 *
4 */
5
6/* modifications in this file cause non-compliance with WebAxe rules
7 * all user-specified parameters are in webaxe-4.pg */
8
9
10#include "contents.pg"
11
12
13Server S = {
14	kind = "WebAxe-4-srv";
15
16	contents      = [ cntImage: 65%, cntHTML: 15%, cntDownload: 0.5%, cntOther ];
17	direct_access = [ cntHTML, cntDownload, cntOther ];
18
19	xact_think = norm(0.3sec, 0.1sec);
20	pconn_use_lmt = zipf(64);
21	idle_pconn_tout = 15sec;
22	abort_prob = 0.1%;
23
24	addresses = serverAddrs(asWebAxe4, TheBench);
25	http_versions = [ "1.0" ];  // newer agents use HTTP/1.1 by default
26};
27
28AddrMap Map = {
29	zone = "bench.tst";
30	addresses = S.addresses;
31	names = TheBench.proxy_side.hosts;
32};
33
34// popularity model for the robots
35PopModel popModel = {
36	pop_distr = popUnif();
37	hot_set_frac =  1%;  // fraction of WSS (i.e., hot_set_size / WSS)
38	hot_set_prob = 10%;  // prob. of req. an object from the hot set
39
40	bhr_discrimination = 90%; // revisit smaller files more often
41};
42
43Robot R = {
44	kind = "WebAxe-4-rbt";
45
46	recurrence      =  95%;
47	embed_recur     = 100%;
48	pop_model = popModel;
49
50	req_types = [ "Basic", "Ims200": 5%, "Ims304": 10%, "Reload" : 5% ];
51	req_methods = [ "GET", "POST" : 1.5%, "HEAD" : 0.1% ];
52	abort_prob = 0.1%;
53
54	req_rate = TheBench.client_side.max_agent_load;
55	pconn_use_lmt = zipf(16);
56	open_conn_lmt = 4;
57
58	origins = Map.names;
59	addresses = robotAddrs(asWebAxe4, TheBench);
60	http_versions = [ "1.0" ];  // newer agents use HTTP/1.1 by default
61
62	post_contents = [ cntSimpleRequest ];
63};
64
65
66/* phases */
67
68time platDur = 4hour;      // plateau phases duration (except idle phase)
69time rampDur = platDur/12; // ramp phases duration    (and idle phase)
70
71// limit the growth of the URL "working set" size (WSS)
72int clientHostCount = clientHostCount(TheBench);
73working_set_cap(int(WSS/11KB/clientHostCount));
74
75float smallFactor = 1.0/count(R.addresses);
76
77Phase phFRamp = {
78	name = "framp";
79	goal.duration = rampDur;
80	recur_factor_beg = 5%/55%;
81	special_msg_factor_beg = 0.1;
82	populus_factor_beg = smallFactor;
83	populus_factor_end = FillRate/TheBench.peak_req_rate;
84};
85
86Phase phFill = {
87	name = "fill";
88	goal.fill_size = 2*ProxyCacheSize / clientHostCount;
89	wait_wss_freeze = yes; // will finish only if WSS is frozen
90};
91
92Phase phFExit = {
93	name = "fexit";
94	goal.duration = rampDur;
95	recur_factor_end = 1;
96	special_msg_factor_end = 1;
97	populus_factor_end = smallFactor;
98};
99
100Phase phInc1 = {
101	name = "inc1";
102	goal.duration = rampDur;
103	populus_factor_end = 1;
104};
105
106Phase phTop1 = { name = "top1"; goal.duration = platDur; };
107Phase phDec1 = { name = "dec1"; goal.duration = rampDur; populus_factor_end = 0.1; };
108
109Phase phIdle = { name = "idle"; goal.duration = rampDur; };
110
111Phase phInc2 = { name = "inc2"; goal.duration = rampDur; populus_factor_end = 1.0; };
112Phase phTop2 = { name = "top2"; goal.duration = platDur; };
113Phase phDec2 = { name = "dec2"; goal.duration = rampDur; populus_factor_end = 0; synchronize = false; };
114
115/* collect stats samples in the middle of plateau phases */
116StatsSample topSample = { capacity = 10000; };
117StatsSample fillSample = { capacity = int(10% * topSample.capacity); };
118
119phFill.stats_samples = [ fillSample ];
120phTop1.stats_samples = [ topSample ];
121phTop2.stats_samples = [ topSample ];
122
123// build schedule using some well-known phases and phases defined above
124schedule(
125	phFRamp, phFill, phFExit,
126	phInc1, phTop1, phDec1,
127	phIdle,
128	phInc2, phTop2, phDec2
129);
130
131
132// commit to using these objects
133use(S, R);
134use(Map);
135use(TheBench);
136
137// do not forget to configure network level delay and packet loss!
138// client side: 40msec delay and 0.05% packet loss in both directions
139// server side: no delays or packet loss
140