アプリケーション開発ポータルサイト
ServerNote.NET
カテゴリー【RedisDebian
【Redisメモ・7】Redis6.0.6をソースからインストールしてTHREADED I/Oを試す
POSTED BY
2023-08-02

2020/5にRedis6が登場して、まだrpmパッケージには反映されていないので、ソースからインストールすることにする。
※注 RDBファイルが5と6に互換性は無く、データは全ては作り直しになるので注意
既存パッケージ版redis関係をすべて削除してソース版を入れなおすメモですので、利用は自己責任でお願いします

1、既存パッケージ版redis-serverの終了

/etc/init.d/redis-server stop

2、既存パッケージ版rdbファイルの退避

互換性が無いのでもう5に戻らないなら削除だが一応退避

cd /var/lib/redis
mv dump.rdb /home/hogeuser/dump.redis5.rdb

3、既存パッケージ版redis-serverと付随パッケージの全削除※自己責任注意

dpkg -l | grep redis
apt --purge remove redis-server
apt --purge autoremove
dpkg -l | grep redis

4、redisデータディレクトリ・グループ・ユーザー作成

sudo -s
mkdir /var/lib/redis
# /etc/redisが無い場合
mkdir /etc/redis
groupadd redis
useradd -d /var/lib/redis -s /usr/sbin/nologin -M -g redis redis
chown redis:redis /var/lib/redis /etc/redis

5、ソースコードダウンロード・コンパイル・インストール

wget http://download.redis.io/releases/redis-6.0.6.tar.gz
tar xvfzp redis-6.0.6.tar.gz
cd redis-6.0.6
make
sudo make install # /usr/localにインストールされる
# C言語Lib hiredisのインストール
cd deps/hiredis
make
sudo make install # /usr/localにインストールされる

6、redis.confの設置

デフォルトコンフィグはredis-6.0.6/redis.confにある。ポート6379で使用するので6379.confとする。

sudo -s
cp redis-6.0.6/redis.conf /etc/redis/6379.conf
cp /etc/redis/6379.conf /etc/redis/redis.conf.default
chown -Rh redis:redis /etc/redis

当サイトでは、以下のようにconfigを変更した。

unixsocket /var/lib/redis/redis_6379.sock
unixsocketperm 777
daemonize yes
supervised no
pidfile /var/lib/redis/redis_6379.pid
syslog-enabled yes
syslog-ident redis
syslog-facility local0
always-show-logo no
dir /var/lib/redis
maxmemory 2gb
maxmemory-policy noeviction
io-threads 3
io-threads-do-reads yes

新機能 THREADED I/O について

configをGoogle翻訳にかけてみたところ、以下のように説明されています。

デフォルトではスレッド化は無効になっています。マシンでのみ有効にすることをお勧めします
少なくとも4つ以上のコアがあり、少なくとも1つのスペアコアが残っている。
8を超えるスレッドを使用しても、あまり効果がありません。また、
スレッドI / Oは、Redisを使用して実際にパフォーマンスの問題がある場合のみ
かなりの割合のCPU時間を使用できるインスタンス、それ以外の場合
この機能を使用しても意味がありません。
たとえば、4つのコアボックスがある場合、2つまたは3つのI / Oを使用してみます
スレッド、8コアの場合、6スレッドを使用してみます。のために
I / Oスレッドを有効にするには、次の構成ディレクティブを使用します。
io-threads 4
io-threadsを1に設定すると、通常どおりメインスレッドのみが使用されます。
I / Oスレッドが有効な場合、書き込みにのみスレッドを使用します。
write(2)syscallをスレッド化し、クライアントバッファーを
ソケット。ただし、読み取りのスレッド化を有効にして、
次の設定ディレクティブを使用したプロトコル解析、設定
はいそれ:
io-threads-do-reads no
通常、読み取りのスレッド化はあまり役に立ちません。

とありますので、当サイトマシンのCPUコアは4つあるので、
io-threads 3
としマルチスレッドを有効に、かつ意味ないと言われつつも
io-threads-do-reads yes
として読み込み時のマルチスレッドも試してみることにしました。

7、スタートアップファイルの作成とsystemdへの登録

/lib/systemd/system/redis-server.serviceの作成

ソースにサンプルで入っているのを使うとsystemctl startでコンソールに戻らなかったので、rpmパッケージで自動インストールされていたものを参考に以下のようにした。

[Unit]
Description=Advanced key-value store
After=network.target
Documentation=http://redis.io/documentation, man:redis-server(1)

