ファイルのリダイレクト方法

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]