Skip to content

Instantly share code, notes, and snippets.

@tksst
Last active February 23, 2023 03:33
Show Gist options
  • Save tksst/c4663d510f91a36b6f65f7fa5a0038e5 to your computer and use it in GitHub Desktop.
Save tksst/c4663d510f91a36b6f65f7fa5a0038e5 to your computer and use it in GitHub Desktop.
tmpfsをSSDと同期する

高速化のためにtmpfsを使用しつつ、lsyncdでSSDに常時同期して永続化する仕組みを作った。

概要

システム起動時

以下をsystemdによって行う。

  1. /home/user/fooにtmpfsをマウント
  2. /home/user/foo-staticから/home/user/fooにファイルを同期。
  3. lsyncdを起動。

システム稼働中

/home/user/fooを使用する。lsyncdによって常時/home/user/fooから/home/user/foo-staticに同期される。

システムシャットダウン時

今回はやっていないが、lsyncdの終了後に/home/user/fooから/home/user/foo-staticへの同期をした方が良いかもしれない。

設定

同梱したhome-user-foo-lsyncd.conf/etc/に配置する。なお、設定ファイル中の

delay = 1,

は、ファイル変更後に同期するまでの遅延時間。長くすればまとめて同期するのでI/O効率は良いが、電源断などで失われる変更が多くなる。

また永続化する必要が無いファイルやディレクトリは、excludeで除外しておくと良い。

同梱したhome-user-foo.mounthome-user-foo-init.servicehome-user-foo-lsyncd.conf/etc/systemd/system/に配置し、それぞれenable、startする。

結果

pnpm installの時間を計測してみると、tmpfsでの改善効果はわずか。3.6秒が3.5秒になった程度だった。

そもそもSSDの内容はページキャッシュに貯められる。読み込みは起動後初回を除き、ほとんど全てメモリから行われる。書き込みも遅延書き込みされるので基本的にはSSDへのI/Oがボトルネックになりにくい。

この時間短縮のために、複雑な設定を行い、データロストの危険性を高めるのは割に合わない。

[Unit]
Description=reconstruct tmpfs
Requires=home-user-foo.mount
After=home-user-foo.mount
[Service]
Type=oneshot
ExecStart=rsync -a /home/user/foo-static/ /home/user/foo
[Install]
WantedBy = multi-user.target
sync {
default.rsync,
source = "/home/user/foo",
target = "/home/user/foo-static",
rsync = {
archive = true,
acls = true,
xattrs = true
},
delay = 1,
exclude = { '/.pnpm-store','node_modules' }
}
[Unit]
Description=sync foo
After=home-user-foo-init.service
[Service]
Type=simple
ExecStart=lsyncd -nodaemon /etc/home-user-foo-lsyncd.conf
[Install]
WantedBy = multi-user.target
[Unit]
Description=mount tmpfs
[Mount]
What=tmpfs
Where=/home/user/foo
Type=tmpfs
Options=uid=user,gid=user,mode=0755
[Install]
WantedBy=multi-user.target
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment