执行application:start(tsung_controller)时:
{start_phases, [{load_config, []},{start_os_monitoring,[{timeout,30000}]},
{start_clients,[]}]}
{mod, {tsung_controller, []}}
应用启动相关
ts_config_server相关::
global
-record(state, {
config,
logdir, % 日志文件目录
curcfg = 0, % number of configured launchers
client_static_users = 0, % number of clients that already have their static users
static_users = 0, % static users not yet given to a client
ports, % dict, used if we need to choose the client port
users=1, % userid (incremental counter)
start_date, %
hostname, % controller的hostname
last_beam_id = 0, % last tsung beam id (used to set nodenames)
ending_beams = 0, % number of beams with no new users to start
lastips, % store next ip to choose for each client host
total_weight % total weight of client machines
}
ts_mon::
global
-record(state, {
log, % 日志文件的fd
backend, % type of backend: text|...
log_dir, %
fullstats, % fullstats fd
dump_interval,% 从配置文件中取值:10000
dumpfile, % file used when dumptrafic is set light or full
client=0, % number of clients currently running
maxclient=0, % max of simultaneous clients
stats, % 下面的record:Stats
stop = false, % true if we should stop
laststats, % 下面的record:Stats
lastdate, % 时间
type, % type of logging (none, light, full)
launchers=0, % number of launchers started
timer_ref, % timer reference (for dumpstats)
wait_gui=false% wait gui before stopping
}).
-record(stats, {
users_count = 0,
finish_users_count = 0,
os_mon, % dict:new():[Mean, Var, Max, Min, Count, MeanFB,CountFB,Last]
session = []
}).
ts_stats_mon::
global
% connect,page,request
-record(state, {
log, % log fd
backend, % type of backend: text|rrdtool|fullstats
dump_interval,% 从配置文件中取值:10000
type = connect,page,request
fullstats, % fullstats fd
stats, % [0,0,0,0,0,0,0,0]:
laststats % values of last printed stats
}).
% [id]
-record(state, {
log, % log fd
backend, % type of backend: text|rrdtool|fullstats
dump_interval,% 从配置文件中取值:10000
type = ts_stats_mon,
fullstats, % fullstats fd
stats, % 字典:dict:new()
laststats % values of last printed stats
}).
ts_match_logger:
global
-record(state, {
filename, % "mach.log"
level, % type of backend: text|rrdtool|fullstats
dumpid=1, % current dump id
logdir,
fd % "mach.log"的fd
}).
ts_os_mon_sup:
local,监控专用,【参数】monitor
ts_os_mon_erlang
ts_os_mon_munin
ts_os_mon_snmp
ts_os_mon_erlang:
% monitor在同一机器上
#state{node=node(),mon=MonServer, host=Host, interval=Interval, options=Options}
% 不在同一机器
#state{host=Host, mon=MonServer, interval=Interval, options=Options}
ts_timer:
global,fsm
-record(state, {
nclient = 0, % number of unacked clients
maxclients = 0, % total number of clients to ack
pidlist = [],
timeout=3600000
}).
ts_msg_server:
global
-record(state, {number=0}).
ts_user_server_sup:
simple_one_for_one
ts_user_server:
-record(state, {
offline, %ets table
last_offline,
connected, %ets table
last_connected,
online, %ets table
last_online,
first_client, % id (integer)
random_server_id, % file_server id for random users
offline_server_id, % file_server id for initial offline users
delimiter = << ";" >>, % delimiter for file_server id username
userid_max % max number of ids (starts at 1)
}).
ts_job_notify:
ts_interaction_server:
#state{
to=ets:new(to, []),
notify=ets:new(notify, [bag])
}
start_phases相关{load_config, []}
作用:
1.读tsung.xml文件
设定ts_config_server的status的
config:
-record(config, {
name,
duration, % 超时时间,单位秒.超时会往ts_config_server发送end_tsung的timeout消息
loglevel = ?WARN, % 【xml】loglevel
dump = none, % 【xml】dumptraffic:
"false" -> none;
"true" -> full;
"light" -> light;
"protocol" -> protocol;
"protocol_local" -> protocol_local
stats_backend, % 【xml】backend:text
controller, % controller machine
clients = [], % [{client,"localhost",10.0,200000,
[{10,140,2,245},
{10,140,2,244},
{10,140,2,241},
{10,140,2,5}],
undefined}]
servers = [], % [#server{host = Server,
port = Port,
weight= Weight,
type = Type
}|ServerList]
% [{server,"idc-iot-pr-server-2",443,ts_tcp,10}],
ports_range, % client ports range
monitor_hosts = [], % [{"idc-iot-pr-server-4",{erlang,[]}}],
arrivalphases = [], % [{arrivalphase,1,6000000,undefined,0.001,infinity,6000,[],
false,1}],
thinktime, % default thinktime specs
subst = false, % Substitution should be applied on the request
match, % Match regexp in response
dynvar = [],
main_sess_type , % main type of session
sessions = [], % [{session,1,100,ts_http,"http-example",true,false,10000,
{proto_opts,negotiate,negotiate,"/http-bind/",false,
false,false,"/chat","binary",[],10,3,
600000,infinity,infinity,32768,32768,
32768,32768,[],true,true},
undefined,10,undefined,undefined,undefined,undefined,
undefined}]
static_users=[],
session_tab, % 表:ets:new(sessiontable, [ordered_set, protected]),
use_controller_vm = false, % if true, start the first launcher in the
% same vm as the controller if possible
curthink, % temporary var (current request think)
curid = 0, % temporary var (current request id (can be transaction))
cur_req_id = 0, % temporary var (current real request id)
file_server = [], % filenames for file_server
load_loop, % loop phases if > 0
hibernate = 10000, % hibernate timeout (millisec) 10sec by default
proto_opts, % tcp/udp buffer sizes,参见后面的proto_opts
seed = now, % random seed: (default= current time)
vhost_file = none, % file server user for virtual host jabber testing
user_server_maxuid = none, % user_id max
oids=[], % [{OID,Name,Type,Fun}| OIDS]
rate_limit,
total_popularity = 0, % should be 100 if we use probabilites; sum of all weights if we use weights
use_weights , % true if we use weights instead of probabilities
total_server_weights=0, % 总weights
job_notify_port,
max_ssh_startup = 20,
tag
}).
-record(proto_opts,
{ssl_ciphers = negotiate, % for ssl only
ssl_versions = negotiate, % for ssl only
bosh_path = "/http-bind/", % for bash only
tcp_reuseaddr = false, % for tcp reuseaddr
tcp_reuseport = false, % for tcp reuseport
ip_transparent = false, % set IP_TRANSPARENT option on the socket
websocket_path = "/chat", % for websocket only
websocket_frame = "binary", % for websocket only
websocket_subprotocols = [], % for websocket only
retry_timeout = 10, % retry sending in milliseconds
max_retries = 3, % maximum number of retries
idle_timeout = 600000, % timeout for local ack
connect_timeout = infinity, % timeout for gen_tcp:connect/4 (infinity OR time in milliseconds)
global_ack_timeout = infinity, % timeout for global ack
tcp_rcv_size = 32768, % tcp buffers size
tcp_snd_size = 32768,
udp_rcv_size = 32768, % udp buffers size
udp_snd_size = 32768,
certificate = [], % for ssl
reuse_sessions = true, % for ssl
is_first_connect = true % whether it's the first connection
}).
start_phases相关{start_os_monitoring,[{timeout,30000}]}
ts_os_mon_sup启动子
启动monitor,把要监控的server中的cpu,内存,load等信息
start_phases相关{start_clients,[]}]}
ts_mon启动子
加载tsung,并启动
% ts_launcher_static:
gen_fsm:send_event({?MODULE, Node}, {launch, Sessions, atom_to_list(Host)}).
% ts_launcher:
gen_fsm:send_event({?MODULE, Node}, {launch, Arrivals, atom_to_list(Host), Seed}).