Лучшие практики по сохранению профиля Firefox на виртуальном диске
Имея много оперативной памяти, я бы хотел использовать ее для ускорения работы браузера.
Цели:
- Имейте профиль и кеш полностью в памяти, поэтому HDD не используется много во время просмотра и
fsync
не достигают реального жесткого диска или файловых систем. - В фоновом режиме продолжайте обновлять копию профиля жесткого диска, чтобы в случае внезапного отключения не более X минут просмотра было потеряно;
- Сохраняйте резервные копии согласованными (без поврежденных баз данных sqlite и т. Д.)
Т.е. обменять некоторую свободную память и некоторую свежесть сеанса просмотра в случае сбоя на скорость.
Как организовать такую схему?
Моя текущая идея такова:
- Используйте zram для создания виртуального диска;
modprobe zram
; - Создайте на нем том LVM
losetup /dev/zram0 /dev/loop1; pvcreate /dev/loop1; ...; mke2fs -t ext4 -O ^has_journal /dev/mapper/ffvg-ffvol
; - Разместите профиль Firefox на этом томе;
- Периодически (каждые N минут) создайте снимок LVM и сделайте его резервную копию на HDD, затем снимите снимок.
Это (особенно часть LVM) выглядит немного тяжелым для этой задачи. Есть ли лучшие / более устоявшиеся / более простые способы для этого?
1 ответ
Настроил том для Firefox в соответствии с рассматриваемой идеей.
- При загрузке создаются два устройства zram. Содержимое тома HDD копируется на первый. Второй используется в качестве устройства копирования при записи для снимков;
- Каталог профиля Firefox связан с томом, хранящимся в zram0.
- Периодически сценарий (ниже) создает снимок устройства в памяти (используя zram1 в качестве копии при записи), снимок тома жесткого диска и копирует снимок памяти на том жесткого диска.
Каждое обновление занимает около 10 секунд (в случае небольшого количества изменений); полное обновление составляет 40 секунд.
Обновить скрипт:
#!/bin/bash
set -e
SOURCE_DEVICE=/dev/zram0
COW_DEVICE=/dev/zram1
SOURCE_SNAPSHOT_NAME=ffsnap
DESTINATION_VG=cryptie3
DESTINATION_VOL=ff
HASH_FILE=/tmp/ff.md5
MS=$(blockdev --getsize "$SOURCE_DEVICE")
WS=$(blockdev --getsize "$COW_DEVICE")
MN=$(printf '%d:%d' `stat -c '0x%t 0x%T' "$SOURCE_DEVICE"`)
WN=$(printf '%d:%d' `stat -c '0x%t 0x%T' "$COW_DEVICE"`)
dmsetup create $SOURCE_SNAPSHOT_NAME --table "0 $MS snapshot $MN $WN N 8"
trap "dmsetup remove --force --retry $SOURCE_SNAPSHOT_NAME" EXIT
T=$(date "+%s")
lvcreate $DESTINATION_VG/$DESTINATION_VOL --snapshot --name ${DESTINATION_VOL}_$T -L 100M
# You can just use "cat /dev/mapper/$SOURCE_SNAPSHOT_NAME > /dev/mapper/$DESTINATION_VG-$DESTINATION_VOL" here if you don't want to use hashed_update
if [ -e "$HASH_FILE" ]; then
/usr/local/bin/hashed_update /dev/mapper/$SOURCE_SNAPSHOT_NAME "$HASH_FILE" \
/dev/mapper/$DESTINATION_VG-$DESTINATION_VOL "${HASH_FILE}".new 65536
mv "${HASH_FILE}".new "$HASH_FILE"
else
/usr/local/bin/hashed_update /dev/mapper/$SOURCE_SNAPSHOT_NAME NULL \
/dev/mapper/$DESTINATION_VG-$DESTINATION_VOL "$HASH_FILE" 65536
fi
lvremove --force ${DESTINATION_VG}/${DESTINATION_VOL}_$T
hashed_update находится здесь: https://github.com/vi/hashed_update
Некоторое обновление: 1. Не стоит монтировать SOURCE_DEVICE
хоть snapshot-origin
не напрямую; 2. Теперь я использую ручное управление снимками назначения с постоянной зоной CoW, используя dmsetup
вместо повторного создания / удаления.
Все еще искал идеи, как улучшить его или найти устоявшиеся решения, которые мне не удалось найти.