Scheduler and orchestration simulator for Intel's Rack Scale Architecture.
bin/scorsa-sched
: Simulate the execution of a workload; requires a system configuration, a layout, and a workload description.bin/scorsa-plot
: Plot a workload schedule; requires a system configuration, a workload description, a schedule file, and a stats file.bin/swf2workload
: Convert SWF log to scorsa's workload file format.bin/gen-layout
: Generate layout files.bin/test-distance
: Generate distance tables between sockets for a given layout.
data/ricc-1272889970+1d.json
: Sample workload for testing, based on the RICC workload from the Parallel Workloads Archive.
Executing the simulator involves running bin/scorsa-sched
as follows:
./bin/scorsa-sched -c etc/sample-config.ini -w data/ricc-1272889970+1d.json \
-l etc/layout-2r-064.csv
Which ganerates two JSON files in the current directory: schedule.json
and
stats.json
. The former contains the result of the scheduled simulation
itself, while the latter contains additional stats of the system collected
during the execution. These files can be used to visualize the simulation as
follows:
./bin/scorsa-plot -c etc/sample-config.ini -w data/ricc-1272889970+1d.json \
-s schedule.json -t stats.json
A CSV file containing the layout of sockets in the system. Each socket has a
unique integer identifier. Sleds can be denoted as a set of sockets separated
by «+
». Drawers are denoted by rows containing «--
», while racks are
denoted by columns separated by «|
». Empty slots can be identified with a
-1
. E.g.:
00,01,|,06,|,09
--,--,|,--,|,--
02,03,|,07,|,-1
04,05,|,08,|,-1
Generation of layouts can be automated using bin/gen-layout
. A layout of 32
sockets in 2 racks, with 4 drawers per rack, and 2 sockets per sled:
$ ./bin/gen-layout -n 32 -r 2 -d 4 -s 2
00+01,02+03,|,16+17,18+19
-----,-----,|,-----,-----
04+05,06+07,|,20+21,22+23
-----,-----,|,-----,-----
08+09,10+11,|,24+25,26+27
-----,-----,|,-----,-----
12+13,14+15,|,28+29,30+31
A JSON file containing an list of jobs with the following schema:
[
{
"id" : ID,
"arrival" : ARRIVAL,
"tasks" : TASKS,
"mem" : MEM,
"scale" : SCALE,
"color" : COLOR,
"times" : TIME
},
...
]
Where:
- ID is a unique string, which can be an incremental number, e.g.
"1"
. - ARRIVAL is a float in the range between 0.0 and the simulator's maximum
length as defined in the configuration file, e.g.
2.0
. - TASKS is an unsigned integer, e.g.
64
. TASKS represents the number of tasks that the job can execute concurrently. It's used to determine the number of sockets that the job requires (generally one core per task). - MEM is an unsigned integer, e.g.
16
. It stands for the amount of memory that the job requires, in MiB. - SCALE is a string with one of the following values:
"no"
(job doesn't scale),"up"
(job scales-up),"out"
(job scales-out),"both"
(job scales up and out). - COLOR is a color in hex code, e.g.
"#79F1F2"
. - TIME is a the execution times in seconds, e.g
3200.0
.
A JSON file containing a dict indexed by job IDs with the following schema:
{
ID : {
"start" : TIME,
"end" : TIME,
"family" : FAMILY,
"nodes" : NODES,
"reused" : REUSED
},
...
}
Where:
- TIME can be a float in the range between 0.0 and the simulator's maximum
length as defined in the configuration file, e.g. 4.0.
"start"
and"end"
denote the points in time in which a particular job started running and completed its execution, respectively. - FAMILY is a family name as defined by the configuration file, e.g.
xeon-e7-v2
. - NODES is a list of nodes containing the sockets assigned to the job. Each
node is a list of unique socket identifiers. E.g.
[ [SOCKET, SOCKET], [SOCKET, SOCKET], ... ]
. - REUSED is a boolean that is set to
false
when the nodes for the job are created from scracth, andtrue
when the nodes already existed and have been reused.
Jordà Polo <[email protected]>
, 2016.