【ITニュース解説】第247回 Docker上のMySQLでjemallocを使用してみる

2025年06月10日に「Gihyo.jp」が公開したITニュース「第247回 Docker上のMySQLでjemallocを使用してみる」について初心者にもわかりやすいように丁寧に解説しています。

作成日: 更新日:

ITニュース概要

Docker上のMySQLでjemallocを使う方法を紹介。jemallocはメモリ管理を効率化するライブラリ。特にメモリ消費が多いMySQLで有効。設定は簡単で、環境変数を指定するだけ。性能改善に繋がり、MySQLの安定稼働に貢献する可能性がある。

ITニュース解説

この記事では、DockerコンテナでMySQLを動かす際に、メモリ管理ライブラリであるjemallocを使用する方法について解説する。jemallocは、従来のメモリ管理ライブラリ(glibcのmallocなど)よりも、特にマルチスレッド環境下での性能が高いことで知られている。データベースのようにメモリを頻繁に確保・解放するアプリケーションでは、jemallocの導入によって性能向上が期待できる。

まず、jemallocの基本的な概念を理解しておこう。メモリ管理ライブラリは、プログラムが要求するメモリ領域をOSから確保し、プログラムに提供する役割を担う。プログラムが不要になったメモリ領域は、ライブラリを通してOSに返却される。この一連の処理を効率的に行うことが、メモリ管理ライブラリの重要な役割となる。jemallocは、メモリ割り当ての際の競合を減らすための工夫や、細かいメモリの断片化を抑制する機能などが盛り込まれており、高負荷な環境下で安定した性能を発揮しやすい。

DockerでMySQLを動かす場合、通常はMySQLの公式イメージを使用することが多い。このイメージは、デフォルトでglibcのmallocを使用している。jemallocを導入するためには、まずDockerfileを作成し、イメージをビルドする必要がある。

Dockerfileでは、ベースとなるMySQLのイメージを指定し、その上にjemallocをインストールする手順を記述する。例えば、UbuntuベースのMySQLイメージを使用する場合、Dockerfileは以下のようになる。

1FROM mysql:latest
2
3RUN apt-get update && apt-get install -y --no-install-recommends libjemalloc-dev
4
5ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2

FROM mysql:latestは、Docker Hubから最新のMySQLイメージをベースとすることを指定している。RUN apt-get updateは、パッケージリストを更新し、apt-get install -y --no-install-recommends libjemalloc-devは、jemallocの開発用パッケージをインストールするコマンドだ。--no-install-recommendsオプションは、推奨パッケージのインストールを抑制し、イメージサイズを小さくする効果がある。

重要なのは、ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2という行だ。LD_PRELOADは、プログラムの起動時に特定の共有ライブラリを優先的にロードするための環境変数だ。ここにjemallocの共有ライブラリのパスを指定することで、MySQLが起動する際にglibcのmallocではなく、jemallocを使用するように設定できる。パスは、環境によって異なる場合があるので、インストール後に確認する必要がある。

Dockerfileを作成したら、docker buildコマンドでイメージをビルドする。

1docker build -t my-mysql .

-t my-mysqlは、作成するイメージにmy-mysqlという名前を付けるオプションだ。.は、Dockerfileがあるディレクトリを指す。

イメージがビルドできたら、docker runコマンドでコンテナを起動する。

1docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=your_password my-mysql

-dは、コンテナをバックグラウンドで実行するオプション、-p 3306:3306は、ホストマシンの3306ポートをコンテナの3306ポートにフォワードするオプション、-e MYSQL_ROOT_PASSWORD=your_passwordは、MySQLのrootユーザーのパスワードを設定するオプションだ。my-mysqlは、先ほどビルドしたイメージの名前だ。

コンテナが起動したら、MySQLに接続して、jemallocが正常に動作しているかを確認する。これには、MySQLクライアントを使用する。

1mysql -u root -p -h 127.0.0.1

パスワードを聞かれるので、MYSQL_ROOT_PASSWORDで設定したパスワードを入力する。

MySQLに接続できたら、以下のコマンドを実行して、jemallocが使用されているかを確認する。

1SHOW GLOBAL STATUS LIKE 'Malloc_library';

このコマンドの結果がjemallocであれば、jemallocが正常に動作していることが確認できる。もし結果がsystemなど、jemalloc以外の場合は、LD_PRELOADの設定などが間違っている可能性があるため、Dockerfileを見直す必要がある。

jemallocの導入は、MySQLの性能を向上させるための有効な手段の一つだが、必ずしも全ての場合に効果があるとは限らない。アプリケーションの特性やワークロードによっては、効果が薄い場合や、逆に性能が低下する場合もある。そのため、導入前に必ず性能テストを行い、効果を検証することが重要だ。性能テストには、sysbenchなどのツールを使用すると良い。sysbenchは、データベースの性能を評価するためのベンチマークツールで、様々なワークロードをシミュレートすることができる。

また、jemallocには、様々な設定オプションがある。これらのオプションを調整することで、より最適な性能を引き出すことができる可能性がある。例えば、jemalloc.background_threadオプションは、バックグラウンドでメモリの整理を行うスレッドの数を制御する。このオプションを調整することで、メモリの断片化を抑制し、性能を向上させることができる場合がある。ただし、設定オプションの調整は、専門的な知識が必要となるため、慎重に行う必要がある。公式ドキュメントなどを参考に、十分に理解した上で調整を行うように心がけよう。