[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /etc/redis/6379.conf
ExecStop=/bin/kill -s TERM $MAINPID
TimeoutStopSec=0
Restart=always
User=redis
Group=redis

UMask=007
PrivateTmp=yes
LimitNOFILE=65535
PrivateDevices=yes
ProtectHome=yes
ReadOnlyDirectories=/
ReadWriteDirectories=-/var/lib/redis

NoNewPrivileges=true
CapabilityBoundingSet=CAP_SETGID CAP_SETUID CAP_SYS_RESOURCE
MemoryDenyWriteExecute=true
ProtectKernelModules=true
ProtectKernelTunables=true
ProtectControlGroups=true
RestrictRealtime=true
RestrictNamespaces=true
RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX

# redis-server can write to its own config file when in cluster mode so we
# permit writing there by default. If you are not using this feature, it is
# recommended that you replace the following lines with "ProtectSystem=full".
ProtectSystem=true
ReadWriteDirectories=-/etc/redis

[Install]
WantedBy=multi-user.target
Alias=redis.service

8、起動

systemctl daemon-reload

systemctl start redis-server

systemctl status redis-server

cat /var/log/syslog

Jul  6 10:49:27 debian systemd[1]: Starting Advanced key-value store...
Jul  6 10:49:27 debian redis-server: oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
Jul  6 10:49:27 debian redis-server: Redis version=6.0.6, bits=64, commit=00000000, modified=0, pid=5787, just started
Jul  6 10:49:27 debian redis-server: Configuration loaded
Jul  6 10:49:27 debian systemd[1]: Started Advanced key-value store.
Jul  6 10:49:27 debian redis[5788]: Running mode=standalone, port=6379.
Jul  6 10:49:27 debian redis[5788]: WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
Jul  6 10:49:27 debian redis[5788]: Server initialized
Jul  6 10:49:27 debian redis[5788]: 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.
Jul  6 10:49:27 debian redis[5788]: 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.
Jul  6 10:49:27 debian redis[5788]: Ready to accept connections
Jul  6 10:49:27 debian redis[5788]: The server is now ready to accept connections at /var/lib/redis/redis_6379.sock

一応ちゃんと起動はしている模様。終了する場合

systemctl stop redis-server

Jul  6 10:51:54 debian systemd[1]: Stopping Advanced key-value store...
Jul  6 10:51:54 debian redis[5788]: User requested shutdown...
Jul  6 10:51:54 debian redis[5788]: Saving the final RDB snapshot before exiting.
Jul  6 10:51:54 debian redis[5788]: DB saved on disk
Jul  6 10:51:54 debian redis[5788]: Removing the pid file.
Jul  6 10:51:54 debian redis[5788]: Removing the unix socket file.
Jul  6 10:51:54 debian redis[5788]: Redis is now ready to exit, bye bye...
Jul  6 10:51:54 debian systemd[1]: redis-server.service: Succeeded.
Jul  6 10:51:54 debian systemd[1]: Stopped Advanced key-value store.

9、自動起動登録

systemctl enable redis-server
Created symlink /etc/systemd/system/multi-user.target.wants/redis-server.service → /lib/systemd/system/redis-server.service.

10、マルチスレッド起動の確認

さきほど
io-threads 3
としたので、redis-server本体含め3つのスレッドが居るはずなので確認。

ps aux | grep redis-server
redis      858  0.1  0.2  68428 10144 ?        Ssl  13:40   0:00 /usr/local/bin/redis-server 127.0.0.1:6379

プロセス番号858であることが分かったので、これをtopにHオプションつきで指定すればよい。

top -H -p 858

top - 13:47:41 up 15 min,  1 user,  load average: 0.00, 0.00, 0.00
Threads:   7 total,   0 running,   7 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.1 us,  0.1 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   3439.3 total,   3074.3 free,    181.3 used,    183.7 buff/cache
MiB Swap:   3521.0 total,   3521.0 free,      0.0 used.   3033.3 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
  858 redis     20   0   68428  10144   3684 S   0.3   0.3   0:00.61 redis-server
  859 redis     20   0   68428  10144   3684 S   0.0   0.3   0:00.00 bio_close_file
  860 redis     20   0   68428  10144   3684 S   0.0   0.3   0:00.00 bio_aof_fsync
  861 redis     20   0   68428  10144   3684 S   0.0   0.3   0:00.00 bio_lazy_free
  862 redis     20   0   68428  10144   3684 S   0.0   0.3   0:00.00 io_thd_1
  863 redis     20   0   68428  10144   3684 S   0.0   0.3   0:00.00 io_thd_2
  864 redis     20   0   68428  10144   3684 S   0.0   0.3   0:00.00 jemalloc_bg_thd

io_thd_1、io_thd_2、これがio-threadで指定したスレッドであると推定できる。

※本記事は当サイト管理人の個人的な備忘録です。本記事の参照又は付随ソースコード利用後にいかなる損害が発生しても当サイト及び管理人は一切責任を負いません。
※本記事内容の無断転載を禁じます。
【WEBMASTER/管理人】
自営業プログラマーです。お仕事ください!
ご連絡は以下アドレスまでお願いします★

【キーワード検索】