最新版の Redis 32bit 版を Ubuntu 18.04 LTS で利用する

問題概要

メモリが 4GB のマシンに 64bit OS をインストールして運用している環境があるのですが、redis-server が 64 bit で入るとメモリ食ってスワップしまくりなので 32 bit 版をビルドして利用することにした。
一部のアプリケーションだけ 32bit 版を使いたいといった用途にも応用できると思われるため手順をメモしておきます。

対策

32bit ライブラリのインストール
ubuntu 18.04 LTS には redis-server:i386 パッケージはなかった。せっかくなので最新版のソースを入手してビルドします。
make 32bit というオプションが用意されていますが、32bit 版のライブラリをインストールしておかないとコンパイルが通らず、
libc-header-start.h が無いと怒られますので、あらかじめインストールしておきます。

$ sudo apt install gcc-multilib

依存モジュールのコンパイル

jemalloc.h などが無いと怒られることを防ぐため、先に hiredis jemalloc linenoise lua をビルドしておくのがポイントになります。
redis の Makefile を確認すると gcc のフラグは .make-cflags ファイルが存在する場合に利用されることが判るので -m32 オプションを付与してビルドするようにしておく必要がある点も要注意。
ちなみに、redis v5.0.7 では geohash-int は不要となっています。間違えてしまった場合は、いったん make clean & make distclean してからやり直してみてください。

$ sudo su
# cd /usr/local/src
# wget http://download.redis.io/releases/redis-5.0.7.tar.gz
# tar xzf redis-5.0.7.tar.gz
# cd redis-5.0.7
# cd deps
# echo “-m32” >> .make-cflags
# make hiredis jemalloc linenoise lua
# cd ..
# make 32bit

稼働サービスの検討

64bit 版の redis-server が動作している場合はアンインストールするかサービスとして起動しないように制御します。64bit 版かどうかはバージョン情報の bits= の値から確認できます。

# redis-server -v
Redis server v=4.0.9 sha=00000000:0 malloc=jemalloc-3.6.0 bits=64 build=9435c3c2879311f3

上記手順でビルドした 32bit 版 redis でもバージョン確認をしておきます。

# src/redis-server -v
Redis server v=5.0.7 sha=00000000:0 malloc=jemalloc-5.1.0 bits=32 build=4859b54ade65aac3

64bit 版の redis を停止し自動起動を無効化ておきます。

# systemctl stop redis
# systemctl disable redis

64bit 版の停止が完了したら 32bit 版をインストールし、サービスとしての動作全般を設定しておきます。
redis.conf ファイルは Ubuntu 18.04 のテンプレートを利用します。
複数のインスタンスを作成する場合はポート番号を変更して競合しないようにしておく必要があります。

# make install
# vi /lib/systemd/system/redis-server@.service
ExecStart=/usr/local/bin/redis-server /etc/redis/redis-%i.conf

# cp -p /etc/redis/redis.conf /etc/redis/redis-32bit.conf

編集項目は、port, pidfile, logfile, dbfilename を重複しないようにしておけばひとまずは大丈夫です。

# vi /etc/redis/redis-32bit.conf
port 6379
pidfile /var/run/redis-32bit/redis-server.pid
logfile /var/log/redis/redis-server-32bit.log
dbfilename dump-32bit.rdb

動作確認

コピーしたコンフィグを指定して正常起動するかを確認します。ログが出力先や出力内容、pid やデータベースの作成箇所、パーミッションに問題がないかも合わせて確認しておくと良いです。
動作確認ができたら redis-cli から停止しておきます。また、ログは動作確認したユーザの権限で作成されるのでいったん削除しておきます。

# redis-server /etc/redis/redis-32bit.conf
# less /var/log/redis/redis-server-32bit.log
# redis-cli
127.0.0.1:6379> set foo bar
OK
127.0.0.1:6379> get foo
“bar”
127.0.0.1:6379> quit
# redis-cli shutdown
# rm /var/log/redis/redis-server-32bit.log

サービスとして開始し自動起動するように設定します。

