-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbenchmark.sh
More file actions
executable file
·121 lines (98 loc) · 4 KB
/
benchmark.sh
File metadata and controls
executable file
·121 lines (98 loc) · 4 KB
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#!/bin/bash
# ------------------------------------------------------------
# Configuration
# ------------------------------------------------------------
BASE_NAME="javahello"
PACKAGE_PATH="src/main/java/fr/univtln/bruno/demos/docker"
declare -A BUILDS=(
["01.mavenimage"]="mavenimage"
["02.mavenimagestage"]="mavenimagestage"
["03.dockercache"]="dockercache"
["05.manual"]="manual"
["06.jlink"]="jlink"
["06b.jlink-alpine"]="jlink-alpine"
["07.graalVM"]="graalvm"
)
ORDER=(
"01.mavenimage"
"02.mavenimagestage"
"03.dockercache"
"05.manual"
"06.jlink"
"06b.jlink-alpine"
"07.graalVM"
)
echo "Here size means the final image size, while peak RAM is the maximum memory usage observed during runtime."
echo -e "\nBenchmark : Analyse de l'Efficience (Build vs Runtime)\n"
echo "| Image Tag | Build Cold | Build Warm | Build Incr. | Size | Peak RAM |"
echo "|:----------|:-----------|:-----------|:------------|:-----|:---------|"
for KEY in "${ORDER[@]}"; do
TAG=${BUILDS[$KEY]}
DOCKERFILE="Dockerfile.$KEY"
FULL_TAG="$BASE_NAME:$TAG"
[ ! -f "$DOCKERFILE" ] && continue
# --------------------------------------------------------
# 1. COLD BUILD (no cache)
# --------------------------------------------------------
B_START=$(date +%s)
docker build --no-cache -t "$FULL_TAG" -f "$DOCKERFILE" . > /dev/null 2>&1
COLD_TIME="$(( $(date +%s) - B_START ))s"
# --------------------------------------------------------
# 2. WARM BUILD (full cache)
# --------------------------------------------------------
B_START=$(date +%s)
docker build -t "$FULL_TAG" -f "$DOCKERFILE" . > /dev/null 2>&1
WARM_TIME="$(( $(date +%s) - B_START ))s"
# --------------------------------------------------------
# 3. INCREMENTAL BUILD (ServiceLoader – GraalVM aware)
# --------------------------------------------------------
FAKE_CLASS="Fake$(date +%s)"
FAKE_JAVA="$PACKAGE_PATH/$FAKE_CLASS.java"
SPI_DIR="src/main/resources/META-INF/services"
SPI_FILE="$SPI_DIR/fr.univtln.bruno.demos.docker.Marker"
mkdir -p "$SPI_DIR"
cat > "$FAKE_JAVA" <<EOF
package fr.univtln.bruno.demos.docker;
public class $FAKE_CLASS implements Marker {
@Override
public void touch() {
// noop
}
}
EOF
echo "fr.univtln.bruno.demos.docker.$FAKE_CLASS" > "$SPI_FILE"
B_START=$(date +%s)
docker build -t "$FULL_TAG" -f "$DOCKERFILE" . > /dev/null 2>&1
INCR_TIME="$(( $(date +%s) - B_START ))s"
# Nettoyage
rm -f "$FAKE_JAVA" "$SPI_FILE"
# --------------------------------------------------------
# 4. RUNTIME STATS (Peak RAM via cgroups)
# --------------------------------------------------------
SIZE_STR=$(docker image inspect "$FULL_TAG" \
--format '{{.Size}}' 2>/dev/null \
| awk '{printf "%.1fMB", $1/1024/1024}')
# Lancer le container
CID=$(docker run -d "$FULL_TAG")
docker wait "$CID" >/dev/null 2>&1
# Trouver le cgroup du conteneur
CGROUP_PATH=$(docker inspect --format '{{.Id}}' "$CID")
# Peak RAM exact via cgroup v1 ou v2
if [ -f "/sys/fs/cgroup/memory/docker/$CGROUP_PATH/memory.max_usage_in_bytes" ]; then
PEAK_MEM_RAW=$(cat "/sys/fs/cgroup/memory/docker/$CGROUP_PATH/memory.max_usage_in_bytes")
elif [ -f "/sys/fs/cgroup/docker/$CGROUP_PATH/memory.max" ]; then
# cgroup v2
PEAK_MEM_RAW=$(cat "/sys/fs/cgroup/docker/$CGROUP_PATH/memory.max")
else
PEAK_MEM_RAW=0
fi
PEAK_MEM_RAW=$(echo "$PEAK_MEM_RAW/1024/1024" | bc -l)
docker rm -f "$CID" > /dev/null 2>&1
# --------------------------------------------------------
# Affichage Markdown pour Quarto
# --------------------------------------------------------
printf "| %-15s | %10s | %10s | %11s | %8s | %8.2f MB |\n" \
"$TAG" "$COLD_TIME" "$WARM_TIME" "$INCR_TIME" \
"$SIZE_STR" "$PEAK_MEM_RAW"
done
echo -e "\n*Note : Footprint Index = (RAM × 3) + (Size / 10). Plus l'indice est faible, plus l'image est efficiente.*"