-
Notifications
You must be signed in to change notification settings - Fork 723
/
membench.nix
99 lines (91 loc) · 3.71 KB
/
membench.nix
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
{ runCommand, cardano-node, jq, snapshot, vmTools, strace, util-linux, e2fsprogs, gnugrep, procps, time }:
let
params = builtins.fromJSON (builtins.readFile ./membench_params.json);
topology = { Producers = []; };
flags = params.rtsFlags;
topologyPath = builtins.toFile "topology.json" (builtins.toJSON topology);
passMem = (builtins.fromJSON (builtins.readFile ./pass.json)).memSize;
failMem = (builtins.fromJSON (builtins.readFile ./fail.json)).memSize;
avgMem = (passMem+failMem) / 2;
membench = vmTools.runInLinuxVM (runCommand "membench" {
memSize = if (params.memSize == "auto") then avgMem else params.memSize;
buildInputs = [ cardano-node jq strace util-linux e2fsprogs procps time ];
succeedOnFailure = true;
preVM = ''
truncate disk.img --size 2G
export diskImage=$(realpath disk.img)
'';
failureHook = ''
pwd
ls -ltrh
'';
postVM = ''
echo postvm
pwd
ls -ltrh xchg/
mv -vi xchg/*.json $out/ || true
cd $out
${gnugrep}/bin/egrep 'ReplayFromSnapshot|ReplayedBlock|will terminate|Ringing the node shutdown|TookSnapshot|cardano.node.resources' log.json > $out/summary.json
'';
} ''
echo 0 > /tmp/xchg/in-vm-exit
mkdir -pv $out/nix-support
echo 42 > $out/nix-support/failed
# never overcommit
echo 2 > /proc/sys/vm/overcommit_memory
pwd
free -m
mkfs.ext4 /dev/vda
mkdir /state
mount /dev/vda /state
cp -r ${snapshot}/chain /state/chain
chmod -R +w /state/chain
cd /tmp/xchg
ls -ltrh /state/chain
jq '.setupScribes = [
.setupScribes[0] * { "scFormat":"ScJson" },
{
scFormat:"ScJson",
scKind:"FileSK",
scName:"log.json",
scRotation:{
rpLogLimitBytes: 300000000,
rpMaxAgeHours: 24,
rpKeepFilesNum: 20
}
}
]
| .defaultScribes = .defaultScribes + [ [ "FileSK", "log.json" ] ]
' ${./configuration/cardano/mainnet-config.json} > config.json
cp -v ${./configuration/cardano}/*-genesis.json .
command time -f %M -o $out/highwater cardano-node ${flags} run --database-path /state/chain/ --config config.json --topology ${topologyPath} --shutdown-on-slot-synced 2000
#sleep 600
#kill -int $!
pwd
df -h
free -m
ls -ltrh /state/chain/ledger/
mv -vi log*json config.json $out/
mv /state/chain $out/
rm $out/nix-support/failed
'');
in
runCommand "membench-post-process" {
buildInputs = [ jq ];
} ''
cp -r ${membench} $out
chmod -R +w $out
cd $out
# so the node wont get GC'd, and you could confirm the source it came from
ln -s ${cardano-node}/bin/cardano-node .
totaltime=$({ head -n1 log.json ; tail -n1 log.json;} | jq --slurp 'def katip_timestamp_to_iso8601: .[:-4] + "Z" | fromdateiso8601; map(.at | katip_timestamp_to_iso8601) | .[1] - .[0]')
highwater=$(cat ${membench}/highwater)
if [ -f ${membench}/nix-support/failed ]; then
export FAILED=true
mkdir $out/nix-support -p
cp ${membench}/nix-support/failed $out/nix-support/failed
else
export FAILED=false
fi
jq --slurp < summary.json 'def minavgmax: length as $len | { min: (min/1024/1024), avg: ((add / $len)/1024/1024), max: (max/1024/1024) }; map(select(.ns[0] == "cardano.node.resources") | .data) | { RSS: map(.RSS) | minavgmax, Heap: map(.Heap) | minavgmax, CentiCpuMax: map(.CentiCpu) | max, CentiMutMax: map(.CentiMut) | max, CentiGC: map(.CentiGC) | max, CentiBlkIO: map(.CentiBlkIO) | max, flags: "${flags}", chain: { startSlot: ${toString snapshot.snapshotSlot}, stopFile: ${toString snapshot.finalEpoch} }, totaltime:'$totaltime', failed:'$FAILED', memSize: ${toString membench.memSize}, highwaterMB: '$highwater'/1024 }' > refined.json
''