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で指定したスレッドであると推定できる。
※本記事内容の無断転載を禁じます。
ご連絡は以下アドレスまでお願いします★
さくらインターネットでPython MecabをCGIから使う
さくらインターネットのPHPでAnalytics-G4 APIを使う
インクルードパスの調べ方
【Git】特定ファイルを除外する.gitignore
【Ubuntu/Debian】NVIDIA関係のドライバを自動アップデートさせない
【Python】Spacyを使用して文章から出発地と目的地を抜き出す
HomeBrewでApache2を入れて自動起動つきで動かしPHPモジュールと連携する
macOSに標準付属のApacheを自動起動つきで動かす
HomeBrewでPostgreSQLを入れて自動起動つきで動かす
Windows版Google Driveが使用中と言われアンインストールできない場合
【C/C++】小数点以下の切り捨て・切り上げ・四捨五入
進研ゼミチャレンジタッチをAndroid端末化する
Windows11+WSL2でUbuntuを使う【2】ブリッジ接続+固定IPの設定
Googleスプレッドシートで図形をコピーして使いまわすには
【Linux】iconv/libiconvをソースコードからインストール
【Apache】サーバーに同時接続可能なクライアント数を調整する
Pythonで処理にかかった時間を計測するには
Windows11のコマンドプロンプトでテキストをコピーする