ファイルのリダイレクト方法
systemdでコマンドを実行し、ファイルにリダイレクトしても、ファイルに実行結果は記載されない。
ファイルにリダイレクトするための方法は、/bin/bash -c 'コマンド > ファイル'
のように、コマンドの実行とリダイレクトを全部シェルの-c
オプションに渡してしまうこと。
MongoDBでの具体例
kernelパラメータに関するWARNING
MongoDB 4.0を起動して接続すると以下の通りtransparent_hugepage
についてのWARNINGがでるので、その対策をしながら、上記解決方法を実際に試してみる。
2019-03-12T11:45:05.423+0900 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2019-03-12T11:45:05.423+0900 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2019-03-12T11:45:05.423+0900 I CONTROL [initandlisten]
2019-03-12T11:45:05.423+0900 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2019-03-12T11:45:05.423+0900 I CONTROL [initandlisten] ** We suggest setting it to 'never'
ドキュメントではtransparent_hugepageをneverにする専用のinitスクリプトを作成しているが、今回はMongoDBのsystemdの設定ファイルに埋め込む形で実装する。
MongoDBのsystemd設定ファイル
yumでinstallすると以下の設定ファイルが配置される。
$ cat /usr/lib/systemd/system/mongod.service
[Unit]
Description=MongoDB Database Server
After=network.target
Documentation=https://docs.mongodb.org/manual
[Service]
User=mongod
Group=mongod
Environment="OPTIONS=-f /etc/mongod.conf"
EnvironmentFile=-/etc/sysconfig/mongod
ExecStart=/usr/bin/mongod $OPTIONS
ExecStartPre=/usr/bin/mkdir -p /var/run/mongodb
ExecStartPre=/usr/bin/chown mongod:mongod /var/run/mongodb
ExecStartPre=/usr/bin/chmod 0755 /var/run/mongodb
PermissionsStartOnly=true
PIDFile=/var/run/mongodb/mongod.pid
Type=forking
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false
# Recommended limits for for mongod as specified in
# http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings
[Install]
WantedBy=multi-user.target
systemd追加設定ファイル
ExecStartPre
でMongoDBの起動前にkernelパラメータ(transparent_hugepage)を変更したい。
追加設定ファイルを自分で配置する。
$ sudo mkdir /etc/systemd/system/mongod.service.d/
$ cat << 'EOF' | sudo tee /etc/systemd/system/mongod.service.d/kernel.conf
[Service]
ExecStartPre=/bin/bash -c '/usr/bin/echo never > /sys/kernel/mm/transparent_hugepage/enabled'
ExecStartPre=/bin/bash -c '/usr/bin/echo never > /sys/kernel/mm/transparent_hugepage/defrag'
EOF
ここで以下のように書くと、kernelパラメータは変更されない。
ExecStartPre=/usr/bin/echo never > /sys/kernel/mm/transparent_hugepage/enabled
ExecStartPre=/usr/bin/echo never > /sys/kernel/mm/transparent_hugepage/defrag
systemctl daemon-reload
してからsystemctl cat mongod
すると、既存の設定ファイルに追加設定が加わったことが確認できる。
実際にsystemctl start mongod
すると、その前後でkernelパラメータが変わったことが確認でき、MongoDBのエラーもでなくなる。
$ cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
$ cat /sys/kernel/mm/transparent_hugepage/defrag
[always] madvise never
$ sudo systemctl start mongod
$ cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
$ cat /sys/kernel/mm/transparent_hugepage/defrag
always madvise [never]