Documents
Misskeyコンテナにおけるメモリアロケータの切り替え: jemallocからmimallocへ
Misskeyコンテナにおけるメモリアロケータの切り替え: jemallocからmimallocへ
Type
Document
Status
Published
Created
Feb 11, 2026
Updated
Feb 11, 2026
Updated by
Dosu Bot

Misskey コンテナにおけるメモリアロケータの切り替え: jemalloc から mimalloc へ#

概要#

本ドキュメントでは、Misskey プロジェクトにおけるコンテナメモリアロケーションの jemalloc から mimalloc への移行について、環境変数の設定、プリロード設定、ランタイム環境の変更、およびコンテナの起動とパフォーマンスへの影響を網羅的に説明する。

メモリアロケータの移行#

jemalloc から mimalloc への切り替え#

2025 年 11 月 28 日にマージされたPR #1159により、jemalloc から mimalloc への切り替えが実装された。この変更は Misskey エコシステム全体に展開された:

実装の詳細#

切り替えはDockerfile の変更により実装された:

パッケージの変更:

  • 削除: libjemalloc-dev および libjemalloc2
  • 追加: libmimalloc-dev および libmimalloc2.0

シンボリックリンクの作成:

RUN apt-get update \
	&& apt-get install -y --no-install-recommends \
	curl ffmpeg libmimalloc-dev libmimalloc2.0 tini \
	&& ln -s /usr/lib/$(uname -m)-linux-gnu/libmimalloc.so.2 /usr/local/lib/libmimalloc.so

環境変数の設定#

LD_PRELOAD#

LD_PRELOAD 環境変数は、mimalloc をプリロードするために設定される:

ENV LD_PRELOAD=/usr/local/lib/libmimalloc.so

この環境変数により、ダイナミックリンカは実行時に他のライブラリよりも先に mimalloc をロードする。これにより、システムのデフォルト malloc 実装が mimalloc に置き換えられ、すべてのメモリアロケーション操作が mimalloc を経由するようになる。

MIMALLOC_LARGE_OS_PAGES#

MIMALLOC_LARGE_OS_PAGES 環境変数は、ラージページアロケーションを制御する:

ENV MIMALLOC_LARGE_OS_PAGES=0

この値を0に設定することで、OS のラージページアロケーションを無効化し、Misskey の特定のワークロード特性に合わせたメモリ動作の最適化を実現している。

歴史的背景#

以前、Misskey はjemalloc と MALLOC_CONF 環境変数を使用してメモリ管理を設定していた。CHANGELOG.mdには、Docker 環境でのメモリ使用量削減のために jemalloc が使用されていたことが記録されている。

ランタイム環境の変更#

非特権ユーザーでの実行#

Dockerfile では非 root ユーザーを作成し、UID/GID を設定可能にしている:

ARG UID="991"
ARG GID="991"

RUN groupadd -g "${GID}" misskey \
	&& useradd -l -u "${UID}" -g "${GID}" -m -d /misskey misskey

コンテナは起動前にこのユーザーに切り替わる:

USER misskey

この非特権実行により、セキュリティ脆弱性の潜在的な影響を制限し、コンテナセキュリティを向上させる。

ワーキングディレクトリの設定#

WORKDIR ディレクティブは明示的に設定されている:

WORKDIR /misskey

これはすべてのビルドステージ (native-builder、target-builder、runner) で一貫しており、予測可能な実行環境を提供する。

ファイル所有権の調整#

すべてのアプリケーションファイルは、--chownフラグを使用して適切な所有権でコピーされる:

COPY --chown=misskey:misskey --from=target-builder /misskey/node_modules ./node_modules
COPY --chown=misskey:misskey --from=native-builder /misskey/built ./built

これにより、すべてのアプリケーションファイルがコンテナに追加された時点から misskey ユーザーによって所有されることが保証される。

セキュリティ強化#

Dockerfile には、setuid/setgid ビットを削除するセキュリティ強化処理が含まれている:

&& find / -type d -path /sys -prune -o -type d -path /proc -prune -o -type f -perm /u+s -ignore_readdir_race -exec chmod u-s {} \; \
&& find / -type d -path /sys -prune -o -type d -path /proc -prune -o -type f -perm /g+s -ignore_readdir_race -exec chmod g-s {} \;

コンテナ起動とパフォーマンスへの影響#

コンテナ起動プロセス#

コンテナはinit システムとして tini を使用する:

ENTRYPOINT ["/usr/bin/tini", "--"]
CMD ["pnpm", "run", "migrateandstart:docker"]

起動プロセスでは、データベースマイグレーションを実行した後、startコマンドによってアプリケーションが起動される。このコマンドはMK_NODE_ARGS環境変数を介して Node.js 引数の受け渡しを可能にする。

期待されるパフォーマンス上の利点#

mimalloc への切り替えは、以下の利点を活用することを目的としている:

  • パフォーマンス: mimalloc は高性能、低レイテンシ、最小限のメモリオーバーヘッドで知られている
  • フラグメンテーション削減: より効率的なメモリアロケーションによりフラグメンテーションが減少する
  • 安定性の向上: 特に高並行性シナリオにおいてアプリケーションの安定性が向上する
  • 高速なアロケーションサイクル: メモリの確保と解放操作が高速化される可能性がある

LD_PRELOAD メカニズム#

LD_PRELOAD アプローチは、アプリケーションコードの変更を必要とせずにメモリアロケータを透過的に置き換える。ダイナミックリンカはアプリケーション起動前に mimalloc をロードし、すべての malloc/free 呼び出しは自動的にシステムデフォルトではなく mimalloc を経由するようになる。

エコシステム全体での採用#

メモリアロケータの切り替えは、2025 年 11 月 28 日に Misskey エコシステム全体で同時に実装された。これは戦略的な協調的意思決定を示している:

すべてのサービスが同じメモリアロケーション戦略を使用し、環境変数設定も統一されている。

その他の環境変数#

本番環境で設定されているその他の環境変数:

Misskeyコンテナにおけるメモリアロケータの切り替え: jemallocからmimallocへ | Dosu