blob: 2460d0f93de8f2f75d081ca138fe1fd555836ebd (
plain)
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
|
#!/bin/sh
# HAHAHAH Bro it finally works. It fucking works. It finally fucking works.
# It just needs to monitor IO with iotop and start killing firefox processes
# from the bottom (least memory usage) up. This allows any one tab access to the
# full memory available to Firefox! And integrate it into the your-fired.sh
# script. And it's truly fixed. And integrate the firefox updater.
IO_ROOT_DIR=$HOME/.cache/mozilla/firefox/
[ -d "$IO_ROOT_DIR" ] || exit
get_age()
{
local mtime now
mtime=$(stat --format=%Y "$1") || return
now=$(date +%s) || return
echo $(( now - mtime ))
}
get_filesystem()
{
echo /
}
get_total_memory()
{
free -b | {
read _
read _ total _
echo $total
}
}
math()
{
printf '%s\n' "$*" | bc -lq
}
get_total_io()
{
results=$IO_ROOT_DIR/io.test.result
zeroes=$IO_ROOT_DIR/io.test
if [ -e "$results" ]
then
age=$(get_age "$results") || return
if [ "$age" -gt $((60 * 60 * 24 * 7)) ]
then
rm "$results"
fi
fi
if ! [ -e "$results" ]
then
MEGS=128
then=$(date +%s.%N) || return
dd if=/dev/zero of="$zeroes" bs=${MEGS}M count=1 || return
now=$(date +%s.%N) || return
rm "$zeroes"
speed=$(math $now - $then / $((MEGS * 1024 * 1024))) || return
echo $speed > "$results"
fi
read total < "$results" || return
echo ${total%.*}
}
join_group()
{
GROUP_DIR=/sys/fs/cgroup/firefox~$id
[ -d "$GROUP_DIR" ] || sudo mkdir "$GROUP_DIR"
echo $$ | sudo tee "$GROUP_DIR"/cgroup.procs
}
add_subtree_controller()
{
search="\\b$1\\b"
grep -q "$search" /sys/fs/cgroup/cgroup.controllers || return
grep "$search" /sys/fs/cgroup/cgroup.subtree_control || echo +"$1" | $AS_ROOT tee /sys/fs/cgroup/cgroup.subtree_control
}
set_max()
{
add_subtree_controller "$1"
[ -e "$GROUP_DIR"/"$1".max ] || return
printf '%s\n' "$2" | $AS_ROOT tee "$GROUP_DIR"/"$1".max
}
set_max_ratio()
{
local controller="$1" ratio="$2" limit
total=$(get_total_$controller)
n=${ratio%%/*}
d=${ratio#$n/}
[ "$d" = "${d%/*}" ] || return
limit=$(( total * n / d ))
[ "$limit" ] || return
[ "$limit" -gt 0 ] || return
case "$controller" in
io)
fsroot=$(get_filesystem "$IO_ROOT_DIR") || return
majmin=$(lsblk -o 'MOUNTPOINT,MAJ:MIN' | sed -ne "s?^$fsroot *??p") || return
case "$majmin" in
*:*) ;;
*) return 1 ;;
esac
set_max "$controller" "$majmin wbps=$limit rbps=$limit"
;;
*) set_max "$controller" "$limit"
esac
}
set -ex
[ "$(id -un)" = 0 ] && AS_ROOT= || AS_ROOT='sudo --'
id=$(id -u)
join_group firefox~"$id"
set_max_ratio memory 1/2
set_max_ratio io 9/10
exec firefox "$@"
|