# systemctl start redis-server@32bit.service
# systemctl enable redis-server@32bit.service

ログ出力例

# cat /var/log/redis/redis-server-32bit.log
2593:C 14 Dec 2019 02:06:15.869 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
2593:C 14 Dec 2019 02:06:15.870 # Redis version=5.0.7, bits=32, commit=00000000, modified=0, pid=2593, just started
2593:C 14 Dec 2019 02:06:15.870 # Configuration loaded
2594:M 14 Dec 2019 02:06:15.875 # Warning: 32 bit instance detected but no memory limit set. Setting 3 GB maxmemory limit with ‘noeviction’ policy now.
_._
_.-“__ ”-._
_.-“ `. `_. ”-._ Redis 5.0.7 (00000000/0) 32 bit
.-“ .-“`. “`\/ _.,_ ”-._
( ‘ , .-` | `, ) Running in standalone mode
|`-._`-…-` __…-.“-._|’` _.-‘| Port: 6379
| `-._ `._ / _.-‘ | PID: 2594
`-._ `-._ `-./ _.-‘ _.-‘
|`-._`-._ `-.__.-‘ _.-‘_.-‘|
| `-._`-._ _.-‘_.-‘ | http://redis.io
`-._ `-._`-.__.-‘_.-‘ _.-‘
|`-._`-._ `-.__.-‘ _.-‘_.-‘|
| `-._`-._ _.-‘_.-‘ |
`-._ `-._`-.__.-‘_.-‘ _.-‘
`-._ `-.__.-‘ _.-‘
`-._ _.-‘
`-.__.-‘
2594:M 14 Dec 2019 02:06:15.876 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
2594:M 14 Dec 2019 02:06:15.876 # Server initialized
2594:M 14 Dec 2019 02:06:15.876 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add ‘vm.overcommit_memory = 1’ to /etc/sysctl.conf and then reboot or run the command ‘sysctl vm.overcommit_memory=1’ for this to take effect.
2594:M 14 Dec 2019 02:06:15.876 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command ‘echo never > /sys/kernel/mm/transparent_hugepage/enabled’ as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
2594:M 14 Dec 2019 02:06:15.877 * DB loaded from disk: 0.000 seconds
2594:M 14 Dec 2019 02:06:15.877 * Ready to accept connections

トラブルシューティング

ログに警告が出力されているため対処しておきます。対応が完了したら一度リブートしてからログを確認し警告の出力が解消していればOKです。

  1. Warning: 32 bit instance detected but no memory limit set. Setting 3 GB maxmemory limit with ‘noeviction’ policy now.
  2. WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
  3. WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add ‘vm.overcommit_memory = 1’ to /etc/sysctl.conf and then reboot or run the command ‘sysctl vm.overcommit_memory=1’ for this to take effect.
  4. WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command ‘echo never > /sys/kernel/mm/transparent_hugepage/enabled’ as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.

1 の警告への対応

# vi /etc/redis/redis-32bit.conf
maxmemory 3gb

2 および 3 の警告への対応

# vi /etc/sysctl.d/redis.conf
net.core.somaxconn=511
vm.overcommit_memory=1

4 の警告への対応

# touch /etc/rc.local
# chmod u+x /etc/rc.local
# vi /etc/rc.local

rc.local の内容

#!/bin/sh
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi

参考

Redis 公式

https://redis.io/download#installation

Qiita — 64bit Linuxで32bit ELFをコンパイル

https://qiita.com/mas9612/items/d680a5b4307bafd2d3a0

GeeksforGeeks — How to compile 32-bit program on 64-bit gcc in C and C++

https://www.geeksforgeeks.org/compile-32-bit-program-64-bit-gcc-c-c/

noellabo’s tech blog — Mastodon用にRedisインスタンスを複数立ち上げる

https://noellabo.qrunch.io/entries/vvdHSeL8R6Sb8njz

スポンサーリンク
NO IMAGE

Qubes OS 4.0

AppVM でアプリケーションを利用するためには、TemplateVM にパッケージをインストールする必要があります。Qubes OS 4....

スポンサーリンク