-
Notifications
You must be signed in to change notification settings - Fork 275
Expand file tree
/
Copy pathinit-client.sh
More file actions
168 lines (132 loc) · 4.82 KB
/
init-client.sh
File metadata and controls
168 lines (132 loc) · 4.82 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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#!/usr/bin/env bash
set -euo pipefail
# Set timestamp format
PS4='[\D{%Y-%m-%d %H:%M:%S}] '
# Enable command tracing
set -x
# Add cache disk for orchestrator and swapfile
MOUNT_POINT="/orchestrator"
# Step 2: Create the mount point
sudo mkdir -p $MOUNT_POINT
sudo mkdir -p /orchestrator/sandbox
sudo mkdir -p /orchestrator/template
sudo mkdir -p /orchestrator/build
# Add swapfile
SWAPFILE="/swapfile"
sudo fallocate -l 1G $SWAPFILE
sudo chmod 600 $SWAPFILE
sudo mkswap $SWAPFILE
sudo swapon $SWAPFILE
# Make swapfile persistent
echo "$SWAPFILE none swap sw 0 0" | sudo tee -a /etc/fstab
# Set swap settings
sudo sysctl vm.swappiness=10
sudo sysctl vm.vfs_cache_pressure=50
# Add tmpfs for snapshotting
# TODO: Parametrize this
sudo mkdir -p /mnt/snapshot-cache
sudo mount -t tmpfs -o size=65G tmpfs /mnt/snapshot-cache
ulimit -n 1048576
export GOMAXPROCS='nproc'
sudo tee -a /etc/sysctl.conf <<EOF
# Increase the maximum number of socket connections
net.core.somaxconn = 65535
# Increase the maximum number of backlogged connections
net.core.netdev_max_backlog = 65535
# Increase maximum number of TCP sockets
net.ipv4.tcp_max_syn_backlog = 65535
# Increase the maximum number of memory map areas
vm.max_map_count=1048576
EOF
sudo sysctl -p
echo "Disabling inotify for NBD devices"
# https://lore.kernel.org/lkml/20220422054224.19527-1-matthew.ruffell@canonical.com/
cat <<EOH >/etc/udev/rules.d/97-nbd-device.rules
# Disable inotify watching of change events for NBD devices
ACTION=="add|change", KERNEL=="nbd*", OPTIONS:="nowatch"
EOH
sudo udevadm control --reload-rules
sudo udevadm trigger
# Load the nbd module with 4096 devices
sudo modprobe nbd nbds_max=4096
# Create the directory for the fc mounts
mkdir -p /fc-vm
# Download envd buckets
envd_dir="/fc-envd"
mkdir -p $envd_dir
cp packages/envd/bin/envd "${envd_dir}/."
chmod -R 755 $envd_dir
ls -lh $envd_dir
du -h "${envd_dir}/envd"
# Download kernels
kernels_dir="/fc-kernels"
mkdir -p $kernels_dir
gsutil -m cp -r gs://e2b-prod-public-builds/kernels/* "${kernels_dir}"
chmod -R 755 $kernels_dir
ls -lh $kernels_dir
# Download FC versions
fc_versions_dir="/fc-versions"
mkdir -p $fc_versions_dir
gsutil -m cp -r gs://e2b-prod-public-builds/firecrackers/* "${fc_versions_dir}"
chmod -R 755 $fc_versions_dir
ls -lh $fc_versions_dir
# Set up huge pages
# We are not enabling Transparent Huge Pages for now, as they are not swappable and may result in slowdowns + we are not using swap right now.
# The THP are by default set to madvise
# We are allocating the hugepages at the start when the memory is not fragmented yet
echo "[Setting up huge pages]"
sudo mkdir -p /mnt/hugepages
mount -t hugetlbfs none /mnt/hugepages
# Increase proactive compaction to reduce memory fragmentation for using overcomitted huge pages
available_ram=$(grep MemTotal /proc/meminfo | awk '{print $2}') # in KiB
available_ram=$(($available_ram / 1024)) # in MiB
echo "- Total memory: $available_ram MiB"
min_normal_ram=$((4 * 1024)) # 4 GiB
min_normal_percentage_ram=$(($available_ram * 16 / 100)) # 16% of the total memory
max_normal_ram=$((42 * 1024)) # 42 GiB
max() {
if (($1 > $2)); then
echo "$1"
else
echo "$2"
fi
}
min() {
if (($1 < $2)); then
echo "$1"
else
echo "$2"
fi
}
ensure_even() {
if (($1 % 2 == 0)); then
echo "$1"
else
echo $(($1 - 1))
fi
}
remove_decimal() {
echo "$(echo $1 | sed 's/\..*//')"
}
reserved_normal_ram=$(max $min_normal_ram $min_normal_percentage_ram)
reserved_normal_ram=$(min $reserved_normal_ram $max_normal_ram)
echo "- Reserved RAM: $reserved_normal_ram MiB"
# The huge pages RAM should still be usable for normal pages in most cases.
hugepages_ram=$(($available_ram - $reserved_normal_ram))
hugepages_ram=$(remove_decimal $hugepages_ram)
hugepages_ram=$(ensure_even $hugepages_ram)
echo "- RAM for hugepages: $hugepages_ram MiB"
hugepage_size_in_mib=2
echo "- Huge page size: $hugepage_size_in_mib MiB"
hugepages=$(($hugepages_ram / $hugepage_size_in_mib))
# This percentage will be permanently allocated for huge pages and in monitoring it will be shown as used.
base_hugepages_percentage=20
base_hugepages=$(($hugepages * $base_hugepages_percentage / 100))
base_hugepages=$(remove_decimal $base_hugepages)
echo "- Allocating $base_hugepages huge pages ($base_hugepages_percentage%) for base usage"
echo $base_hugepages >/proc/sys/vm/nr_hugepages
overcommitment_hugepages_percentage=$((100 - $base_hugepages_percentage))
overcommitment_hugepages=$(($hugepages * $overcommitment_hugepages_percentage / 100))
overcommitment_hugepages=$(remove_decimal $overcommitment_hugepages)
echo "- Allocating $overcommitment_hugepages huge pages ($overcommitment_hugepages_percentage%) for overcommitment"
echo $overcommitment_hugepages >/proc/sys/vm/nr_overcommit_hugepages